我有2个viewControllers,每个都包含一个UITableView和其他子视图。 2 UITableViews具有相同的部分结构和单元格类型,但数据源不同。
所以我决定将这个UITableView提取到一个自定义的UITableView中。自定义UITableView实现tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
之类的方法,并且是自己的数据源和委托。 viewController只提供数据。
问题是我无法弄清楚viewControllers提供数据的最佳方式。我可以想到两种方式:
在MyCustomTableView.h中:
@protocol MyCustomTableViewDataProvider <NSObject>
- (NSArray*)dataArray;
@end
@interface MyCustomTableView : UITableView
@property (nonatomic, weak) id<MyCustomTableViewDataProvider> dataProvider;
@end
viewController应该实现这个协议:
- (NSArray*)dataArray {
return self.dataArray;
}
在MyCustomTableView.m中我使用它:
NSArray* dataArray = [self.dataProvider dataArray];
在MyCustomTableView.h中:
@interface MyCustomTableView : UITableView
@property (nonatomic, weak) NSArray* dataArray;
@end
每当数据发生变化时,viewController都应通知自定义TableView更新其数据:
self.customTableView.dataArray = self.dataArray;
在MyCustomTableView.m中我使用它:
self.dataArray
似乎第二种方式可以保存一些代码,但我听说你不应该在视图中存储数据,因为它违反了MVC原则。你能给我一些建议吗?非常感谢!
答案 0 :(得分:1)
如果我是你,为了保持ViewController的简洁和简洁,我将创建一个实现UITableViewDelegate和DataSource协议的自定义NSObject。这个类将负责提供单元格和节的样式(在这两个表视图中共享)以及数据源。当然,此对象必须具有引用其TableView的属性。
ViewController只负责在需要时触发数据检索。该数据应传递给该自定义NSObject,后者将负责更新表视图。
顺便说一句,这个对象甚至可以通过InterfaceBuilder添加。我知道,它有点老了,但您可以查看:Lighter VC这只是迈向MVVM的一步。