我有一个UITableView,它显示包含UIButton的自定义UITableViewCells。根据歌曲标题(与该单元格相关联)是否已添加到名为trackList的字符串数组来设置按钮标题。如果trackList包含标题,则按钮标题应显示为“删除”,否则它应显示为“添加”。
这看起来效果很好,但是当您在表格中向上或向下滚动时,按钮标题会发生变化。例如,如果表中有10个项目,而trackList中没有项目,我向下滚动,所有按钮都按预期显示“添加”。如果我然后滚动回到顶部,点击第一个单元格中的“添加”按钮,按钮标题将变为“删除”,并且第一个单元格的标题将按预期添加到trackList。但是,如果我向下滚动,我还发现第6个单元格的按钮标题已更改为“删除”?!同样,如果我然后点击第二个单元格的按钮,第二个和第七个单元格的按钮都会发生变化。或者,如果我点击第8个单元格的按钮,则第8个和第3个单元格的按钮都会发生变化。这不会反映在trackList数组中(如果我执行上述所有三个按钮点击,trackList只包含第1个,第2个和第8个单元格的标题)。
我确信有更好的方法来构建它,但是凭借我当前的noob级别的快速编程经验,这是尝试解耦一系列可用轨道时想到的第一种方式,其中一个数组是我在其他地方用作播放列表。我非常感谢任何一个指导,要么弄清楚为什么按钮这样做(也就是改变按钮的标题在cellIndex + - 5),或者可能建议一个替代结构来处理这个。这是自定义单元格代码......
class PurchasedTableViewCell: UITableViewCell {
var isAdded: Bool = false
override func awakeFromNib() {
super.awakeFromNib()
}
@IBOutlet weak var SongTitleLabel: UILabel!
@IBOutlet weak var SongAddOrRemoveButton: UIButton!
@IBAction func addOrRemoveSong(_ sender: Any) {
var tempIsAdded = false
for check in trackList {
if (check == purchasedSongTitleLabel.text!){
tempIsAdded = true
}
}
isAdded = tempIsAdded
if isAdded {
purchasedSongAddOrRemoveButton.setTitle("Add", for: .normal)
trackList.remove(at: trackList.index(of: purchasedSongTitleLabel.text!)!)
} else {
purchasedSongAddOrRemoveButton.setTitle("Remove", for: .normal)
trackList.append(purchasedSongTitleLabel.text!)
}
self.superview?.reloadInputViews()
}
}
...以及表视图中的单元格......
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return 20
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellInt = indexPath.row
if (cellInt < purchasedBeats.count){
var cell = PurchasedTableViewCell()
cell = tableView.dequeueReusableCell(withIdentifier: "Purchased", for: indexPath) as! PurchasedTableViewCell
cell.purchasedSongTitleLabel.text = purchasedBeats[cellInt]
for check in trackList {
if (check == purchasedBeats[cellInt]){
cell.isAdded = true
}
}
if cell.isAdded {
cell.purchasedSongAddOrRemoveButton.setTitle("Remove", for: .normal)
} else {
cell.purchasedSongAddOrRemoveButton.setTitle("Add", for: .normal)
}
return cell
}
}