1

我希望能够使用蓝色对象框来委派对 NSOutlineView 的控制。蓝色对象框将连接到我的主控制器,因此它只是一个数据源并控制 NSOutlineView 的内容。

我遇到的问题是我无法控制通道数据源。我只是调用了一个声明的方法,里面有一些测试 NSLog,它没有被调用。出口没有被实例化。

这是蓝色对象框(ChannelDataSource)的连接

在此处输入图像描述

这是我的主控制器的文件所有者的连接。

在此处输入图像描述

所以你看,我想做一些事情[dataSource callMyMethod];,最终目标是我可以控制NSOutlineView.

有任何想法吗?

编辑

该应用程序的结构使我的主要应用程序委托看起来像这样:

@implementation MyAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    controller = [[MainController alloc] init];
    [controller showWindow];
}

@end

然后在MainController我有以下几点:

@implementation MainController

-(id)init {
    self = [super init];
    if (self) {
        // loads of random stuff

        [dataSource myMethod];
    }

    return self;
}

所以“通道数据源”蓝色对象框是dataSource. 在应用程序生命周期的这一点上,它是 null,这不是我所期望的。同时,这对我来说还是有点黑魔法。如果你有一个蓝色的对象框,它在什么时候被实例化?显然,这并没有正确连接。

编辑编辑

进一步我上面的观点,并试图解决这个问题,这实际上是一个好方法吗?我认为它不符合一个像样的 MVC 架构,因为最终蓝色对象框的拥有类是存储和管理数据。有没有更好的方法来管理 NSOutlineView 中的内容?

编辑 编辑 编辑

所以我有我的应用程序委托,奇怪的是,它本身就是一个实例化主控制器的类。不要问我为什么这样做,这是非常早期的代码。所以我的应用程序委托(根入口点)有这个:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    controller = [[MyController alloc] initWithWindowNibName:@"MainWindow"];
    [controller showWindow:nil]; // this doesn't open the window
    [controller loadWindow]; // this does open the window
}

以及控制器的声明:

@interface MyController : NSWindowController

其中包含以下方法声明:

-(void)windowDidLoad {
    [dataSource insertChannel:@"test" forServer:@"test2"];
}

我有一个断点windowDidLoad,它肯定不会被调用。

想法?

4

1 回答 1

0

还有一些事情你没有澄清,但我可以做一些猜测。首先,我假设 MainController 是 NSWindowController 的子类。如果是这样,您应该使用 initWithWindowNibName: 而不是只使用 init,否则控制器如何知道当您将 showWindow: 寻址到它时要显示哪个窗口?其次,即使您这样做,并将您的 init 方法更改为 initWithWindowNibNamed:,您所写的内容也不会起作用,因为 init 在此过程中太早了,无法看到您的出口、数据源。如果您只记录 dataSource 它将出现空值。放置该代码的更好位置是在 windowDidLoad 中,因为那时一切都已设置好(这将在 showWindow 之后调用:)。所以,在我的小测试项目中,这就是我所做的。

在应用委托中:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.cont = [[Controller alloc] initWithWindowNibName:@"Window"];
    [self.cont showWindow:nil];
}

在 Controller.MI 中有这个:

- (void)windowDidLoad {
    NSLog(@"%@",self.dataSource);
    [self.dataSource testMethod];
}

在 IB 中,在 Window.xib 文件中,我将文件所有者的类设置为 Controller,将蓝色立方体的类设置为 ChannelDataSource。一切都与您在帖子中显示的方式相同。

于 2012-09-13T15:51:24.260 回答