我应该将数据存储在我的自定义UITableView中吗?

时间:2015-02-05 10:39:58

标签: ios uitableview

我有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原则。你能给我一些建议吗?非常感谢!

1 个答案:

答案 0 :(得分:1)

恕我直言,除非绝对必要,否则我不会将任何UIView子类化。 TableViews和Collections都提供了正确控制其行为的协议。

如果我是你,为了保持ViewController的简洁和简洁,我将创建一个实现UITableViewDelegate和DataSource协议的自定义NSObject。这个类将负责提供单元格和节的样式(在这两个表视图中共享)以及数据源。当然,此对象必须具有引用其TableView的属性。

ViewController只负责在需要时触发数据检索。该数据应传递给该自定义NSObject,后者将负责更新表视图。

顺便说一句,这个对象甚至可以通过InterfaceBuilder添加。

我知道,它有点老了,但您可以查看:Lighter VC这只是迈向MVVM的一步。