2

我创建了一个NSWindow xib文件,我想在另一个窗口中单击按钮打开它。接口生成器中的NSWindowController对象链接

现在,为了控制NSWindow的行为,我将xib中的一个对象从库中拖出来,并将其更改为我在XCode中定义的NSWindowController(即ListingWindowController)的子类。

同样我也创建了NSViewController的子类(即ListingViewController)来管理NSWindow内部的NSView。为此,我将xView中的NSViewController从库中拖出来,并将其类更改为ListingViewController。

@class ListingViewController; 

@interface ListingWindowController : NSWindowController { 
    IBOutlet ListingViewController *listingVC; 
} 

@property (nonatomic, retain) IBOutlet ListingViewController *listingVC; 
@end 

我连接窗口和我的窗口控制器列表VC在IB。

我们调用一个按钮的点击该窗口在我推出(第一)窗口中,我创建一个使用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]; 
    } 
} 

的问题是,尽管所有的绑定完成在即将到来的窗口/视图的视图控制器的IB中,即使在新窗口已经加载(下面的代码)之后,窗口和列表VC出现为(null),(null)。

- (void)windowDidLoad { 
    [super windowDidLoad]; 

NSLog(@"windowDidLoad = %@, %@", self.window, self.listingVC); 
} 

请大家帮忙,为什么连接不上的工作。我现在对这个问题已经有一段时间了。 PS:我来自iOS编程背景。所以,我假设Mac的窗口/视图控制器的行为与iOS UIViewControllers类似。

TIA ..

回答

11

需要注意的是:

wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self]; 

意味着self(目前还不清楚是什么self是从你的问题)是ListingWindow.nib所有者。这意味着self是在该nib文件中保留对象的插座,并且self负责释放nib文件中的顶级对象。这也意味着您将在您的代码中创建ListingWindowController的实例,并在您的笔尖文件中创建另一个实例,因为您已将类ListingWindowController的对象拖到nib文件上。

这不是它应该如此。

在绝大多数情况下,窗口(视图)控制器加载一个nib文件并成为它的所有者。它有一个windowview)插座,它必须链接到nib文件中的顶级窗口(视图)。作为nib文件的所有者,它必须在加载nib文件之前创建。

为了实现这个窗口控制器,你需要设置文件的所有者类为ListingWindowController。您不得拖动对象立方体并实例化nib文件内的窗口控制器。窗口控制器是nib文件的所有者,因此在加载nib文件之前它必须存在。您还必须将文件所有者中的window插座链接到nib文件中的顶层窗口对象,以便窗口控制器知道它应该管理的窗口。

已经这样做了,使用方法:代替

wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow"]; 

wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self]; 

因为wc应该是笔尖文件的所有者。

视图控制器的工作方式类似。它们在加载nib文件之前创建,负责将包含视图的nib文件作为顶级对象加载,是该nib文件的所有者,并且必须链接到该顶层视图。

从您的问题中看不清楚您是否有单独的视图文件。如果你不这样做,那么根本不需要使用NSViewController的子类 - 你可以使用NSObject的子类来代替。如果您坚持使用NSViewController来管理未从单独的nib文件加载的视图,那么您应该覆盖-loadView,以便通过某种方式引用视图,而不是从nib文件加载视图,然后将其发送到-setView:它知道它应该管理的观点。

推荐阅读:Nib Files in the Resource Programming Guide,NSWindowController class reference,NSViewController class reference