我有一个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!
当视图加载并按我添加的人时,它会打印“添加的人”,
如果我点击动物分段控制它会加载动物,如果我点击添加动物它打印“添加的人”“动物添加”
如果我回到人们并按人加上它会打印“添加的人”,“动物添加”。
为什么会这样?期望的行为是当人物细胞内的添加物被轻拍以打印“添加的人物”时以及当动物中的添加物被点击以打印“动物添加物”时
答案 0 :(得分:0)
为什么会这样?
因为你 正在制作。
请记住,细胞会被重复使用。因此,此add
按钮可能已存在于先前使用的单元格中。在您的cellForRowAt
中,您说cell.add.addTarget(action:for:)
而不删除add
已经已经拥有的现有目标 - 操作对。因此,您只需继续为add
按钮堆积目标 - 操作对。因此,单击add
按钮可以完成所有操作。
基本上你的整个架构都是不受欢迎的。你最好有两种不同的细胞类型,它们由两种不同的重用标识符区分,因此用于动物的细胞不会被人们重复使用。但即便如此,你必须小心不要两次(或更多)添加相同的目标 - 动作对,因为这会导致按下按钮两次(或更多)调用你的动作方法。
答案 1 :(得分:0)
所以,正如马特所说,我没有删除目标 - 行动对。
一种解决方案是避免将两个函数链接到一个按钮并分别打印一个语句,我现在有一个函数链接到一个按钮。根据按钮标签的功能,它将打印相应的声明。
@objc func add(_ sender: UIButton){
switch sender.tag {
case 0:
print("person added")
case 1:
print("animal added")
default:
break;
}
}
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=0
cell.add.addTarget(self, action:#selector(self.add(_:)), for: .touchUpInside)
case 1:
let object = animalsArray[indexPath.row]
cell.configureCell(//some details)
cell.add.tag=1
cell.add.addTarget(self, action:#selector(self.add(_:)), for: .touchUpInside)
default:
break
}
return cell
}
@IBAction func segmentedTapped(_ sender: Any) {
someTableView.reloadData()
}
答案 2 :(得分:0)
你尝试的方式是错误的,因为它总会给你标记0和1.所以这是完美的方法 导入UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
@IBOutlet weak var tableview: UITableView!
@IBOutlet weak var segmentedControl: UISegmentedControl!
var peopleArray = ["Mark", "Lee", "John", "Bang", "Mich"]
var animalArray = ["cat", "Dog", "cow", "rat", "Tiger"]
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return peopleArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "tvc", for: indexPath) as! tvc
switch segmentedControl.selectedSegmentIndex{
case 0:
let object = peopleArray[indexPath.row]
cell.label.text = object
//cell.del.tag = 0
cell.del.tag = indexPath.row
cell.del.addTarget(self, action:#selector(self.add(_:)), for: .touchUpInside)
case 1:
let object = animalArray[indexPath.row]
cell.label.text = object
//cell.del.tag = 1
cell.del.tag = indexPath.row
cell.del.addTarget(self, action:#selector(self.add(_:)), for: .touchUpInside)
default:
break
}
return cell
}
@IBAction func segmentedTapped(_ sender: Any) {
tableview.reloadData()
}
@objc func add(_ sender: UIButton){
switch segmentedControl.selectedSegmentIndex{
case 0:
print("person added:\(peopleArray[sender.tag])")
case 1:
print("animal added:\(animalArray[sender.tag])")
default:
break;
}
}
}
class tvc: UITableViewCell{
@IBOutlet weak var del: UIButton!
@IBOutlet weak var label: UILabel!
}