【问题标题】:My first Cocoa master-detail application: Binding difficulties我的第一个 Cocoa 主从应用程序:绑定困难
【发布时间】:2012-08-05 01:04:45
【问题描述】:

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

这是我目前创建的:

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

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

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

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

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

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

【问题讨论】:

    标签: objective-c cocoa nstableview cocoa-bindings nsarraycontroller


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多