【发布时间】:2013-12-11 13:42:17
【问题描述】:
让我们想象一个基本的 iPhone 应用程序,它有一个表格视图来显示人员列表和一个详细信息视图来更改嵌入在导航控制器中的人的姓名。
我正在使用 KVO 在我的表格视图控制器中收到通知,告知一个人的姓名在详细信息控制器中已更改。
我的问题是何时/在何处添加和删除我的表视图控制器作为每个人对象的 name 的观察者。
我的做法:
@implementation PeopleTableViewController
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
Person *person = ...; // person for index path
[person addObserver:self forKeyPath:@"name" options:0 context:(__bridge void *)(PERSON_NAME_CTX)];
}
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
Person *person = ...; // person for index path
[person removeObserver:self forKeyPath:@"name"];
// This is not called when the view is removed from the hierarchy
// Can't use viewDidDisappear: because we are using a navigation controller
// and tableView:willDisplayCell: is not called when we return from the details controller
}
- dealloc {
// See comment in didEndDisplayingCell:
for (UITableViewCell *cell in self.tableView.visibleCells) {
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
Person *person = ...; // person for index path
[person removeObserver:self forKeyPath:@"name"];
}
}
由于导航控制器,事情有点棘手,因为从视图层次结构中删除视图时不会调用tableView: didEndDisplayingCell。我无法删除viewWillDisappear: 中的观察者,因为当用户从详细信息控制器返回时,我仍然需要观察人员对象的变化。
删除dealloc 中的观察者似乎可行。我的问题:这是正确的做法吗?
【问题讨论】:
标签: ios iphone objective-c uitableview key-value-observing