程序在dequeueReusableCellWithIdentifier崩溃:

时间:2012-11-06 04:29:51

标签: iphone ios xcode

我有一个程序,其中有一个tableViewController,它有1个部分和3个行。每当我运行应用程序时,它总是在dequeueReusableCellWithIdentifier:方法崩溃。我在此方法中将断点和NSLog()插入零。我还将故事板中原型单元格的Cell Identifier设置为Cell。但程序仍然崩溃。这是导致问题的方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"indexPath.section = %d, indexPath.row = %d", indexPath.section, indexPath.row);
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (cell == nil)
    {
        NSLog(@"in nil");
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    return cell;
}

崩溃日志显示:

MyAppTake4[7463:707] indexPath.section = 0, indexPath.row = 0
2012-11-05 23:21:20.747 MyCardAppTake4[7463:707] -[UITableView     dequeueReusableCellWithIdentifier:forIndexPath:]: unrecognized selector sent to instance     0xfbc9000
2012-11-05 23:21:20.753 MyCardAppTake4[7463:707] *** Terminating app due to uncaught     exception 'NSInvalidArgumentException', reason: '-[UITableView     dequeueReusableCellWithIdentifier:forIndexPath:]: unrecognized selector sent to instance     0xfbc9000'
*** First throw call stack:
(0x3254788f 0x3459d259 0x3254aa9b 0x32549915 0x324a4650 0x7e2f7 0x31fceefb 0x31fcdfd9     0x31fcd763 0x31f71f15 0x324a61fb 0x3420aaa5 0x3420a6bd 0x3420e843 0x3420e57f 0x342064b9     0x3251bb1b 0x32519d57 0x3251a0b1 0x3249d4a5 0x3249d36d 0x315f4439 0x31f9ccd5 0x7d9f9 0x7d994)
terminate called throwing an exception(lldb)

我有兴趣找出错误的确切原因,以便我不再犯这个错误。

感谢您的帮助。

5 个答案:

答案 0 :(得分:9)

那是因为[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];在iOS 6中添加但iOS 5无法识别。对于iOS 5兼容性,请使用以下方法:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

答案 1 :(得分:7)

您是否首先注册了单元格或笔尖的类?

来自Apple文档:

重要说明:在调用此方法之前,必须使用registerNib:forCellReuseIdentifier:或registerClass:forCellReuseIdentifier:方法注册类或nib文件。

(顺便说一句,该方法仅适用于iOS 6)

如果你使用的是iOS 6,那么你可以使用新的更简单的范例:

在viewDidLoad中,在您的情况下注册该类,它只是UITableViewCell类:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

然后,您可以在cellForRowAtIndexPath中执行此操作:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = self.myArray[indexPath.row];
    return result;
}

答案 2 :(得分:1)

由于forIndexPath方法适用于ios 6,我建议您使用此代码段。在下面找到。

UITableViewCell *cell = [table_view dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];

    // **initialize** your stuff here **with their respected tag**
}
else
{
   // **get** your stuff back using their tags
}
// **assign** your valiues here

return cell;

享受编程

答案 3 :(得分:0)

我有这个例外,并意识到这是由我的愚蠢错误造成的。我创建了一个空白的.xib文件(要在我的UITableView中设置自定义"正在加载"单元格),但之后拖了View一个2014-04-25 20:45:12.953 Languages[36256:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier (LoadingCell) - nib must contain exactly one top level object which must be a UITableViewCell instance' 它。卫生署!

结果是您正在查看的异常消息,以及“输出”窗口中的此消息:

Table View Cell

当然,解决方案是在我的.xib文件中添加{{1}},将其他UI组件复制到其中,然后将表视图单元格保留为" root"文件中的元素。

答案 4 :(得分:0)

此错误的另一个原因可能是 -

为标识符(Cell)注册的无效nib - nib必须只包含一个必须是UICollectionReusableView实例的顶级对象

我的xib中有一个UIView而不是collectionViewCell。希望这会有所帮助。