最简单的Cocoa绑定例子
The simplest Cocoa Binding example
我想对 Cocoa 绑定有一个基本的了解,我想创建一个非常简单的项目。我有一个 class Person
,它有一个类型为 NSString
的变量 name
。以下是我希望事情如何运作:
- 用户在文本字段中输入姓名并按下 "Update name" 按钮
- 文本字段中的字符串保存到
Person
class. 的实例
- 绑定到Person Controller(绑定到
Person
class)的标签根据Person
的name
变量自动改变其值]实例。
我花了几个小时阅读各种教程和 Apple Mac 开发人员库,但每个示例都只展示了如何使用表获得 Cocoa 绑定。当我尝试开发更简单的东西时,我觉得自己完全迷失了。我已经创建了一个基础项目,唯一剩下的就是进行所有绑定。我恳请为我建立所有联系,并希望给我一个解释。 https://www.dropbox.com/sh/6hddfxyitqp6uoc/AACgaRhKBhLo6EXCVN9W6GQua?dl=0
该项目是一个基于文档的应用程序,因为我将来会开发这种类型的应用程序。
您的项目无法运行的原因有多种,因此让我们重新开始并创建最简单的 Cocoa 绑定示例。
- 创建一个新的 Xcode 项目,选择 Cocoa 应用程序,不要勾选 "Use Storyboards"、"Create Document-Based Application" 或 "Use Core Data"。
- Select MainMenu.xib、select window 并添加文本字段和标签。
- 向 xib 添加对象控制器。打开
Prepares Content
。
- 将文本字段绑定到对象控制器:将
Value
绑定到 Object Controller
、控制器键 selection
和模型键路径 name
。
- 将标签绑定到对象控制器:将
Value
绑定到 Object Controller
、控制器键 selection
和模型键路径 name
。
- 构建,运行,测试。输入一些文本并点击 Return。
控制器自动创建一个 NSMutableDictionary
的实例,每个键都符合 KVO。当Text Field的内容改变时,Text Field的绑定调用setValue:@"New Contents" forKey:@"name"
。这通知标签的绑定和标签被更新。
为什么你的项目不起作用:
- 在xib中,Object Controller的内容是和文档相关联的。 controller 的内容应该是 Person,而不是 Document。这就是为什么你得到
[<Document 0x618000100750> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.
。删除此连接。
- Class 人不符合 KVO。当名称更改时,class Person 不会发出更改通知,绑定也不会注意到更改。这可以通过对
name
使用 属性 而不是 ivar 来解决。您不必使用 setValue:forKey:
来更改代码中的名称,person.name = [field stringValue]
就可以。
- Object Controller的内容在文档的
init
方法中设置。这还为时过早,xib 尚未加载且控制器不存在。在windowControllerDidLoadNib
中设置内容。我会使用 setContent
而不是 addObject
,但 addObject
应该有效。
我想对 Cocoa 绑定有一个基本的了解,我想创建一个非常简单的项目。我有一个 class Person
,它有一个类型为 NSString
的变量 name
。以下是我希望事情如何运作:
- 用户在文本字段中输入姓名并按下 "Update name" 按钮
- 文本字段中的字符串保存到
Person
class. 的实例
- 绑定到Person Controller(绑定到
Person
class)的标签根据Person
的name
变量自动改变其值]实例。
我花了几个小时阅读各种教程和 Apple Mac 开发人员库,但每个示例都只展示了如何使用表获得 Cocoa 绑定。当我尝试开发更简单的东西时,我觉得自己完全迷失了。我已经创建了一个基础项目,唯一剩下的就是进行所有绑定。我恳请为我建立所有联系,并希望给我一个解释。 https://www.dropbox.com/sh/6hddfxyitqp6uoc/AACgaRhKBhLo6EXCVN9W6GQua?dl=0 该项目是一个基于文档的应用程序,因为我将来会开发这种类型的应用程序。
您的项目无法运行的原因有多种,因此让我们重新开始并创建最简单的 Cocoa 绑定示例。
- 创建一个新的 Xcode 项目,选择 Cocoa 应用程序,不要勾选 "Use Storyboards"、"Create Document-Based Application" 或 "Use Core Data"。
- Select MainMenu.xib、select window 并添加文本字段和标签。
- 向 xib 添加对象控制器。打开
Prepares Content
。 - 将文本字段绑定到对象控制器:将
Value
绑定到Object Controller
、控制器键selection
和模型键路径name
。 - 将标签绑定到对象控制器:将
Value
绑定到Object Controller
、控制器键selection
和模型键路径name
。 - 构建,运行,测试。输入一些文本并点击 Return。
控制器自动创建一个 NSMutableDictionary
的实例,每个键都符合 KVO。当Text Field的内容改变时,Text Field的绑定调用setValue:@"New Contents" forKey:@"name"
。这通知标签的绑定和标签被更新。
为什么你的项目不起作用:
- 在xib中,Object Controller的内容是和文档相关联的。 controller 的内容应该是 Person,而不是 Document。这就是为什么你得到
[<Document 0x618000100750> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.
。删除此连接。 - Class 人不符合 KVO。当名称更改时,class Person 不会发出更改通知,绑定也不会注意到更改。这可以通过对
name
使用 属性 而不是 ivar 来解决。您不必使用setValue:forKey:
来更改代码中的名称,person.name = [field stringValue]
就可以。 - Object Controller的内容在文档的
init
方法中设置。这还为时过早,xib 尚未加载且控制器不存在。在windowControllerDidLoadNib
中设置内容。我会使用setContent
而不是addObject
,但addObject
应该有效。