2014-01-13 99 views
0

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

,为了使被添加,在tableview:cellForRowAtIndexPath按钮之间进行区分,我改变按钮的标记是这样的:

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

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

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

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

+0

@格雷格试了一下,并没有解决问题。 – HusseinB

+1

在任何视图中使用'tag'永远不是一个好主意。这听起来像你应该使用'UITableViewCell'子类。 – Fogmeister

回答

0

你的问题是因为细胞重用

你在细节

问题您将按钮添加标签为6在您榫文件或情节串连图板,所以当表中创建一个新的电池它设置按钮标记为6。然后,您可以通过使用

[cell viewWithTag:6] 

这将正常工作的第5行(或显示在第一行,你需要滚动表之前),以获得该单元格。

滚动表格后,表格会显示一个“旧单元格”,该表格不再显示以更改其属性,但是您已经更改了该单元格中按钮的标签,因此您将不会能够与标签6拿到按钮,该按钮现在有标签(1000 + X),您以前设置

解决方案

该小区创建类,并添加一个IBOutlet该按钮,您可以使用IBOutlet这样的单元访问该单元

cell.button 

然后,一旦你有按钮,然后就可以设置标签容易

cell.button.tag = indexPath.row; 
+0

谢谢!它的工作,我应该永远记住继承。 – HusseinB

0

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

此外,最好是子类UIButton,添加到它的成员,将指向您的数组项目,并在按钮点击处理程序中使用此指针。

+0

当我将单元格中的按钮从storyboard链接到.h文件 – HusseinB

+0

@ user2176995时,该应用程序无法运行并出现错误“无法编译连接”,因此您需要与单元格建立连接,而不是使用tableviewcontroller。只有当它具有静态内容时,才可以与tableviewcontroller建立连接。 –

1

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

//扩展 如果你想知道按下了哪个按钮,哪个单元格可以添加方法按钮点击事件这样的:

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

我这样做是因为我从对象数组中填充表格视图单元格。当我点击按钮时,我想知道哪个单元被点击。正如我之前所说,在一个单元中有多个按钮,每个按钮都引用不同的数组。因此,我标记每个按钮并触发时,我知道从发件人的标记它属于哪个单元格。感谢您的输入。 – HusseinB

+0

@ user2176995请参阅扩展的答案希望这个帮助。 – Greg

+0

是的,我确实是这样做的,但是我正在受到可复用性的影响。我结束了UITableViewCell的子类化,并为它添加了一个IBOutlet。无论如何谢谢你的意见。 – HusseinB

相关问题