我有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 - 1
到B - 5
。但是,在B - 3
之后,我看到的只有B - 1
和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====
现在当我完全向下滚动时,我得到如下的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。
<小时/>
注意:如果我将单元格的高度降低到100,我会看到所有按钮文本为B-1到B-5。
我所做的是,未使用标签并使用accessibilityValue,我正在获取按钮点击的ID。
答案 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]
。