【发布时间】:2011-04-18 07:09:25
【问题描述】:
在 .NET 中,我只是执行 DataForm.Source = Object 之类的操作,然后奇迹发生了。平台将数据更改从 ui 文件路由到对象属性,进行验证等。我可以用 Cocoa Touch 和 CoreData 对象做类似的事情吗?
【问题讨论】:
标签: cocoa-touch data-binding core-data ios
在 .NET 中,我只是执行 DataForm.Source = Object 之类的操作,然后奇迹发生了。平台将数据更改从 ui 文件路由到对象属性,进行验证等。我可以用 Cocoa Touch 和 CoreData 对象做类似的事情吗?
【问题讨论】:
标签: cocoa-touch data-binding core-data ios
Cocoa 中最接近的东西是“键值观察”。在桌面 Cocoa 框架中,您可以使用绑定将用户界面元素与底层对象挂钩,以便对象或 UI 元素中的更改反映在其他对象中。
虽然 iOS 上的 Cocoa 没有这种 UI 绑定,但您仍然可以使用“键值观察”将数据模型中的更改与 UI 元素同步,如下所述:
http://developer.apple.com/library/iOS/#documentation/General/Conceptual/Devpedia-CocoaApp/KVO.html
【讨论】:
我编写了一个小的开源库,它提供了一些简单的数据绑定功能。它基本上只是对键值观察 (KVO) 的封装。
GitHub 上还有一些其他类似的库:
【讨论】:
可能还应该提到 Github 的 Reactive Cocoa,这是一个用于组合和转换值序列的框架,是 .NET 的 Reactive Extensions (Rx) 的 Objective-C 版本。
绑定机制可以非常简单地完成(来自示例):
// RACObserve(self, username) creates a new RACSignal that sends a new value
// whenever the username changes. -subscribeNext: will execute the block
// whenever the signal sends a value.
[RACObserve(self, username) subscribeNext:^(NSString *newName) {
NSLog(@"%@", newName);
}];
【讨论】:
别忘了NSFetchedResultsController。
不是一个完整的数据绑定控制器,但使表格视图更容易与 Core Data 一起使用。
【讨论】:
如果您使用的是 Swift,请查看 Bond 框架:https://github.com/ReactiveKit/Bond
绑定很简单:
textField.reactive.text.bind(to: label.reactive.text)
它与功能配合得很好:
textField.reactive.text
.map { "Hi " + $0 }
.bind(to: label.reactive.text)
并提供简单的观察:
textField.reactive.text
.observeNext { text in
print(text)
}
【讨论】:
STV (http://sensiblecocoa.com) 是一个可以在表格视图中执行此操作的框架
【讨论】:
我将斯坦福大学的 CoreDataTableViewController 用于我的 TableViewControllers。它隐藏了很多您通常会在 TableViewController 中实现的细节。
在谷歌上搜索 CoreDataTableViewController.h 和 .m 将在路上为您提供帮助。有几个可用课程的版本,最新的 ARC 有,旧的没有。
对于使用 NSManagedObject 同步标签和编辑字段,我仍在寻找一个好的解决方案。
【讨论】:
是的,有一个数据绑定框架可以很好地集成到 Interface Builder 中,并且只需要最少的代码开销(如果有的话)。
看看https://github.com/mutech/aka-ios-beacon
编辑: 例如,您可以将表视图绑定到获取的结果控制器,只需将界面生成器中表视图的数据源绑定属性设置为:
[ yourResultsController ] { defaultCellMapping: "YourCellId" }
您唯一需要做的就是在您的视图控制器中定义一个属性yourResultsController。
wiki 提供了相当完整的文档和大量示例用例。
【讨论】: