-2

我是 iOS 开发的新手。我不明白 tableView 的行为。
为了测试它,我制作了两个简单的 tableView 应用程序,如果用户向下滚动到 tableView 的末尾,我在两种情况下都使用标准代码片段加载了 99999 行的 tableView。


应用 1:TableViewWithStoryBoard cellForRowAtIndexPath:代码片段

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; // for StoryBoard

if (cell == nil)
{
    static int i;
    NSLog(@"New Cells created: %d ",++i);    

  cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

// Configure the cell...

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

return cell;

}

问题1: 如果我删除

forIndexPath:indexPath from 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; // for StoryBoard

那么 StoryBoard 在模拟器中仍然可以正常工作吗?那为什么提供呢?

问题2: 为什么NSLog(@"New Cells created: %d",++i); 即使我向下滚动到 tableView 末尾的 99999 行,也永远不会打印?在什么情况下 NSLog 会打印一些值?



应用 2:TableViewWithNib cellForRowAtIndexPath:代码片段

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// for Nib File

if (cell == nil)
{

    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

// Configure the cell...

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

return cell;

}

问题3: 如果我添加

forIndexPath:indexPath

在 XIB 版本中,然后我的应用程序崩溃并引发异常?为什么会这样?

异常或错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法使具有标识符 Cell 的单元格出列 - 必须为标识符注册 nib 或类或连接情节提要中的原型单元格”

4

1 回答 1

0

问题 2:NSLog在创建第一行时第一次打印(我已经使用示例项目进行了测试,并且在 iPad 上打印了 24 次),其余时间没有打印,因为单元格已经存在并重复使用它们.

问题1&3:在iOS 6forIndexPath:indexPathdequeueReusableCellWithIdentifier是新的,您必须为标识符注册一个单元格xib或自定义UITableViewCell类,或者在情节提要中连接一个原型单元格才能使用它。

于 2013-03-15T15:08:15.440 回答