1

我有覆盖整个屏幕(480px)的 UITableView。

每个单元格的高度为 300 像素。

我总共有 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 - 1编写B - 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

在此处输入图像描述

截图 2

在此处输入图像描述

截图 3

在此处输入图像描述


知道如何解决这个问题,以便我写 B-1 到 B-5 吗?


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

这个问题与我的旧问题有关,但这是一个更简单的版本。

示例项目


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

4

1 回答 1

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].

于 2013-07-28T20:42:49.023 回答