Ash*_*hok 2 cocoa binding interface-builder nsviewcontroller nswindowcontroller
我创建了一个NSWindow xib文件,我想在另一个窗口中点击按钮打开它.
现在,为了控制NSWindow的行为,我从xib中的Library拖动了一个对象,并将其更改为我在XCode中定义的NSWindowController(即ListingWindowController)的子类.
类似地,我还创建了一个NSViewController的子类(即ListingViewController)来管理NSWindow中的NSView.为此,我在xib中从库中拖动NSViewController,并将其类更改为ListingViewController.
@class ListingViewController;
@interface ListingWindowController : NSWindowController {
IBOutlet ListingViewController *listingVC;
}
@property (nonatomic, retain) IBOutlet ListingViewController *listingVC;
@end
Run Code Online (Sandbox Code Playgroud)
我在IB中连接窗口和我的窗口控制器的列表VC.
现在,在我的启动(第一个)窗口中单击按钮调用此窗口,我使用initWithWindowNibName创建窗口控制器,就像这样.
- (IBAction) pushConnect:(id)sender {
NSLog(@"Connect pushed.");
if (wc == nil) {
wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeWindow:) name:NSWindowWillCloseNotification object:nil];
[wc showWindow:sender];
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于,尽管在IB中为即将到来的窗口/视图的视图控制器完成了所有绑定,但即使在加载新窗口(代码下方)之后,窗口和listingVC也会出现(null),(null).
- (void)windowDidLoad {
[super windowDidLoad];
NSLog(@"windowDidLoad = %@, %@", self.window, self.listingVC);
}
Run Code Online (Sandbox Code Playgroud)
请帮助为什么连接不起作用.我正在敲打这个问题已经有一段时间了.
PS:我来自iOS编程背景.所以,我假设Mac的窗口/视图控制器的行为类似于iOS UIViewControllers.
TIA ..
小智 11
注意:
wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self];
Run Code Online (Sandbox Code Playgroud)
意味着self(不清楚self你的问题是什么)是所有者ListingWindow.nib.这意味着self是那个在该nib文件中保持对象出口的人,并self负责释放nib文件中的顶级对象.这也意味着您要ListingWindowController在代码中创建一个实例,并在您的nib文件中创建另一个实例,因为您已经将类的对象ListingWindowController拖到了nib文件中.
这不是它应该如何.
在绝大多数情况下,窗口(视图)控制器加载nib文件并成为其所有者.它有一个window(view)出口,必须链接到nib文件中的顶级窗口(视图).作为nib文件的所有者,它必须在加载nib文件之前创建.
为了实现窗口控制器的这一功能,您需要将文件的所有者类设置为ListingWindowController.您不能拖动对象多维数据集并在nib文件中实例化窗口控制器.窗口控制器是nib文件的所有者,因此它必须在加载nib文件之前存在.您还必须将window文件所有者中的插座链接到nib文件中的顶级窗口对象,以便窗口控制器知道它应该管理哪个窗口.
完成后,使用:
wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow"];
Run Code Online (Sandbox Code Playgroud)
代替:
wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self];
Run Code Online (Sandbox Code Playgroud)
因为wc应该是nib文件的所有者.
视图控制器工作方式类 它们是在加载nib文件之前创建的,负责加载包含视图作为顶级对象的nib文件,是nib文件的所有者,并且有一个view必须链接到该顶级视图的插座.
从您的问题中不清楚是否有一个单独的nib文件用于视图.如果不这样做,那么NSViewController根本不需要使用子类 - 您可以使用NSObject替代的子类.如果您坚持使用NSViewController来管理未从单独的nib文件加载的视图,那么您应该重写,-loadView以便通过某种方式获得对视图的引用,而不是从nib文件加载它,并发送它-setView:以便它是意识到应该管理的观点.
推荐阅读:资源编程指南中的Nib文件,NSWindowController类参考,NSViewController类参考.
| 归档时间: |
|
| 查看次数: |
5752 次 |
| 最近记录: |