-4

好的,我正在使用目标 c 创建表视图,但数据源无法正常工作......

我的错误:

2012-06-02 20:14:39.891 Dot Golf Scoring[195:707] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit/UIKit-1914.85/UITableView.m:6061
2012-06-02 20:14:39.895 Dot Golf Scoring[195:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

我的代码:

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 16;
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return @"Comments On Your Round";
}

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    cell.textLabel.text = @"Text Label";

    return cell;
}

为什么表格视图没有被这些假数据填满???

4

2 回答 2

7

您永远不会初始化单元格。使用此代码:

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

{


    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:@"UITableViewCell"];


    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:@"UITableViewCell"]
                autorelease];


        cell.textLabel.text = nil;                


    }

    if (cell) {

        //customization 
        cell.textLabel.text = @"Text Label";
    }

    return cell;
}

你说你是菜鸟....让我解释一下首先尝试拿起书:

大书呆子牧场指南

你在想的是出队基本上是初始化对吗?不!出队基本上是清除任何不可见的单元格,也就是滚动过去。因此,cell == nil可能会在四种情况下调用(我能想到的):

  1. 当我们第一次设置表格视图时(单元格将为零)
  2. 当我们重新加载数据时
  3. 每当我们可能到达这个班级
  4. 当单元格从表格视图中变得不可见时

因此,出队的标识符就像一个 ID。然后在看if cellis的语句中nil,我们初始化cell,可以看到被覆盖的init方法:initWithStyle。这就是cell存在的类型,您可以自定义具有不同变量的不同类型。我向你展示了默认值。然后我们使用reuseIdentifier我们之前所说的出列标识符。他们必须匹配!我 niltextLabel只是为了更好的结构,在这种情况下,每个单元格都有相同的文本,所以这并不重要。它使出队的单元格以您实施的正确自定义返回。然后一旦单元格实际有效,我们就可以自定义。

此外,您对每个单元格使用相同的文本。如果您确实想为每个单元格设置不同的文本,请熟悉NSArray. 然后你可以提供数组,然后做这样的count事情numberOfRowsForSection

cell.textLabel.text = [array objectAtIndex: [indexPath row]];

indexPath方法中提供的NSIndexPath参数在哪里cellForRowAtIndexPathrow变量是数字,row所以一切都合适!

哇,有很多东西要接受!现在不要再做一个客观的菜鸟了,开始读一些书吧!

欲了解更多信息,请阅读:

表查看 Apple 文档

于 2012-06-03T00:30:42.010 回答
3

我认为您没有阅读Table View Programming Guide或了解 UITableViews 的重用机制;)

UITableViews 中的单元格被重用/回收,以避免每次需要单元格时重新分配 UITableViewCell 类的实例。这是因为 UITableView 需要大量的响应性,尤其是在滚动 tableview 时,因为滚动需要快速,并且每次分配一个新的 UITableViewCell 实例会使 tableview 在创建实例时挂起一秒钟。

所以 UITableViewCell 重用机制背后的想法是分配最少数量的单元格,并且每次您需要一个单元格时,尝试重用/回收以前分配但不再是用户的单元格(因为它在您滚动后就在屏幕外)。 但是如果没有可以重复使用的单元格,您需要自己分配一个!. 您忘记在代码中执行此部分,这就是您最终返回一个nil单元格的原因,这会引发异常。


因此,执行此操作的典型代码是:

static NSString* kCellId = @"Cell";
// First, try to reuse a cell that was previously allocated
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:kCellId];

// here, if a cell is returned, that means that we have an old cell
// that was used before but is no longer onscreen (so we can recycle it
// and just actualize its content)
// but if cell is nil, this means the UITableView didn't have a cell available to reuse
// so we need to create a new one
if (cell == nil)
{
   // So if we didn't have a old cell ready to reuse that have been returned, create one
   cell = [[[UITableViewCell alloc] initWithReusableIdentifier:kCellId] autorelease];
   // And configure every properties of the cell that will be common to every cell
   // and won't change even if the cell is recycled, eg:
   cell.textLabel.textColor = [UIColor redColor];
   cell.textLabel.font = [UIFont boldSystemFontOfSize:12];
   // etc
}
// And at this point, we have a cell, either newly created or that have been recycled
// So we configure every property that is row-dependant and change for each row, eg:
cell.textLabel.text = [myTextsArray objectAtIndex:indexPath.row];

注意:我从未使用过故事板,但 AFAIK,当您使用故事板时,您不需要使用“if”语句并在没有可重复使用的单元格可用时创建单元格,因为故事板将使用您的单元格设计为您创建它故事板。但这是唯一不需要自己分配单元的情况。

于 2012-06-03T00:33:13.777 回答