UITableView中的重用问题

时间:2013-07-28 20:36:23

标签: ios objective-c uitableview reuseidentifier

我有UITableView,涵盖整个屏幕(480px)。

每个细胞高度为300px。

我总共有5行。

以下是我使用的代码。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
    if (cell==nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MainCell"];
    }

    UIButton *myButton = (UIButton *)[cell viewWithTag:999999999];
    int i = indexPath.row+1;
    myButton.tag = i;
    myButton.titleLabel.text = [NSString stringWithFormat:@"B - %d", i];
    [myButton setTitle:[NSString stringWithFormat:@"B - %d", i] forState:UIControlStateNormal];
    NSLog(@"tag set is %d & text for button is =====B-%d====", i,i);
    [myButton addTarget:self action:@selector(btnSelected:) forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

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


-(IBAction)btnSelected:(id)sender {
    UIButton *button = (UIButton *)sender;
    NSLog(@"my tag after click is ===%d", [button tag]);
}

现在,当我运行此代码时,我希望每个单元格都会写B - 1B - 5。但是,在B - 3之后,我看到的只有B - 1B- 2

NSLog如下所示。

2013-07-28 23:31:34.281 NewTest[1783:11303] tag set is 1 & text for button is =====B-1====
2013-07-28 23:31:34.284 NewTest[1783:11303] tag set is 2 & text for button is =====B-2====

现在当我完全向下滚动时,我得到如下的NSLog。

2013-07-28 23:31:34.281 NewTest[1783:11303] tag set is 1 & text for button is =====B-1====
2013-07-28 23:31:34.284 NewTest[1783:11303] tag set is 2 & text for button is =====B-2====
2013-07-28 23:32:03.643 NewTest[1783:11303] tag set is 3 & text for button is =====B-3====
2013-07-28 23:32:03.719 NewTest[1783:11303] tag set is 4 & text for button is =====B-4====
2013-07-28 23:32:03.835 NewTest[1783:11303] tag set is 5 & text for button is =====B-5====

现在,当标签和文字设置正确时,为什么我将最后两个按钮视为B-1和B-2而不是B-4和B-5。

知道如何解决这个问题吗?

截屏1

enter image description here

截屏2

enter image description here

截屏3

enter image description here

<小时/>

任何想法如何解决这个问题,以便我写B-1到B-5?


注意:如果我将单元格的高度降低到100,我会看到所有按钮文本为B-1到B-5。

此问题与my old question有关,但这是更简单的版本。

Sample Project


我所做的是,未使用标签并使用accessibilityValue,我正在获取按钮点击的ID。

1 个答案:

答案 0 :(得分:3)

向下滚动时,表格视图将重复使用不再可见的单元格,因为它需要显示其他单元格。这种情况第一次发生在细胞“B-3”上。由于表视图正在重用单元格,因此单元格中按钮的tag先前已由您的代码设置为某个数字(可能为1)。因此,viewWithTag:999999999将返回nil。您的NSLog语句将使其看起来正常工作,但实际上您正在尝试在nil按钮上设置标题,因此重用单元格中的按钮不会使用正确的标题更新。

对于解决方案:您可以使用属性

创建UITableViewCell的自定义子类
@property (nonatomic, weak) IBOutlet UIButton *button;

在故事板或xib中连接到你的按钮。或者,如果有必要,您可以在单元格的awakeFromNib或init方法中以编程方式执行此操作。现在,您可以直接引用cell.button而不是[cell viewWithTag:9999999]