我正在阅读Big Nerd Ranch iOS指南,我对这段代码有疑问:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
}
BNRItem *p = [[[BNRItemStore sharedStore] allItems] objectAtIndex:[indexPath row]];
[[cell textLabel] setText:[p description]];
return cell;
}
BNRItemStore只是一个数据存储对象,我已经在初始化方法中添加了五个BNRItem对象。然后将它们的字符串描述打印到UI。我特别关注这一点:
BNRItem *p = [[[BNRItemStore sharedStore] allItems] objectAtIndex:[indexPath row]];
我理解这一行的方式是objectAtIndex:只检索BNRItemStore中的项并将它们分配给变量。我的问题是:
objectAtIndex:如何使用参数[indexPath row]将所有五个对象返回到变量* p?我的印象是indexPath对象包含单个部分和单个行。因此row属性只返回单行索引。这里看起来数组正在循环,它的5个内容返回到变量,然后打印到UI。或者这不是正在发生的事情?行属性实际上在这里做什么?
答案 0 :(得分:1)
您的理解是正确的。 NSIndexPath封装了一个部分和一行。我认为你的困惑是BNRItem *p
没有指向所有5个项目(它一次只指向一个项目)...而是为每个显示的行调用方法tableView:cellForRowAtIndexPath:
表视图。
还有另一种叫做tableView:numberOfRowsInSection:
的方法。我假设此方法返回数字5,因此tableView:cellForRowAtIndexPath:
被调用5次...每次indexPath将有不同的行,从而打印不同的对象。