2

我知道还有很多其他关于 [indexPath row] 和滚动的问题,但是任何人都可以帮助我理解为什么它返回奇怪的数字吗?我似乎无法为我配置单元格的方式找到解决方法:

- (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 导航 [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 导航[8028:f803] 行: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 导航 [8028:f803] 行:0

每次用户滚动时,我的 labelName.text 和 labelInfo.text 都会发生变化。
但是,唯一受影响的单元格是底部的单元格。如何保持第 9 个单元格的 labelName 与 [indexPath row] 一致?

4

3 回答 3

1

这是使用 custom 的正确方法UITableViewCell


.h文件中:

@interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    UINib *profileCellNib;
}

// ...

@end

在您的.m文件中:

- (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:方法中设置正确的名称,而不是我的。

于 2012-08-26T09:53:20.210 回答
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:方法从缓存中检索设计。

于 2012-08-26T09:56:57.073 回答
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

编辑:我不确定为什么设置标签有效,但我原来的方法仍然会改变标签。有人可以解释吗?

于 2012-08-26T09:28:48.473 回答