即使完全重写了这个视图控制器,我仍然在表视图的最后两个部分中遇到2个按钮的问题。我有2个按钮,其中一个在第3部分,另一个在第4部分(tableview只有5个部分,所以这些是最后2个)这两个按钮在点击时都有类似的功能,他们在该部分添加了1个额外的项目。问题是,当我单击其中一个按钮时,它工作正常,直到我选择另一个(除了它们在同一个tableview中的事实之外没有任何连接)当我点击另一个时,它在其部分添加1喜欢它应该然后将1加到另一部分。我已经尝试检查目标的数量,看看它是否可以将两个按钮的功能添加到其中一个按钮但是即使我只有一个目标,这两个功能仍然被调用...我已经尝试了几乎所有我可以想到任何帮助将不胜感激(很抱歉没有发布任何代码,它是一个非常复杂的swift文件让我知道你想看到什么,我会编辑这个答案)。
编辑 - 这是我为UITableViews第4部分提供的cellForRowAt(第3部分和第3部分在cellForRowAt中除了一些命名差异之外是相同的)
} else {
if indexPath.row == 0 {
cell = tableView.dequeueReusableCell(withIdentifier: "Section Card", for: indexPath)
let positionsSectionCard = cell.contentView.viewWithTag(1) as! UILabel
positionsSectionCard.text = "Positions"
} else if indexPath.row == 1 {
cell = tableView.dequeueReusableCell(withIdentifier: "Picker Cell", for: indexPath)
let positionPicker = cell.contentView.subviews[0].subviews[1].subviews[0] as! UIPickerView
let addPositionButton = cell.contentView.viewWithTag(4) as! UIButton
let positionList = Array(positions.keys).sorted()
var positionCounter = 0
var enabledPositionsCounter = 0
positionPicker.dataSource = self
positionPicker.delegate = self
while positionCounter < positionList.count {
if positions[positionList[positionCounter]]! {
enabledPositionsCounter = enabledPositionsCounter + 1
}
positionCounter = positionCounter + 1
}
if enabledPositionsCounter == positions.count {
addPositionButton.isEnabled = false
addPositionButton.setTitleColor(UIColor.gray, for: .normal)
} else {
addPositionButton.isEnabled = true
addPositionButton.setTitleColor(UIColor.white, for: .normal)
}
addPositionButton.titleLabel?.numberOfLines = 2
addPositionButton.titleLabel?.textAlignment = NSTextAlignment.center
addPositionButton.setTitle("Add\nPosition", for: .normal)
addPositionButton.addTarget(self, action: #selector(addPosition), for: .touchUpInside)
} else {
cell = tableView.dequeueReusableCell(withIdentifier: "Item Card", for: indexPath)
let positionLabel = cell.contentView.viewWithTag(1) as! UILabel
let removePositionButton = cell.contentView.viewWithTag(2) as! UIButton
let positionList = Array(positions.keys).sorted()
var positionCounter = 0
var usedPositionsList: [String] = []
positionLabel.adjustsFontSizeToFitWidth = true
positionLabel.numberOfLines = 2
if eventSettingsTableView.numberOfRows(inSection: 4) < 4 {
while positionCounter < positionList.count {
if positions[positionList[positionCounter]]! {
positionLabel.text = positionList[positionCounter]
}
positionCounter = positionCounter + 1
}
} else {
while positionCounter < eventSettingsTableView.numberOfRows(inSection: 4) {
if eventSettingsTableView.cellForRow(at: IndexPath(row: positionCounter + 2, section: 4))?.contentView.subviews[0].subviews[1].subviews[0] != nil {
print((eventSettingsTableView.cellForRow(at: IndexPath(row: positionCounter + 2, section: 4))?.contentView.subviews[0].subviews[1].subviews[0] as! UILabel).text!)
usedPositionsList.append((eventSettingsTableView.cellForRow(at: IndexPath(row: positionCounter + 2, section: 4))?.contentView.subviews[0].subviews[1].subviews[0] as! UILabel).text!)
}
positionCounter = positionCounter + 1
}
positionCounter = 0
while positionCounter < positionList.count {
if !usedPositionsList.contains(positionList[positionCounter]) && positions[positionList[positionCounter]]! {
positionLabel.text = positionList[positionCounter]
}
positionCounter = positionCounter + 1
}
removePositionButton.addTarget(self, action: #selector(removePosition(_:)), for: .touchUpInside)
}
}
答案 0 :(得分:2)
表格视图重用单元格。基本上,当单元格离开屏幕时,它会在进入屏幕时重复使用(如果它们具有相同的重用标识符)。只要表视图需要一个单元格,就会多次调用tableView(_:cellForRowAt:)
。它甚至可以被多次调用同一个细胞(如果它离开视野然后重新进入)。
这一行或类似的其他人正在向同一个按钮添加多个目标,这个按钮已经是在表视图中的其他位置使用单元格时添加的先前目标。
removePositionButton.addTarget(self, action: #selector(removePosition(_:)), for: .touchUpInside)
您可能需要做的是在添加新目标之前删除目标,或从addTarget
删除tableView(_:cellForRowAt:)
来电。
查看UIControl
的文档,了解如何删除目标。
答案 1 :(得分:1)
如果您使用
button.addTarget(self, action: #selector(action1(_:)))
然后
button.addTarget(self, action: #selector(action2(_:)))
您有2个与按钮关联的操作,但只有1个目标。您已为同一目标添加了2个操作。因此,即使有2个目标/操作连接到按钮,allTargets
属性仍将显示1个目标。
如果您使用相同的目标和相同的控件事件添加了多个操作,则应使用actions(forTarget:forControlEvent:)
来查找它们。 (在您的情况下,actions(forTarget: self, forControlEvent:, .touchUpInside)
)
在cellForRow(at:)
方法中,您应该检查按钮上的目标/操作数量,如果操作计数为零,则仅向按钮添加新目标/操作,或者删除之前的所有目标/操作添加新的。
这里的经验法则是单元格被回收,并且您应该始终假设返回的单元格cellForRow(at:)
具有上次使用时剩余的设置,并且您必须完全配置单元格中的每个视图
答案 2 :(得分:0)
您的按钮是否可能(错误地)链接到多个操作?