我应该将数据存储在我的自定义 UITableView 中吗?
Should I store data in my custom UITableView?
我有 2 个 viewController,每个包含一个 UITableView 和其他子视图。 2个UITableView的section结构和cell类型相同,只是数据源不同。
所以我决定将这个 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原则。你能给我一些建议吗?非常感谢!
恕我直言,除非绝对必要,否则我不会子class 任何 UIView。 TableViews 和 Collections 都提供协议来正确控制它们的行为。
如果我是你,为了保持 ViewController 简洁明了,我会创建一个实现 UITableViewDelegate 和 DataSource 协议的自定义 NSObject。此 class 将负责提供单元格和部分的样式(在这 2 个 table 视图中共享)以及数据源。当然,这个对象必须有一个属性引用它的TableView。
ViewController只负责在需要时触发数据检索。该数据应传递给该自定义 NSObject,它将负责更新 table 视图。
顺便说一句,这个对象甚至可以通过 InterfaceBuilder 添加。
它有点旧,我知道,但你可以检查一下:Lighter VC它只是迈向 MVVM 的一步。
我有 2 个 viewController,每个包含一个 UITableView 和其他子视图。 2个UITableView的section结构和cell类型相同,只是数据源不同。
所以我决定将这个 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原则。你能给我一些建议吗?非常感谢!
恕我直言,除非绝对必要,否则我不会子class 任何 UIView。 TableViews 和 Collections 都提供协议来正确控制它们的行为。
如果我是你,为了保持 ViewController 简洁明了,我会创建一个实现 UITableViewDelegate 和 DataSource 协议的自定义 NSObject。此 class 将负责提供单元格和部分的样式(在这 2 个 table 视图中共享)以及数据源。当然,这个对象必须有一个属性引用它的TableView。
ViewController只负责在需要时触发数据检索。该数据应传递给该自定义 NSObject,它将负责更新 table 视图。
顺便说一句,这个对象甚至可以通过 InterfaceBuilder 添加。
它有点旧,我知道,但你可以检查一下:Lighter VC它只是迈向 MVVM 的一步。