被问到了一个问题:如何从一个子视图或者一个View中刷新其他UITableView,常规的写法可能是这样的
TestTVC*testTVC =[[TestTVC alloc] init];
[testTVC loadData];
这时你可以看看UITableView是不会被刷新的,起码cellForRowAtIndexPath是不会运行的,为什么呢?因为对TestTVC这样init实际是重新init了一个TestTVC,而loadData不会对已有的TestTVC有作用的。但是loadData方法中如果有API的数据操作这个是会成功的。但是并不会重新渲染tableview。
看到网上2个最普遍的答案是:
1. `[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];`这也是不行的,任何涉及刷新view的操作都是不会成功的,尽管它比self.tableView reloaddata好一些可以让 `cellForRowAtIndexPath` 有反应了,但是依然刷新不了数据。
2. 主线程调用,`[testTVC performSelectorOnMainThread:@selector(loadData) withObject:nil waitUntilDone:NO];` 依然只会更新数据不会刷新视图
解决方案是使用通知:
[[NSNotificationCenter defaultCenter] postNotificationName:RELOAD_DATA object:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadData) name:RELOAD_DATA object:nil];
—EOF—