NSArrayController的arrangeObjects看错了类

时间:2013-10-02 03:46:55

标签: objective-c xcode macos nstableview cocoa-bindings

我正在尝试创建一个基于视图的NSTableView,通过Cocoa绑定填充。

我的NSArrayController指向应用程序委托的jobs属性的currentUser数组属性,如下所示:

binding 1

我希望该数组中的每个模型都属于HSJob类:

binding 2

但是,一旦我将我的表视图绑定到NSArrayController,它的arrangedObjects属性由于某种原因认为它属于类HSJob(我期待NSArray)。

binding 3

显然,这不允许我将单个单元格内容链接到Job对象属性,并且我无法在表格视图中显示任何内容:

binding 4

那我在这里做错了什么?

更新

我甚至决定实施一些手动值更新通知+将所有内容移动到AppDelegate中,只是为了进行实验。在这里,我为一些NSDictionaries改变了我自己的HSJob课程。

AppDelegate.h

@property NSArray *things;

AppDelegate.m

@synthesize things = _things;

- (NSArray *)things {
    if (!_things)
        return @[@{@"name": @"Default Thing"}];
    else
        return _things;
}

- (void)setThings:(NSArray *)things {
    [self willChangeValueForKey:@"things"];
    _things = things;
    [self didChangeValueForKey:@"things"];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    [self setThings:@[@{@"name": @"Actual Thing"}]];

}

只显示“默认事件”。即使我在应用程序启动后立即为things属性设置了一个新值,该数组也永远不会显示。

2 个答案:

答案 0 :(得分:1)

你“做错了”是在MainMenu.xib以外的XIB中创建一个app委托对象,然后假设它是[NSApp委托]。你实际得到的是你的app委托类的一个完全独立的对象,它有自己的属性,只是为了那个xib。因此,附加到您的XIB的对象永远不会运行applicationDidFinish启动,因为它不是您的应用程序的委托。

我建议通过修改app委托类的init来实现解决方案: https://stackoverflow.com/a/22873562/3120884

MainMenu.xib因为具有App Delegate对象而失败,因为作为Info.plist中指定的NSMainNib,它在NSApplicationMain中得到特殊处理,它将Interface Builder对象连接到[NSApp委托]。

答案 1 :(得分:0)

我设法通过将NSArrayController绑定到Application而不是手动创建的AppDelegate对象来解决此问题。因此,Model Key Path现在是:

self.delegate.currentUser.jobs

显然,这并没有被Xcode自动完成,它仍然抱怨无法解决路径,但无论如何都可行。

我在Xib中的AppDelegate对象不起作用的原因仍然是个谜,但它可能与所讨论的Xib不是默认的MainMenu.xib这一事实有关,但是自定义NSPanel连接到控制器。