最简单的Cocoa Binding示例

Yas*_*man 1 xcode cocoa objective-c cocoa-bindings

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

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

我花了几个小时阅读各种教程和Apple Mac Developer Library,但每个例子都只展示了如何让Cocoa Bindings与表一起工作.当我尝试开发更简单的东西时,我觉得我完全迷失了.我创建了一个基础项目,剩下的唯一事情就是创建所有绑定.我很乐意为我提供所有的联系,希望能给我一个解释.https://www.dropbox.com/sh/6hddfxyitqp6uoc/AACgaRhKBhLo6EXCVN9W6GQua?dl=0 该项目是一个基于文档的应用程序,因为我将开发这种类型在未来的应用程序.

Wil*_*eke 6

您的项目不起作用有几个原因让我们重新开始并创建最简单的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. 将Label绑定到Object Controller:绑定ValueObject ControllerController Key selection和Model Key Path name.
  6. 构建,运行,测试.输入一些文字并点击Return.

控制器自动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..删除此连接.
  • Class Person不符合KVO标准.当名称更改时,类Person不会发出更改通知,并且绑定不会注意到更改.这可以通过使用属性name而不是ivar 来修复.您不必使用setValue:forKey:在代码中更改名称,person.name = [field stringValue]没关系.
  • 对象控制器的内容init在文档的方法中设置.这太早了,xib尚未加载且控制器不存在.设置内容windowControllerDidLoadNib.而不是addObject我会使用,setContentaddObject应该工作.