【问题标题】:tableviewcell repeating uibuttonstableviewcell重复uibuttons
【发布时间】:2016-07-23 18:12:41
【问题描述】:

我在使用 tableview 上的按钮时遇到了一点问题。

我有一个用 3 个按钮自定义的 tableViewCell。我在界面生成器中将按钮设置为隐藏,当表格加载时,按钮按预期隐藏。

然后,我在调用 didSelectRow 时将 tableview 的 hidden 属性设置为 false,在调用 didDeselectRow 时将其设置为 hidden.true。这也很好。问题是在 didSelectRow 中设置为可见的按钮也每隔七个单元格可见。他们不断重复自己。

下面是显示按钮的代码

  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
   let cell = tableView.cellForRowAtIndexPath(indexPath) as! ContactsViewCell

            print("Table selected")

                cell.insertEmailButton.hidden = false
                cell.insertPhoneButton.hidden = false
                cell.insertAllButton.hidden = false
                cell.contactTextLabel.alpha = 0.2
                cell.contactDetailTextLabel.alpha = 0.2
        }

当 tableViewCell 被取消选择时,这会隐藏它们

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
        let cell = tableView.cellForRowAtIndexPath(indexPath) as! ContactsViewCell

        cell.insertEmailButton.hidden = true
        cell.insertPhoneButton.hidden = true
        cell.insertAllButton.hidden = true
        cell.contactTextLabel.alpha = 1.0
        cell.contactDetailTextLabel.alpha = 1.0  
    }

我做了一些研究,发现可能是buttons.hidden 设置为false 的行被tableview 重用了。但我从文档中了解到,被重用的单元格来自 cellForRowAtIndexPath 而不是 didSelectRow 处的单元格,我将 button.hidden 设置为 false。

我还尝试在 cellForRowAtIndexPath 的 if else 语句中使用 cell.isSelected 属性来隐藏和显示按钮,但这根本不显示按钮。

提前感谢您的帮助

【问题讨论】:

    标签: ios swift uitableview uibutton


    【解决方案1】:

    tableview 在表格滚动时重用单元格的视图,以节省内存。因此,例如,当您将按钮设置为可见(在 didSelectRow 内)然后向下滚动表格时,表格视图将获取顶部可见屏幕之外的单元格,并将在底部重用它们,以保存创建新单元的开销,提高性能。

    这就是为什么,您之前在单元格上的属性会重复。

    要在滚动单元格上获得所需的隐藏按钮,我建议将 button.hidden 设置为 true/false

    tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    

    每当新行滚动到可见视图区域时,这会将按钮设置为隐藏。

    希望这会有所帮助。

    【讨论】:

    • 谢谢。我确实在 cellForRowAtIndexPath 中使用了 if cell.isSelected 来设置按钮 true 和 false 的隐藏属性,但这根本没有显示按钮。
    • 你能提供更多关于你想要的结果的信息吗?
    • 没什么复杂的。我只想要一个带有联系人的表格视图,当点击一个单元格时,标题和副标题会淡出,并显示 3 个按钮。当另一个单元格被选中时,初始单元格恢复其 alpha 并隐藏按钮,而新选择的单元格显示按钮并淡化标题。
    【解决方案2】:

    当我检查单元格是否在 cellForRowAtIndexPath 中被取消选择时,我通过隐藏它们来解决重复出现的按钮。这也意味着我选择的任何单元格都将失去其选定状态,并且当它离开视图时按钮将消失。 我可以忍受这一点。

       if cell.selected == false{
           cell.emailButton.hidden = true
           cell.phoneButton.hidden = true
           cell.allButton.hidden = true
        }
    

    【讨论】:

      【解决方案3】:

      UITableView 重用其单元格以提高性能。所以,你不能做你正在尝试的方式。我们要做的是,像其他 tableview 单元格信息一样,例如标题、描述、缩略图等,我们还需要在数组中保存按钮的状态。当您想隐藏单元格的按钮时,请从数组的索引处获取对象并更改按钮的按钮状态并重新加载该表格视图单元格。不过,如果您遇到问题或难以理解,请随时提问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 2019-09-17
        • 2023-03-19
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多