【问题标题】:Adding custom UITableViewCell crashes the simulator添加自定义 UITableViewCell 会使模拟器崩溃
【发布时间】:2010-04-23 09:20:11
【问题描述】:

我正在尝试使用自定义 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;
    }

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

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

...

我已按照应有的方式配置了 .xib 文件,并使用了正确的插座。并且 UITableViewCell 的标识符对应于我试图从 NSBundle 加载的名称

【问题讨论】:

  • 尝试将其转换为 (MyTableCell *)
  • 不要忘记在 .m 文件中导入自定义单元格并与自定义单元格绑定。还要检查 tableview 代表的数据源。

标签: iphone objective-c cocoa xcode macos


【解决方案1】:

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

【讨论】:

  • 这是一个老问题,但我相信这是我的问题的解决方案,所以我将其标记为答案。
  • 我遇到了类似的问题,这个答案让我找到了它。我忘记在我的 iPhone xib 中将 File's Owner 的类型设置为我的视图控制器,所以我只在 iPhone 上崩溃了。
【解决方案2】:

我看不到tblCell 的声明位置,这可能是您的代码存在的众多问题之一。首先,您需要执行以下操作:

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

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

--更新--

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

【讨论】:

  • 对不起,那是旧代码。我现在更新了我原来的问题。
  • 尝试将其转换为 (MyTableCell *)
【解决方案3】:

我创建了这个定义来帮助


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

为了使用,只能这样做



 if(cell == nil) {

        cell = LoadViewNib(@"MyCellNibName");
 }

【讨论】:

    【解决方案4】:

    我认为loadNibNamed: nethod 出于某种原因返回 nil。所以结果单元格对象也为零。

    【讨论】:

      【解决方案5】:

      参考:A Closer Look at Table-View Cells

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-17
        • 2012-05-27
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 2014-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多