我有一个 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/