当我在表格视图中设置自定义单元格时,我正试图找到一种不重复代码的方法。我目前有一个BaseCell类,从UITableViewController继承,然后是BaseCell的两个子类:CellTypeOne和CellTypeTwo。这是我目前正在使用的那种设置:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *type = [self.rowTypes objectAtIndex:indexPath.row];
if ([type isEqualToString:@"Type 1"]) {
CellTypeOne *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"];
cell.picture.image = // An image
cell.caption.text = // A caption
cell.author.text = // An author
return cell;
}
else if {[type isEqualToString:@"Type 2"]) {
CellTypeTwo *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"];
cell.picture.image = // An image
cell.caption.text = // A caption
cell.number.text = // A number
return cell;
}
}
由于某些细胞类型的设置属性相同,我想知道是否有办法做这样的事情:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *type = [self.rowTypes objectAtIndex:indexPath.row];
id cell;
if ([type isEqualToString:@"Type 1"]) {
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"];
// Cast cell to (CellTypeOne *)?
cell.author.text = // An author
}
else if {[type isEqualToString:@"Type 2"]) {
CellTypeTwo *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"];
// Cast cell to (CellTypeTwo *)?
cell.number.text = // A number
}
cell.picture.image = // An image
cell.caption.text = // A caption
return cell;
}
这样我就可以为每个子类做特定于类的设置,然后对两者进行通用设置。我实现这一点的唯一方法是每次我需要使用它时使用单元格,这样的事情:
[(BaseCell *)cell picture].image = // An image
必须在每一行上投射单元格似乎比开始使用几行重复代码更有效,但我只是想弄清楚最好的方法来解决这个问题。
答案 0 :(得分:2)
您可以制作cell
类型的BaseCell*
变量,以避免在ifs之外进行转换:
BaseCell *cell;
if ([type isEqualToString:@"Type 1"]) {
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"];
[[cell author] setText:/*an author*/];
} else if {[type isEqualToString:@"Type 2"]) {
cell = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"];
[[cell number] setText: /* a number */];
}
cell.picture.image = // An image
cell.caption.text = // A caption
或者,您可以保留id
的类型,并使用方法调用语法而不是成员(点)语法在之外 ifs:
id cell;
// ... the code from your post
[[cell picture] setImage: /* an image */];
[[cell caption] setText: /* a caption */];
最后,您可以通过在ifs中声明其他变量来完全避免强制转换和方括号:
BaseCell *cell;
if ([type isEqualToString:@"Type 1"]) {
CallTypeOne *cellOne = [tableView dequeueReusableCellWithIdentifier:@"Cell 1"];
cellOne.author.text = // An author
cell = cellOne;
} else if {[type isEqualToString:@"Type 2"]) {
CellTypeTwo *cellTwo = [tableView dequeueReusableCellWithIdentifier:@"Cell 2"];
cellTwo.number.text = // A number
cell = cellTwo;
}