9

我有一个程序,其中有一个 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)

我有兴趣确定错误的确切原因,这样我就不会再犯这个错误了。

谢谢你的帮助。

4

5 回答 5

9

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
于 2012-11-06T04:34:59.650 回答
7

你是先注册cell的class还是nib的?

来自苹果文档:

重要提示:在调用此方法之前,您必须使用 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;
}
于 2012-11-06T04:35:38.030 回答
1

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

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;

享受编程

于 2012-11-06T04:39:28.713 回答
0

我有这个异常,并意识到它是由我的愚蠢错误引起的。我创建了一个空白的 .xib 文件(在我的 .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 文件中添加一个,将其他 UI 组件复制到其中,然后将该 Table View Cell 保留为文件中的“根”元素。

于 2014-04-25T18:48:26.707 回答
0

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

为标识符(单元格)注册的 nib 无效 - nib 必须恰好包含一个顶级对象,该对象必须是 UICollectionReusableView 实例

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

于 2016-08-23T20:00:00.947 回答