我希望能够使用蓝色对象框来委托对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中的内容?
编辑编辑
所以我有我的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
中有一个断点,它绝对不会被调用。
想法?
答案 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。与你在帖子中展示的方式相同的东西。