swift4.0 cell重用导致ReactiveCocoa(RAC) cell上Button点击事件多次触发问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift4.0 cell重用导致ReactiveCocoa(RAC) cell上Button点击事件多次触发问题相关的知识,希望对你有一定的参考价值。

参考技术A 在UITableview等涉及cell的重用的界面中,cell上的按钮点击事件RAC响应会随着cell的重用多次触发,并导致cell无法释放
cell上添加按钮

在cell对象中触发按钮的RAC点击事件

在不滚动界面的情况下点价按钮只响应了一次

滚动界面后点击按钮,直接打印了四个log

这个问题是由于cell重用导致的,需要解除signal在重用时的绑定。

滚动界面触发按钮事件查看log

嘿嘿,只有一次啦,成功解决

如何在 Swift 2.0 中使用标签将 TextField 添加到 Cell

【中文标题】如何在 Swift 2.0 中使用标签将 TextField 添加到 Cell【英文标题】:How to add TextField to Cell using tags in Swift 2.0 【发布时间】:2015-11-23 15:52:03 【问题描述】:

我希望表格的第一行有一个带有 TextField 的单元格(在我的例子中名为 FindTextField)。 我实现的方式(见下面的代码),因为单元格被重用,如果单元格列表向下滚动,那么更多的单元格将被分配给 TextField。我想知道如何使用标签或任何其他允许强制只有第一行才有 TextField 的东西,即使用户一直向下滚动然后向上滚动。

现在,这里是代码:

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

        let cell = tableView.dequeueReusableCellWithIdentifier("identifier",
            forIndexPath: indexPath) as UITableViewCell

        if indexPath.row == 0 
            FindTextField.frame = CGRectMake(74, 4, cell.bounds.width - 78 , cell.bounds.height - 8)
            FindTextField.hidden = false
            FindTextField.placeholder = "Find"
            FindTextField.font = UIFont.systemFontOfSize(20)
            FindTextField.borderStyle = UITextBorderStyle.RoundedRect
            FindTextField.autocorrectionType = UITextAutocorrectionType.No
            FindTextField.keyboardType = UIKeyboardType.Default
            FindTextField.returnKeyType = UIReturnKeyType.Done
            FindTextField.clearButtonMode = UITextFieldViewMode.WhileEditing;
            FindTextField.contentVerticalAlignment = UIControlContentVerticalAlignment.Center
            FindTextField.delegate = self
            FindTextField.autocapitalizationType = .AllCharacters
            cell.contentView.addSubview(FindTextField)
            cell.imageView?.image = UIImage(named: "menu_find.png")
            cell.textLabel?.hidden = true
        

        cell.textLabel!.text = StationsChatList[indexPath.row]
        cell.textLabel!.font = UIFont.systemFontOfSize(24)
        cell.textLabel?.textColor = UIColor.whiteColor()
        cell.textLabel?.backgroundColor = UIColor.blackColor()
        cell.backgroundColor = UIColor.blackColor()

        cell.layer.borderWidth = 1.0
        cell.layer.borderColor = UIColor.darkGrayColor().CGColor

        return cell


【问题讨论】:

为什么要使用标签?创建两个自定义单元格,一个带有UITextField,一个没有。将带有 indexPath 0 的文本字段的单元格和所有其他 indexPaths 的没有文本字段的单元格出列。 【参考方案1】:

您可以将tag 分配给您的textField,然后再访问它。当row != 0 简单地隐藏它。这就是我要说的:

if cell.viewWithTag(1001) == nil  // init your text field
  FindTextField.frame = ...
  FindTextField.tag = 1001 // or whatever you want
  ...

cell.viewWithTag(1001)?.hidden = indexPath.row != 0
...

还有另一种方法 - 在您的单元格中实现prepareForReuse() 方法并手动隐藏FindTextField(它将为每个单元格隐藏)。稍后在cellForRow 中使其可见,如果row == 0

【讨论】:

以上是关于swift4.0 cell重用导致ReactiveCocoa(RAC) cell上Button点击事件多次触发问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS-cell的重用机制

iOS中cell的重用

Cell的重用原理

重用cell的两种方法

iOS开发之 cell重用后内容错乱

自定义的cell上面有图片时,如果产生了重用,图片可能会错乱问题