自定义UITableViewCell UIButton setTitle无法按计划运行

时间:2017-04-05 05:34:09

标签: swift xcode uitableview

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

0 个答案:

没有答案