无法弄清楚如何进行这种可可绑定

时间:2011-12-11 18:00:35

标签: objective-c xcode cocoa cocoa-bindings

我是一名.net开发人员,正在尝试学习如何在mac上进行可可编程。我遇到了一个我似乎无法弄清楚或找到答案的问题。

我创建了以下类:

  • ITObject - NSObject的子类
  • ITPlayer - ITObject的子类
  • ITEnemy - ITObject的子类

在我的MainMenu.xib文件中,我有一个包含以下控件的窗口:

  • NSArrayController - 链接到App Delegate(itObjects)
  • NSTableView - 链接到NSArrayController(arrangeObjects)
  • NSTextBox - 链接到相同的NSArrayController(selection.player)

itObjects是一个NSMutableArray,用于包含任何ITObject类。 NSArrayController设置为使用ITObject作为类。当我向itObjects属性添加ITPlayer时,文本框不会读取播放器属性。

播放器属性是ITPlayer独有的。如果播放器属性不属于该类,我想在文本框中显示“N/A”,如果它在那里,我希望绑定显示该值。现在,它什么也没做。

有关对象的更多信息:

项目的代码如下所示:

@interface ITObject:NSObject <NSCoding>{ 
     int initiativeRoll, initiativeBonus, initiativeKicker;
}
@property int initiativeRoll, initiativeBonus, initiativeKicker;
@property (readonly) int initiativeTotal, initiativeCalc;
@end

这是ITObject的头文件(显然)。 ITEnemy和ITPlayer就是这样设置的(仅限目前为止)。

@interface ITPLayer:ITOjbect <NSCoding>{
     NSString *player;
}
@property (copy) NSString *player;
@end

ITPlayer的init方法在实现文件中设置如下:

- (void)init{
     self = [super init]
     if (self){
          player = @"undefined";
     }
     return self;
}

还有一个initWithCoder:方法,但我还没有使用过,所以我不认为这是可疑的。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

我通常不建议对新的Cocoa开发人员进行绑定,绝对不是复杂的绑定。不幸的是,当绑定错误配置时,绑定会出现“无所事事”的情况。即使对于经验丰富的开发人员来说,这也很难调试。在处理与NSUserDefaults绑定的大页面配置选项时,绑定工作得非常好,但是构建复杂的UI会很困难。

那方面,你的设置似乎很奇怪。 MainMenu.xib的所有者应该几乎总是NSApplication。您应该将新的NSArrayController拖到XIB上并按照您的描述将其连接起来,而不是将其作为文件所有者。

我希望您在日志中看到异常。可能“NSArrayController不响应选择器setDelegate:”等。如果你看到这个,那是因为默认的MainMenu nib文件被配置为将应用程序委托连接到文件所有者。


首先,只需引用Apple docs中的一句话来强调关于绑定的观点:

  

使用Cocoa绑定填充基于视图的表视图被认为是一个高级主题。虽然它需要的代码要少得多(在某些情况下根本没有代码),但如果您不熟悉接口,很难看到绑定。在您继续使用Cocoa绑定之前,严格建议您熟悉使用基于视图的表视图的技术。

我喜欢本节中的“严厉”一词。经过多年的开发,无论有没有绑定,我都倾向于避免使用它们,除非在最简单的情况下(如偏好面板,它们非常有用)。

如果没有绑定,您将按照Populating View-Based Table Views Programmatically中的说明操作。基本上,您将实现numberOfRowsInTableView:和(假设10.7+)tableView:viewForTableColumn:row:。对于每个行和列,您将返回包含所需数据的视图。这取决于iOS的做事方式,非常好,非常灵活。

如果您需要10.7之前的版本,那么事情会稍微复杂一些,但仍然比绑定更直接。见Populating Cell-Based Table Views。这使用NSCell而不是NSView。如果你只需要一个显示类似字符串数据的简单表格,那就不难了。只需实施numberOfRowsInTableView:tableView:objectValueForTableColumn:row:即可。后者应该返回一些可以被强制转换成字符串的东西。

如果您需要10.7之前的自定义NSCell,请使用文档自行尝试,然后您可能会发布一些新问题。