最简单的Cocoa绑定示例

时间:2016-08-10 17:14:46

标签: objective-c xcode cocoa cocoa-bindings

我试图对Cocoa Bindings有一个基本的了解,我想创建一个非常简单的项目。我有一个班级Person,其类型name的变量NSString。以下是我希望工作的方式:

  1. 用户在文本字段中输入名称,然后按"更新名称"按钮
  2. 文本字段中的字符串将保存到Person类的实例。
  3. 绑定到Person Controller(绑定到Person类)的标签会根据name实例的Person变量自动更改其值。
  4. 我花了好几个小时阅读各种教程和Apple Mac开发者库,但每个例子都只展示了如何让Cocoa Bindings与表一起工作。当我尝试开发更简单的东西时,我觉得我完全迷失了。我创建了一个基础项目,剩下的唯一事情就是创建所有绑定。我很乐意为我提供所有的联系,希望能给我一个解释。 https://www.dropbox.com/sh/6hddfxyitqp6uoc/AACgaRhKBhLo6EXCVN9W6GQua?dl=0 该项目是一个基于文档的应用程序,因为我将来会开发这种类型的应用程序。

1 个答案:

答案 0 :(得分:6)

为什么你的项目不起作用有几个原因让我们重新开始并创建最简单的Cocoa绑定示例。

  1. 创建一个新的Xcode项目,选择Cocoa Application并且不要检查"使用故事板","创建基于文档的应用程序"或"使用核心数据"。
  2. 选择MainMenu.xib,选择窗口并添加文本字段和标签。
  3. 将对象控制器添加到xib。切换Prepares Content
  4. 将文本字段绑定到对象控制器:将Value绑定到Object Controller,将控制台键selection和模型关键路径name绑定。
  5. 将标签绑定到对象控制器:将Value绑定到Object Controller,将控制台键selection和模型关键路径name绑定。
  6. 构建,运行,测试。输入一些文字并点击Return。
  7. 控制器会自动创建NSMutableDictionary的实例,该实例符合每个键的KVO要求。更改文本字段的内容后,文本字段的绑定将调用setValue:@"New Contents" forKey:@"name"。这将通知Label的绑定,并更新Label。

    为什么你的项目不起作用:

    • 在xib中,对象控制器的内容连接到文档。控制器的内容应该是Person,而不是Document。这就是你获得[<Document 0x618000100750> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.的原因。删除此连接。
    • 班级人员不符合KVO标准。当名称更改时,类Person不会发出更改通知,并且绑定不会注意到更改。这可以通过使用name的属性而不是ivar来修复。您不必使用setValue:forKey:更改代码中的名称,person.name = [field stringValue]即可。
    • 对象控制器的内容在文档的init方法中设置。这太早了,xib还没有加载,控制器也不存在。在windowControllerDidLoadNib中设置内容。我会使用addObject而不是setContent而不是addObject