Objective c 我的第一个Cocoa master详细应用程序:绑定困难

Objective c 我的第一个Cocoa master详细应用程序:绑定困难,objective-c,cocoa,nstableview,cocoa-bindings,nsarraycontroller,Objective C,Cocoa,Nstableview,Cocoa Bindings,Nsarraycontroller,我正在用Cocoa编写我的第一个主细节视图。我的数据模型非常简单:只是一个NSMutableArray,它包含一个具有几个NSStrings属性的类的实例 以下是我迄今为止创造的: 表示实例的类 指定为my app委托的属性以保存类实例的NSMutableArray 主详细视图,带有一个NSTable和一些文本字段,用于保存选择实例的属性 NSArrayController,其绑定指定应用程序委托,并将NSMutableArray属性的名称作为模型密钥路径 NSTable列和NSArrayCo

我正在用Cocoa编写我的第一个主细节视图。我的数据模型非常简单:只是一个NSMutableArray,它包含一个具有几个NSStrings属性的类的实例

以下是我迄今为止创造的:

  • 表示实例的类
  • 指定为my app委托的属性以保存类实例的NSMutableArray
  • 主详细视图,带有一个NSTable和一些文本字段,用于保存选择实例的属性
  • NSArrayController,其绑定指定应用程序委托,并将NSMutableArray属性的名称作为模型密钥路径
  • NSTable列和NSArrayController列之间的绑定(controller key=“arrangedObjects”,每个列的模型键路径=类的一个属性)
  • 视图的文本字段和选择之间的绑定(controller key=“selection”,每个文本字段的模型键路径=类的属性)
  • 视图中的“+”按钮和“-”按钮可用于添加和删除对象
但是,这种设计有两个问题:

(1) 我找不到实现“+”和“-”按钮的好方法。首先,我将它们绑定到数组控制器的add:和remove:属性。虽然这似乎可行,但它有一个问题:我的类声明了一个init成员,该成员将NSStrings初始化为存根值,但数组控制器似乎没有[init]新实例,因为新列表项的每一列都有空字符串

接下来,我将它们附加到我的应用程序委托中的iActions,该委托在NSMutableArray中添加或删除了一个对象。然而,这感觉是错误的——我不与阵列控制器对话,这感觉违反了模型-视图-控制器体系结构。例如,“-”函数必须与阵列控制器对话才能获取所选项。另外,我注意到在更改数组后,我必须发送一条[didChangeValueForKey]消息,这感觉像是一个信号,表明我做错了

(2) “我的视图”中的一个详图子视图是绑定到选定对象中NSString的NSTextView。它确实没有按预期工作:当输入新文本时,即使选择了类的其他成员(应该具有不同的值),文本仍然保持不变。此外,文本数据不会保存到类的任何实例中


有什么想法吗?提前感谢。

以下是一个与您所需内容相近的示例:

#import "AppDelegate.h"
#import "Members.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.theData = [NSMutableArray arrayWithObject:[[Members alloc] init]];
}

-(IBAction)addMember:(id)sender {
    [self.controller addObject:[[Members alloc] init]];
}

-(IBAction)removeMember:(id)sender {
    [self.controller removeObjectAtArrangedObjectIndex:self.controller.selectionIndex];
}
数组控制器(其IBOutlet为controller)将其内容数组绑定到数据。Members是我的类的名称,它有3个字符串属性:name、author和blurb。在详细视图中,2个文本字段绑定到ArrayController.selection.name或author,就像您所说的那样。另一个属性blurb以相同的方式绑定(ArrayController.selection.blurb),但绑定到文本视图的属性字符串值。这很好,我不确定你的文本视图有什么问题。如果我将文本添加到文本视图中,如果我单击mater表中的另一行,然后单击back(如果我记录了数组,它也会显示在那里),它确实会显示在那里