我创建了两个自定义TableViewCells并使用UITableView成功注册它们。
他们都有不同的属性。问题是,如何访问这些属性?
NSDictionary *dict = self.tblContent[indexPath.row];
NSString *identifier;
if ([dict[@"type"] isEqualToString:@"type1"]) {
identifier = @"cell1";
}else if ([dict[@"type"] isEqualToString:@"type2"]) {
identifier = @"cell2";
}
CustomCell1 *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
cell.lblWho.text = dict[@"name"];
cell.lblWhen.text = dict[@"date"];
if ([dict[@"type"] isEqualToString:@"type2"]) {
(CustomCell2 *)cell.specialField.text = @"special field";
}
两个单元格都有lblWho
和lblWhen
,但只有cell2有specialField
。
当我尝试访问它时,XCode抱怨CustomCell1
没有属性specialField
(当然)。
正如您所看到的,我尝试将单元格转换为CustomCell2
,但这不起作用。
如何设置单元格,以便可以访问单元格特有的属性?
答案 0 :(得分:1)
在这种情况下(imo)的最佳方法是:
UITableViewCell
)。 @interface CustomCell2 : UITableViewCell
更改为@interface CustomCell2 : MyCell
MyCell
MyCell
中创建函数并在子类中实现它(void)configureCellForDictionary:(NSDictionary *)dict
并使用它:
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
[cell configureCellForDictionary:dict]
使用这种方法,您将隐藏细胞如何将其内容显示到细胞类的细节+您可以将所有常用代码移动到细胞的超类
有关使控制器更精细的更多结构化数据: Lighter View Controllers和 Clean table view code
答案 1 :(得分:1)
问题在于对转换的运算符优先级。这一行:
(CustomCell2 *)cell.specialField.text = @"special field";
施放超过你想要的东西。尝试更合格:
((CustomCell2 *)cell).specialField.text = @"special field";
顺便提一下,@ NikitaTook给出了一个关于设计的好答案。按单元格类型分解代码。但更直接的问题是演员。
对于子孙后代,常见的超类避免了演员问题,但并不总是谨慎或可能。以下是一般处理条件类型的方法......
// declare the variable in question as the lowest common ancestor on
// the class hierarchy, use id when the variable can be any class
// for this problem, we know they are UITableViewCells at least...
UITableViewCell *cell = [tableView dequeue...
// add a conditional that determines the type. In this case, the
// kind of cell we want is based on the model, but this can be any condition...
if ([dict[@"type"] isEqualToString:@"type1"]) {
// declare a new local of the now-known, more specific type.
// initialize it with a cast of the abstractly declared instance
MyTableViewCellSubtypeA *cellTypeA = (MyTableViewCellSubtypeA *)cell;
NSLog(@"%@", cellTypeA.propertySpecificToA); // use it specifically
// if you're lazy, or just have a one-liner, cast as I suggest, using parens properly
(MyTableViewCellSubtypeA *)(cell).propertySpecificToA;
else分支的想法相同。
答案 2 :(得分:0)
您可以检查单元格的类别:
if ([cell isKindOfClass: [CustomCell1 class]])
{
//Customize customcell1
}
else
{
//Customize customcell2
}
您可以检查您的手机是否有#34; specialField"属性:
if ([cell respondsToSelector: @selector(specialField)])
{
//Custom cell 2
}
else
{
//Custom cell 1
}