我在我的故事板中放了一个tableview,并用一个标有“0”的按钮填充单元格。我使用数组填充了tableview。我只想说我的数组中有20个元素,这使得它在tableview上有20个单元格。这是我用来为每个单元格上的按钮添加标签的代码。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (tableView == _tblCart) {
static NSString *cellIdentifier = @"CartCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
cell.selectionStyle = UITableViewCellSelectionStyleGray;
UIButton *btn = (UIButton *)[cell viewWithTag:0];
[btn setTag:indexPath.row];
[btn addTarget:self action:@selector(logTag:) forControlEvents:UIControlEventTouchUpInside];
return cell;
}
return nil;
}
我认为我的代码运行得很好,但实际上有些问题。在单元格0-5上,按钮标记是正确的。在下面的单元格中,标签将再次重置为0.我做错了什么?
答案 0 :(得分:1)
不要将0设置为视图的标记标识符 默认情况下,所有UIViews都有一个标签。
所以
[cell viewWithTag:0];
可能会返回单元格的contentView
。
答案 1 :(得分:1)
这里还有另一个逻辑问题,你正在重用表格单元格,其中一些你已经将按钮的标签更改为0以外的其他东西。所以如果你得到一个重复使用的tablecell,那么将会有一段时间UIButton
的标签不会为零,因此您无法正确更改。
答案 2 :(得分:0)
Flexicoder和l0gg3r都是正确的。此外,在我看来,依赖按钮的标签作为行标识符是一个笨重的解决方法。考虑这种方法:
- (void)logTag:(UIButton *)sender {
NSIndexPath *indexPath = [_tblCart indexPathForRowAtPoint:[_tblCart convertPoint:sender.center fromView:sender]];
// do your stuff knowing which indexPath the button belongs to
}