swift - UITableViewCell 按钮和分段控件

标签 swift uitableview

我有一个 UITableView,带有针对人和动物的分段控件。第 1 段加载人,第 2 段加载动物。

在每个单元格内我都有一个添加按钮,应该分别添加人和动物。

@objc func addPerson(_ sender: UIButton){
    let buttonTag = sender.tag
    let point = sender.convert(CGPoint.zero, to: someTableView as UIView)
    let indexPath: IndexPath! = someTableView.indexPathForRow(at: point)
    let object = peopleArray[indexPath.row]
      print(“person added“)
}


@objc func addAnimal(_ sender: UIButton){
    let buttonTag = sender.tag
    let point = sender.convert(CGPoint.zero, to: someTableView as UIView)
    let indexPath: IndexPath! = someTableView.indexPathForRow(at: point)
    let object = animalsArray[indexPath.row]
    print(“animal added”)

}

func tableView(_ tableView:UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = someTableView.dequeueReusableCell(withIdentifier: “SomeTableViewCell") as? SomeTableViewCell else { return UITableViewCell() }

    switch segmentedControl.selectedSegmentIndex {
    case 0:
        let object = peopleArray[indexPath.row]


        cell.configureCell(//load some data)
        cell.add.tag=2
        cell.add.addTarget(self, action:#selector(self.addPerson(_:)), for: .touchUpInside)


    case 1:
        let object = animalsArray[indexPath.row]


       cell.configureCell(//some details)
        cell.add.tag=3
        cell.add.addTarget(self, action:#selector(self.addAnimal(_:)), for: .touchUpInside)

    default:
        break
    }


    return cell

}

 @IBAction func segmentedTapped(_ sender: Any) {
    someTableView.reloadData()
}

在 UITableViewCell 内,我设置了添加按钮,如下所示

@IBOutlet weak var add:UIButton!

当 View 加载并且我按“添加”按钮时,它会打印“已添加人员”,

如果我点击动物分段控件,它会加载动物,如果我点击添加动物,它会打印“已添加人员”“已添加动物”

如果我回到“人物”并按“添加人物”,它会打印“添加人物”“添加动物”。

为什么会发生这种情况?所需的行为是,当点击人员单元格内的添加来打印“添加了人”时,以及当点击动物单元格内的添加来打印“添加了动物”时

最佳答案

Why is this happening?

因为正在让它发生

请记住,单元格是可以重复使用的。因此这个add按钮可能已经存在于以前使用过的单元格中。在您的 cellForRowAt 中,您所说的 cell.add.addTarget(action:for:) 没有删除任何现有目标操作对>add 可能已经了。因此,您只需不断为 add 按钮堆积目标操作对。因此,单击add 按钮即可完成所有操作。

基本上你的整个架构都是不可取的。最好用两个不同的重复使用标识符来区分两种不同的细胞类型,这样用于动物的细胞就不会被重复用于人类。但即便如此,您也必须小心,不要将相同的目标操作对添加两次(或更多次),因为这会导致按下按钮两次(或更多次)调用您的操作方法。

关于swift - UITableViewCell 按钮和分段控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47099482/

相关文章:

ios - 如何使用 Swift 保存 TableView 中行的重新排序

ios - tableView beginUpdates/endUpdates block 重新加载整个表,即使为空

ios - 从 AppDelegate 调用 ViewController 的成员函数

swift - 在 Swift 中通过路线计算从用户到几个点的每个距离

swift - 搜索栏 textDidChange 错误

swift - 如何让单元格在我的 ViewController2 中打印?

ios - 初始化后不显示带有 Nib 的 UITableViewCell

swift - 如何在向前传递数据后将数据向后传递到 View Controller ?

swift - 返回集合的切片类型

swift - 修改参数值时使用filter{where :} vs. removeAll{where:}的效率