【发布时间】:2011-12-15 14:32:54
【问题描述】:
假设我有 10 个表格视图,它们都需要将第一个单元格的背景,在所有部分中,颜色设置为红色。
为了不对所有 10 个表视图手动执行此操作,我认为我应该继承 UITableView。
我的问题是:我应该从 UITableView 覆盖什么?
或者我应该继承 UITableViewCell 并且所有单元格都从这里继承?
谢谢。
【问题讨论】:
标签: uitableview datasource subclass
假设我有 10 个表格视图,它们都需要将第一个单元格的背景,在所有部分中,颜色设置为红色。
为了不对所有 10 个表视图手动执行此操作,我认为我应该继承 UITableView。
我的问题是:我应该从 UITableView 覆盖什么?
或者我应该继承 UITableViewCell 并且所有单元格都从这里继承?
谢谢。
【问题讨论】:
标签: uitableview datasource subclass
您可以将 UITableViewCell 子类化,然后您必须以某种方式将 section&row 赋予单元格,以便它知道设置背景。
但是,您也可以继承 UITableView。如果您选择子类化 UITableView,下面是一个解决方案,但最终由您决定。
我现在能想到的唯一方法是以某种方式捕获对 tableView 数据源的所有请求,以便您随后可以操纵结果。
你可以这样做:
子类 UITableView,我们这样称呼它 MyUITableView:
添加一个成员变量id<UITableViewDataSource> myDataSource,并为这个变量添加一个属性并设置IBOutlet。然后在 Interface Builder 中,您应该使用此属性而不是标准的 uitableview 数据源属性来连接表视图。
在init 或loadView 的某处,写self.dataSource = self。这个想法是捕获所有请求(特别是cellForRowAtIndexPath),以便您可以操纵实际结果。
在您的子类中,实现 UITableViewDataSource 协议,并将所有调用转发到 myDataSource 对象。
唯一的例外是在cellForRowAtIndexPath 实现中,从 myDataSource 获得结果后,如果满足特定条件,您可以更改背景颜色。请参阅下面的示例代码
@interface MyUITableView : UITableView {
id<UITableViewDataSource> myDataSource;
}
@property (nonatomic, retain) IBOutlet id<UITableViewDataSource> myDataSource;
@end
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Get the result from the actual data source
UITableViewCell* cell = nil;
if (myDataSource)
cell = [myDataSource tableView:self cellForRowAtIndexPath:indexPath];
// If you condition is met, then just modify the cell in some way
if (indexPath.section == 0 && indexPath.row == 0)
cell.contentView.backgroundColor = [UIColor redColor];
return cell;
}
这几乎就是您所需要的。我不知道我说得够不够清楚,但如果您有任何问题,请不要犹豫。
【讨论】: