cellForRowAtIndexPath:为通用原型单元格返回nil

时间:2012-01-02 16:37:46

标签: xcode4 uitableview storyboard automatic-ref-counting

这让我疯了!

我有一个带有通用原型单元的通用UITableViewController类,标识符为“myCell”。在ARC,iOS5下开发并使用Storyboard,我使用以下方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
    cell.textLabel.text = @"Title";
    return cell;
}

一切都挂在故事板,文件所有者等等。我的项目中有几个其他UITableViewController,使用相同的概念。一切正常。 这个特殊类的UITableViewController不想工作!继续向我抛出异常:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

Nslog'ed - > [tableView dequeueReusableCellWithIdentifier:@“myCell”] =(null)

非常感谢任何想法和帮助!

编辑:

为简单起见: - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {     返回1; }

我已经完成的事情: 1.在故事板中删除并创建和设置UITableViewController! 2.重新启动Xcode 3.重启模拟器 4.重启电脑!!!! 5.一遍又一遍地删除并构建应用程序! 没有工作。

顺便说一句,我试过

if (cell == nil)
 cell = [UITableViewCell alloc] initWithStyle....

..它将解决问题,但又一次......这是ARC,故事板,......我不应该这样做。 Xcode应该照顾它!

4 个答案:

答案 0 :(得分:2)

您必须创建您的单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"] autorelease];
    }

    cell.textLabel.text = @"Title";
    return cell;
}

答案 1 :(得分:2)

最终我发现了这个错误。我不能说我找到了根本原因,但逐行调查,这是我找到并为我工作的。

我的UITableViewController中有一些对象需要在加载视图之前进行alloc / init',这样当调用者可以将它们设置为预先确定值时。由于viewDidLoad为时已晚,我将它们放在initWithCoder方法中。

注销并重写initwithCoder方法解决了这个问题。在我看来,initWithCoder方法正在启动UITableViewController,因为它有些不同!

答案 2 :(得分:0)

我遇到了同样的问题而且设法克服了它。 如果要动态创建单元格数据,则必须执行以下操作:

  1. 选择表格视图。
  2. 然后从对象检查器转到右侧的第三个选项卡。
  3. 第一个选项名为:“Content”。将选择从“静态单元格”更改为“动态原型”。
  4. 确保正确设置单元格的标识符,并且它与您在“dequeueResableCellWithIdentifier”上使用的名称相同
  5. 它对我有用。我停止获得“零”单元格值,一切似乎都正常。

答案 3 :(得分:0)

如果“IF”语句对于以下内容变为true(cell == nil):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"] autorelease];
    }
    cell.textLabel.text = @"Title";
    return cell;
}

然后,名称@"myCell"拼写错误(不匹配)或从单元格的情节提要标识符字段中丢失。