添加自定义UITableViewCell会使模拟器崩溃

时间:2010-04-23 09:20:11

标签: iphone objective-c cocoa xcode macos

我正在尝试使用自定义UITableViewCell构建我的应用程序。这是我的UIViewController中的代码,它将viewCell添加到表中:

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    NSLog(@"------- Tableview --------");

    static NSString *myIdentifier = @"MyIdentifier";

    MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:myIdentifier];
    if(cell == nil) {
        NSArray *cellView = [[NSBundle mainBundle] loadNibNamed:@"tblCellView" owner:self options:nil];
        cell = [cellView objectAtIndex:0];
    }

    [cell setLabelText:[NSString stringWithFormat:@"indexpath.row: %d", indexPath.row]];


    //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:myIdentifier] autorelease];
    cell.textLabel.text = @"bös";
    return cell;
    }

如果我取消注释“return cell”上面的行,它会返回一个没有任何错误的常规UITableViewCell,但是一旦我尝试实现我的自定义单元格,它就会崩溃并出现此错误:

  

------- Tableview -------- 2010-04-23 11:17:33.163高尔夫[26935:40b] *断言失败 - [UITableView   _createPreparedCellForGlobalRow:withIndexPath:],/ SourceCache / UIKit_Sim / UIKit-984.38 / UITableView.m:4709 2010-04-23   11:17:33.164高尔夫[26935:40b] * 由于未被捕获而终止应用程序   异常'NSInternalInconsistencyException',原因:'UITableView   dataSource必须从tableView返回一个单元格:cellForRowAtIndexPath:'   2010-04-23 11:17:33.165高尔夫[26935:40b]筹码:(

     

...

我已将.xib文件配置为具有正确插座的文件。并且UITableViewCell的标识符对应于尝试从NSBundle加载的名称

5 个答案:

答案 0 :(得分:1)

我无法看到声明tblCell的位置,这可能是您的代码中的许多问题之一。首先,你需要做一些事情:

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

您只是加载笔尖但从未从中提取单元格。

- 更新 -

如果IB中的自定义单元格有任何错误或绑定错误,您还应检查自定义单元格。

答案 1 :(得分:1)

您还应确保将Interface Builder中的自定义类类型设置为相应的类名(在您的示例中为MyTableCell),否则强制转换也不起作用。

答案 2 :(得分:1)

我创建了这个定义以帮助


#define LoadViewNib(__NIBNAME__) [[[NSBundle mainBundle] loadNibNamed:__NIBNAME__ owner:self options:nil] objectAtIndex:0]

使用,你只能这样做



 if(cell == nil) {

        cell = LoadViewNib(@"MyCellNibName");
 }

答案 3 :(得分:0)

我认为loadNibNamed: nethod由于某种原因返回nil。因此产生的细胞对象也是如此。

答案 4 :(得分:0)

参考:A Closer Look at Table-View Cells

如果要加载自己的自定义单元格,那么“为此过程的编程部分设置的一个重要属性是每个对象的标记属性。在”属性“窗格的”视图“部分中找到此属性并分配每个对象一个唯一的整数。“

现在检索您的标签 (我想你将tag = 1分配给标签)

UILabel *cellLabel = (UILabel *)[cell viewWithTag:1];
cellLabel.text = @"Your text goes here"