我是一名.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:方法,但我还没有使用过,所以我不认为这是可疑的。
非常感谢你的帮助!
答案 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
,请使用文档自行尝试,然后您可能会发布一些新问题。