在tableview单元格中标记按钮

时间:2014-01-13 10:03:14

标签: ios objective-c

在我的应用程序中,我有一个表视图。在表视图的每个单元格中,必须有一个按钮,该按钮应链接到单独数组中的对象。在故事板中,我将按钮的标记设置为数字6(用于填充表格时的配置)。

现在,为了区分添加的按钮,在tableview:cellForRowAtIndexPath中,我更改按钮的标记,如下所示:

[(UIButton*)[cell viewWithTag:6] setTag:1000+indexPath.row];

因此,当单击一个按钮时,我减去1000并知道它应该指向数组的索引。问题是,当我执行此标记时,只有几个按钮被标记,其他按钮在代码中显示为空(但是当我运行应用程序时它们会出现)。

为什么会这样?有没有办法将单元格中的一组按钮引用到数组? 注意:我这样做不是为了选择表格单元格,我知道我可以实现它。但是我在一个单元格中有多个按钮。

这是调试器的图片。 PRE表示标记之前,并在标记单元格中的按钮后“添加”。正如您所看到的,前5个被标记,其他5个开始显示为null。请注意,所有这些按钮都在表格的同一部分中。 enter image description here

3 个答案:

答案 0 :(得分:1)

它不会起作用,因为当你调用setTag时,当视图可见时,你的单元格的标签会被设置,但是当你滚动表格视图并且单元格离开屏幕时,它会被放到可重复使用的池中,如果单元格是可见的再次,它取自可重复使用的池,并将具有标记6,您已在故事板中设置。 我不知道你试图实现什么,但如果你知道它总是1000 + indexPath.row,你为什么要设置标签? 您还应该将[cell viewWithTag:6]更改为[cell.contentView viewWithTag:6],直接将子视图添加到contentView而不是单元格。

// EXTENDED 如果你想知道按下了什么按钮,你可以在哪个单元格中添加方法,如下所示:

- (IBAction)buttonPressed:(id)sender {
    //Button pressed
    UIButton *pressedButton = (UIButton*)sender;
    // Cell on which the button was pressed
    UITableViewCell *cell = (UITableViewCell*)[[[sender superview] superview] superview];
}

答案 1 :(得分:0)

您正在使用故事板。为什么使用viewWithTag代替IBOutlet?它在Storyboard中播种方便。

最好继承UIButton,添加成员,指向你的数组中的项目,并在按钮点击处理程序中使用此指针。

答案 2 :(得分:0)

您的问题是由于细胞重用

您的问题详情

您在nib文件或故事板中将按钮标记添加为6,因此当表创建新单元格时,它将按钮标记设置为6.然后您可以使用

获取该单元格
[cell viewWithTag:6]

这对于前5行(或者在您需要滚动表格之前显示的第一行)可以正常工作。

滚动表后,表格将会显示一个“旧单元格”,不再显示它以更改其属性,但是您已经更改了该单元格中按钮的标记,因此您将无法获得带有标签6的按钮,因为该按钮现在具有您之前设置的标签(1000 + x)

解决方案

为该单元格创建类并为该按钮添加IBOutlet,以便您可以使用此IBOutlet访问该单元格

cell.button

然后,一旦有了按钮,就可以轻松设置标签

cell.button.tag = indexPath.row;