gpt4 book ai didi

objective-c - 将大纲 View 的数据源委托(delegate)给单独的对象

转载 作者:行者123 更新时间:2023-12-03 17:23:52 25 4
gpt4 key购买 nike

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

我遇到的问题是我无法控制 channel 数据源。我只是调用一个声明的方法,其中包含一些测试 NSLog,但它不会被调用。 socket 未实例化。

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

enter image description here

这是我的主 Controller 的文件所有者的连接。

enter image description here

所以你看,我想做一些类似 [dataSource callMyMethod]; 的事情,最终目标是我可以控制 NSOutlineView 的内容。

有什么想法吗?

编辑

该应用程序的结构使我的主要应用程序委托(delegate)如下所示:

@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;
}

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

编辑编辑

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

编辑编辑编辑

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

- (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
}

以及 Controller 的声明:

@interface MyController : NSWindowController

其中包含以下方法声明:

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

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

想法?

最佳答案

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

在应用程序委托(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。一切都按照您在帖子中显示的方式连接起来。

关于objective-c - 将大纲 View 的数据源委托(delegate)给单独的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12395926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com