0

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

这是我到目前为止创建的内容:

  • 代表实例的类。
  • 一个 NSMutableArray 指定为我的应用程序委托的属性以保存类实例。
  • 一个主细节视图,带有一个 NSTable 和一些文本字段来保存选择实例的属性。
  • 具有指定应用程序委托的绑定的 NSArrayController,以及作为模型键路径的 NSMutableArray 属性的名称。
  • NSTable 和 NSArrayController 的列之间的绑定(控制器键 = "arrangedObjects",每列的模型键路径 = 类的一个属性)。
  • 视图的文本字段和选择之间的绑定(控制器键 = “选择”,每个文本字段的模型键路径 = 类的属性)。
  • 视图中的“+”按钮和“-”按钮可用于添加和删除对象。

但是,这种设计有两个问题:

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

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

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

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

4

1 回答 1

1

这是一个应该接近您想要的示例:

#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 是控制器)将其内容数组绑定到数据。成员是我的类的名称,它具有 3 个字符串属性、名称、作者和简介。在详细视图中,2 个文本字段绑定到 ArrayController.selection.name 或作者,就像您说的那样。另一个属性 blurb 以相同的方式绑定 (ArrayController.selection.blurb),但绑定到文本视图的 Attributed String 值。这很好用,我不确定你的文本视图有什么问题。如果我将文本添加到文本视图,如果我单击母表中的另一行然后单击返回,它确实会显示在那里(如果我记录数组,它也会显示在那里)。

于 2012-08-05T02:27:49.790 回答