【问题标题】:tagging buttons in tableview cells在表格视图单元格中标记按钮
【发布时间】:2014-02-01 00:44:02
【问题描述】:

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

现在,为了区分添加的按钮,在tableview:cellForRowAtIndexPath 中,我像这样更改按钮的标记:

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

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

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

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

【问题讨论】:

  • @Greg 试过了,没有解决问题。
  • 在任何视图中使用tag 绝不是一个好主意。听起来您应该使用UITableViewCell 子类。

标签: ios objective-c


【解决方案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];
}

【讨论】:

  • 我这样做是因为我正在从对象数组中填充我的表格视图单元格。当我点击按钮时,我想知道点击了哪个单元格。正如我之前所说,一个单元格中有多个按钮,每个按钮引用一个不同的数组。因此,我标记了每个按钮,当一个按钮被触发时,我从发件人的标签中知道它属于哪个单元格。感谢您的意见。
  • @user2176995 请查看扩展答案希望对您有所帮助。
  • 是的,我实际上正在这样做,但正如您所说,我受到了可重用性的影响。我最终将 UITableViewCell 子类化并为按钮添加了一个 IBOutlet 。无论如何,谢谢您的意见。
【解决方案2】:

你的问题是因为细胞重用

您的问题详情

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

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

这适用于前 5 行(或在您需要滚动表格之前显示的第一行)。

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

解决方案

为该单元格创建类并为该按钮添加一个IBOutlet,以便您可以像这样使用IBOutlet 访问该单元格

cell.button

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

cell.button.tag = indexPath.row;

【讨论】:

  • 谢谢!它的工作我应该始终牢记子类化。
【解决方案3】:

您正在使用情节提要。为什么你使用 viewWithTag 而不是 IBOutlet?在 Storyboard 中很方便。

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

【讨论】:

  • 当我将单元格中的按钮从情节提要链接到 .h 文件时,应用程序无法运行并给出错误“无法编译连接”
  • @user2176995,您需要与单元格建立连接,而不是与 tableviewcontroller。只有当它具有静态内容时,您才能与 tableviewcontroller 建立连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
相关资源
最近更新 更多