【问题标题】:The simplest Cocoa Binding example最简单的 Cocoa 绑定示例
【发布时间】:2016-12-17 05:02:09
【问题描述】:

我正在尝试对 Cocoa 绑定有一个基本的了解,并且我想创建一个非常简单的项目。我有一个类Person,它有一个类型为NSString 的变量name。以下是我希望的工作方式:

  1. 用户在文本字段中输入名称并按下“更新名称”按钮
  2. 文本字段中的字符串保存到Person 类的实例中。
  3. 绑定到 Person Controller(绑定到 Person 类)的标签会根据 Person 实例的 name 变量自动更改其值。

我花了几个小时阅读各种教程和 Apple Mac 开发人员库,但每个示例都只展示了如何让 Cocoa 绑定与表格一起使用。当我尝试开发更简单的东西时,我觉得我完全迷失了。我已经创建了一个基础项目,剩下的唯一事情就是进行所有绑定。我恳请为我建立所有联系,并希望为我提供解释。 https://www.dropbox.com/sh/6hddfxyitqp6uoc/AACgaRhKBhLo6EXCVN9W6GQua?dl=0 该项目是一个基于文档的应用程序,因为我将来会开发这种类型的应用程序。

【问题讨论】:

  • 你读过Cocoa Bindings Programming Topics吗? Person 类必须符合 KVO。
  • 将标签的值绑定到控制器,Controller Key:selection,Model Key Path:name。就是这样。
  • 如果我这样做,我会遇到几个异常并且应用程序无法加载。我显然需要在我的对象控制器中建立一些连接。另外,是否可以在一个类中实现 KVO,即。 e.我可以让我的Person 类符合 KVO 吗?如果您可以建议另一种方法来完成我正在处理的相同任务,请分享您的知识。

标签: objective-c xcode cocoa cocoa-bindings


【解决方案1】:

您的项目无法运行的原因有很多,所以让我们重新开始并创建最简单的 Cocoa 绑定示例。

  1. 新建一个 Xcode 项目,选择 Cocoa Application,不要勾选“Use Storyboards”、“Create Document-Based Application”或“Use Core Data”。
  2. 选择 MainMenu.xib,选择窗口并添加文本字段和标签。
  3. 将对象控制器添加到 xib。打开Prepares Content
  4. 将文本字段绑定到对象控制器:将Value 绑定到Object Controller,控制器键selection 和模型键路径name
  5. 将标签绑定到对象控制器:将Value 绑定到Object Controller,控制器键selection 和模型键路径name
  6. 构建、运行、测试。输入一些文字,然后按 Return。

控制器自动创建NSMutableDictionary 的实例,它对每个键都符合 KVO。当 Text Field 的内容发生变化时,Text Field 的绑定调用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.。删除此连接。
  • 类 Person 不符合 KVO。当名称更改时,Person 类不会发出更改通知,并且绑定不会注意到更改。这可以通过使用 name 的属性而不是 ivar 来解决。代码里改名字不用setValue:forKey:person.name = [field stringValue]就可以了。
  • 对象控制器的内容在文档的init方法中设置。这还为时过早,xib 尚未加载且控制器不存在。设置windowControllerDidLoadNib中的内容。我会使用setContent 而不是addObject,但addObject 应该可以工作。

【讨论】:

  • 非常感谢您的帮助,这只是我正在寻找的解释。应用您指出的更改后,我的项目开始完全正常工作。
猜你喜欢
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多