【问题标题】:App crashes with two custom 'UITableViewCell' in the same 'UITableView'应用程序在同一个“UITableView”中使用两个自定义“UITableViewCell”崩溃
【发布时间】:2015-08-23 10:52:15
【问题描述】:

我有一个“UITableView”,应该加载一个自定义“UITableViewCell”。当用户触摸其中一个单元格时,触摸的单元格将被另一个自定义单元格替换,并带有额外的信息标签。

但是,当用户触摸单元格时,应用程序会崩溃。它引发了以下异常:

'NSInvalidArgumentException',原因:'-[simplefiedCell cellInfo]: unrecognized selector sent to instance 0x7fb5b2f3d950'

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 的代码在哪里:

if(indexPath.row == self.selectedCell) {

    regularCell *cell = (regularCell *)[tableView dequeueReusableCellWithIdentifier:cellID1];

    [cell.cellInfo setText:@"Some temporally text to test this code"];


    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"regularCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

    return cell;

}else{

    simplefiedCell *cell = (simplefiedCell *)[tableView dequeueReusableCellWithIdentifier:cellID2];

    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"simplefiedCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

    switch (indexPath.row) {
        case 0:
            [cell.cellTopic setText:@"Text1"];
            break;
        case 1:
            [cell.cellTopic setText:@"Text2"];
            break;
        case 2:
            [cell.cellTopic setText:@"Text3"];
            break;
        case 3:
            [cell.cellTopic setText:@"Text4"];
            break;
        case 4:
            [cell.cellTopic setText:@"Text5"];
            break;
        case 5:
            [cell.cellTopic setText:@"Text6"];
            break;
        default:
            break;
    }

    return cell;
}

以及我在(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 中使用的简单代码:

[tableView deselectRowAtIndexPath:indexPath animated:YES];

if (indexPath.row == self.selectedCell)
    self.selectedCell = -1;
else
    self.selectedCell = indexPath.row;

[self.tableView reloadData]; 

有人知道发生了什么吗?感谢任何帮助!

【问题讨论】:

    标签: ios objective-c uitableview unrecognized-selector


    【解决方案1】:

    乍一看,我怀疑问题不在您上面粘贴的代码中。机会是:

    • 您不小心为 cellID1 注册了 SimplifiedCell NIB,并在您期望一个常规单元格时获得了一个简化的单元格类。
    • cellID1 和cellID2 的值相同,导致后面的注册获胜。
    • 您在 regularCell XIB 中指定了错误的自定义类,实际上是在实例化简化的Cell 类。

    如果这三个都不是,那么我建议搜索简化单元类的名称——首先在 XIB xml 文件中,然后在代码中——无论你在哪里找到它,问问自己它是否真的应该是代替那个地方的普通班。大概其中一个应该是。

    【讨论】:

    • 非常感谢!!!你是对的:我不小心为 cellID1 注册了简化的Cell NIB。
    • 顺便说一句,IIRC,dequeue 方法应该只返回 nil,如果 A.您将 nil 注册为标识符的 NIB 或 B.您完全没有内存到 malloc() 是未能创建对象,此时您无论如何都会崩溃。所以你可能可以省去这些检查。
    • 我不知道为什么,但显然这里返回 nil。我仔细检查了 NIB 中的标识符,它们已正确注册。我不认为内存不足是这里的问题。
    • 我可能记错了,但文档还说,如果您为该重用标识符注册了一个类,它不应该返回 nil。我认为这绝对值得进一步研究,因为其他可能是错误的,例如您的自定义类不是实际单元的子类,或者没有实现某些必需的方法或其他东西。 (不过,无论如何,我都不是表格视图专家,所以对此持保留态度。)
    • 两个自定义类都被声明为 UITableViewCell 的子类。事实上,他们所做的只是覆盖'(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier'。我不确定他们是否需要实施任何其他方法。但我肯定会进一步研究。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多