在我的应用程序中,我有一个表视图。在表视图的每个单元格中,必须有一个按钮,该按钮应链接到单独数组中的对象。在故事板中,我将按钮的标记设置为数字6(用于填充表格时的配置)。
现在,为了区分添加的按钮,在tableview:cellForRowAtIndexPath
中,我更改按钮的标记,如下所示:
[(UIButton*)[cell viewWithTag:6] setTag:1000+indexPath.row];
因此,当单击一个按钮时,我减去1000并知道它应该指向数组的索引。问题是,当我执行此标记时,只有几个按钮被标记,其他按钮在代码中显示为空(但是当我运行应用程序时它们会出现)。
为什么会这样?有没有办法将单元格中的一组按钮引用到数组? 注意:我这样做不是为了选择表格单元格,我知道我可以实现它。但是我在一个单元格中有多个按钮。
这是调试器的图片。 PRE表示标记之前,并在标记单元格中的按钮后“添加”。正如您所看到的,前5个被标记,其他5个开始显示为null。请注意,所有这些按钮都在表格的同一部分中。
答案 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;