委托大纲视图的数据源分离对象

时间:2012-09-12 20:42:41

标签: objective-c cocoa

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

我遇到的问题是我无法控制频道数据源。我只是调用一个声明的方法,其中包含一些测试NSLog,并且它不会被调用。插座没有实例化。

这是蓝色对象框(ChannelDataSource)

的连接

enter image description here

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

enter image description here

所以你看,我想做[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中的内容?

编辑编辑

所以我有我的app委托,奇怪的是一个类本身就是实例化主控制器。不要问我为什么这么做,这是很早的代码。所以我的app委托(root入口点)有这个:

- (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中有一个断点,它绝对不会被调用。

想法?

1 个答案:

答案 0 :(得分:0)

还有一些你没有澄清的事情,但我可以做一些猜测。首先,我假设MainController是NSWindowController的子类。如果是这样,你应该使用initWithWindowNibName:而不仅仅是init,否则当你对showWindow进行处理时,控制器将如何知道要显示的窗口:其次,即使你这样做,并将你的init方法更改为initWithWindowNibNamed:,你的写入将无法正常工作,因为init在过程中还为时过早,无法查看你的插件,数据源。如果您只是记录dataSource,它将出现null。放置该代码的更好的地方是windowDidLoad,因为那时所有内容都已设置(这将在showWindow之后调用:)。所以,在我的小测试项目中,这就是我所做的。

在app delegate中:

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

在Controller.M中我有这个:

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

在IB中,在Window.xib文件中,我将文件所有者的类设置为Controller,将蓝色多维数据集的类设置为ChannelDataSource。与你在帖子中展示的方式相同的东西。