我知道还有很多关于[indexPath行]和滚动的问题,但有人能帮我理解为什么它会返回奇怪的数字吗?我似乎无法弄清楚我配置单元格的方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ProfileIdentifier";
NSUInteger row = [indexPath row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil){
//My custom xib file is named "ProfileCell.xib"
[[NSBundle mainBundle] loadNibNamed:@"ProfileCell" owner:self options:nil];
cell = profileCell;
self.profileCell = nil;
}
//name and info are both of type NSArray
labelName.text = [name objectAtIndex:row];
labelInfo.text = [info objectAtIndex:row];
NSLog(@"Row: %d", row);
return cell;
}
控制台在加载时返回:
2012-08-26 09:09:10.966 Nav [8028:f803]行:0
2012-08-26 09:09:10.983导航[8028:f803]行:1
2012-08-26 09:09:10.986导航[8028:f803]行:2
2012-08-26 09:09:10.996导航[8028:f803]行:3
2012-08-26 09:09:10.999导航[8028:f803]行:4
2012-08-26 09:09:11.002导航[8028:f803]行:5
2012-08-26 09:09:11.004导航[8028:f803]行:6
2012-08-26 09:09:11.007导航[8028:f803]行:7
2012-08-26 09:09:11.010导航[8028:f803]行:8
2012-08-26 09:09:11.012导航[8028:f803]行:9
当我向下滚动到屏幕外的单元格时,它会返回此信息:
2012-08-26 09:09:12.354 Nav [8028:f803] Row:3
2012-08-26 09:09:12.404导航[8028:f803]行:2
2012-08-26 09:09:12.471导航[8028:f803]行:1
2012-08-26 09:09:12.622 Nav [8028:f803] Row:0
每次用户滚动时,我的labelName.text和labelInfo.text都会发生变化 然而,唯一受影响的细胞是底部细胞。如何保持第9个单元格的labelName与[indexPath row]保持一致?
答案 0 :(得分:1)
这是使用自定义UITableViewCell
的正确方法:
:
@interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
UINib *profileCellNib;
}
// ...
@end
:
- (void)viewDidLoad {
profileCellNib = [UINib nibWithNibName:@"ProfileCell" bundle:nil];
}
// ...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ProfileIdentifier";
NSUInteger row = [indexPath row];
UIProfileCell *cell = (UIProfileCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil) cell = [[UINib instantiateWithOwner:self options:nil] objectAtIndex:0];
cell.labelName.text = [name objectAtIndex:row];
cell.labelInfo.text = [info objectAtIndex:row];
NSLog(@"Row: %d", row);
return cell;
}
我假设UIProfileCell
是来自UITableViewCell
的继承类,也许您正在为自定义单元格视图使用其他名称,在这种情况下,您应该在-tableView:cellForRowAtIndexPath:
方法中设置正确的名称而不是我的。
答案 1 :(得分:1)
整个缓存机制设置错误。
此处的相关代码:
[[NSBundle mainBundle] loadNibNamed:@"ProfileCell" owner:self options:nil];
cell = profileCell; // profile cell is most likely nil here, you set cell to nil?
self.profileCell = nil; // if profile cell wasn't nil, it will surely be nil next pass.
我敢打赌,如果您在-tableView:cellForRowAtIndexPath:
中记录初始化代码,您将看到每个单元格都被重新创建而不是从缓存中返回。在您的情况下,对于正在显示的第一个单元格,初始化应该只发生一次。对于每个其他单元,应使用-dequeueReusableCellWithIdentifier:
方法从缓存中检索设计。
答案 2 :(得分:0)
没关系,我想办法解决:
我用标签设置每个标签。然后像这样编辑代码:
//labelName.text = [name objectAtIndex:row];
//labelInffo.text = [info objectAtIndex:row];
替换为:
UILabel *label;
label = (UILabel *)[cell viewWithTag:1];
label.text = [name objectAtIndex:row];
label = (UILabel *)[cell viewWithTag:2];
label.text = [info objectAtIndex:row];
希望这有助于任何决定通过数组修改标签的人:x
编辑:我不确定为什么设置标签有效,但我的原始方法仍然会更改标签。有人可以解释一下吗?