2011-12-11 33 views
2

我是一个.NET开发人员,正在努力学习如何在Mac上做可可编程。我遇到了一个我似乎无法弄清楚或找到答案的问题。无法弄清楚如何做到这一点可可绑定

我创建了以下类:

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

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

  • NSArrayController - 链接到应用程序代表(itObjects)
  • NSTableView - 链接到NSArrayController的(arrangedObjects)
  • NSTextBox - 链接到相同的NSArrayController的(selection.player)

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

播放器属性是ITPlayer独有的。如果玩家属性不属于该类,我想在文本框中显示“N/A”,如果它存在,我希望绑定显示该值。现在,它什么也没做。这是针对ITObject(显然)头文件

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

:在对象上

的更多信息:

的代码的项目看起来是这样的。 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

你的描述很好。建议您包含代码,以便帮助您进行调试。 –

+0

确实没有太多的代码要显示。大多数ITObject都有几个属性,而ITPlayer和ITEnemy还有其他几个属性。我会认为这更多的是因为我对可可绑定缺乏了解......我不知道该如何发布,哈哈。 –

回答

3

我通常不建议绑定,而且绝对不是复杂的绑定,以新的可可开发人员。绑定具有不幸的情况,即当它们的配置错误最小时,它会趋向于“无所事事”。这使得他们很难调试,即使对于有经验的开发人员也是如此在处理与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,请使用文档自行尝试,然后您可能会发布一些新问题。

+0

你是对的,它没有绑定到文件的所有者,而是链接到AppDelegate类的'App Delegate'对象。你能指点我的方向来学习如何处理这个,而不使用绑定呢? 谢谢。 –

+2

+1用于避免绑定新开发人员。当绑定是全新的(10.3?)时,我开始了OS X的开发,它以简单的方式诱惑着我,但正如你所说的那样,有一点复杂性,一切都停止了,作为一个新开发者,你无处可去(没有SO那些日子!) – jrturton

+0

我在我的文章中进行了更正,以显示NSArrayController链接到我的.xib文件中的App Delegate对象。一切正常,除了我不能绑定到子类属性,因为我有NSArrayController使用超类(ITOBject)。 如果任何人可以指向我的教程或文章,或者可以描述另一种方法来做我想做的事,我会非常感激。 –