如何访问多个自定义tableviewcells中的属性

时间:2014-07-23 14:52:28

标签: ios objective-c xcode uitableview

我创建了两个自定义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";
    }

两个单元格都有lblWholblWhen,但只有cell2有specialField。 当我尝试访问它时,XCode抱怨CustomCell1没有属性specialField(当然)。 正如您所看到的,我尝试将单元格转换为CustomCell2,但这不起作用。

如何设置单元格,以便可以访问单元格特有的属性?

3 个答案:

答案 0 :(得分:1)

在这种情况下(imo)的最佳方法是:

  1. 创建MyCell(继承自UITableViewCell)。
  2. @interface CustomCell2 : UITableViewCell更改为@interface CustomCell2 : MyCell
  3. 将公共属性移至MyCell
  4. MyCell中创建函数并在子类中实现它
  5.   

    (void)configureCellForDictionary:(NSDictionary *)dict

    并使用它:

    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    [cell configureCellForDictionary:dict]
    

    使用这种方法,您将隐藏细胞如何将其内容显示到细胞类的细节+您可以将所有常用代码移动到细胞的超类

    有关使控制器更精细的更多结构化数据Lighter View ControllersClean 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)

  1. 您可以检查单元格的类别:

    if ([cell isKindOfClass: [CustomCell1 class]])
    {
         //Customize customcell1
    }
    else
    {
         //Customize customcell2
    }
    
  2. 您可以检查您的手机是否有#34; specialField"属性:

    if ([cell respondsToSelector: @selector(specialField)])
    {
        //Custom cell 2
    }
    else
    {
        //Custom cell 1
    }