滚动时,UITableViewCell的选定按钮会消失

时间:2017-08-11 05:04:39

标签: ios swift uitableview swift3

我正在研究用swift 3编码的项目,我在UITableViewCell中有一个UIButton,一旦按下按钮,图像就会改变。虽然所选按钮按预期选择,但一旦UITableview滚动,所选图像就会消失,因为细胞已被重复使用。因为我不熟悉编写逻辑的编程问题。帮助会非常感谢下面的代码。

CellFoRow

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        //Button_Action
         addSongButtonIdentifier(cell: cell, indexPath.row)

   }

这是创建单元格的位置。

func addSongButtonIdentifier(cell: UITableViewCell, _ index: Int) {
    let addButton = cell.viewWithTag(TABLE_CELL_TAGS.addButton) as! UIButton

    //accessibilityIdentifier is used to identify a particular element which takes an input parameter of a string

    //assigning the indexpath button
    addButton.accessibilityIdentifier = String (index)
   // print("visible Index:",index)
    print("Index when scrolling :",addButton.accessibilityIdentifier!)


           addButton.setImage(UIImage(named: "correct"), for: UIControlState.selected)


           addButton.setImage(UIImage(named: "add_btn"), for: UIControlState.normal)


    addButton.isSelected = false
    addButton.addTarget(self, action: #selector(AddToPlaylistViewController.tapFunction), for:.touchUpInside)


}

点击功能

func tapFunction(sender: UIButton) {
    print("IndexOfRow :",sender.accessibilityIdentifier!)
    // if let seporated by a comma defines, if let inside a if let. So if the first fails it wont come to second if let


    if let rowIndexString =  sender.accessibilityIdentifier, let rowIndex = Int(rowIndexString) {
    self.sateOfNewSongArray[rowIndex] = !self.sateOfNewSongArray[rowIndex]//toggle the state when tapped multiple times
    }
    sender.isSelected = !sender.isSelected //image toggle
    print(" Array Data: ", self.sateOfNewSongArray)

    selectedSongList.removeAll()

    for (index, element) in self.sateOfNewSongArray.enumerated() {
        if element{
            print("true:", index)

            selectedSongList.append(songDetailsArray[index])

            print("selectedSongList :",selectedSongList)
        }
    }


}

2 个答案:

答案 0 :(得分:0)

你有这个代码导致问题的代码addButton.isSelected = false,因为我相信你在addSongButtonIdentifier方法中调用函数tableView delegate,你不应该在{{1}内设置所有这些属性}。

相反,你应该最初只为你的每个细胞做一次,就像在故事板中一样,或者通过向细胞类提供模型。

答案 1 :(得分:0)

您需要在控制器级别维护按钮选择状态。您需要更改用于配置tableview的模型。

我创建了一个类似的场景。我使用数组selectionStatusArray来维持按钮的选择状态。

示例:

<强> 1。 UIViewController包含UITableView

class ViewController: UIViewController, UITableViewDataSource
{
    @IBOutlet weak var tableView: UITableView!
    var selectionStatusArray = [false, false, false, false, false] //Array that maintains the button selection status

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return selectionStatusArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell
        addSongButtonIdentifier(cell: cell, indexPath.row)
        return cell
    }

    func addSongButtonIdentifier(cell: TableViewCell, _ index: Int)
    {
        cell.addButton.tag = index
        cell.addButton.isSelected = selectionStatusArray[index]
        cell.tapHandler = {
            self.selectionStatusArray[$0] = cell.addButton.isSelected
        }
    }
}

<强> 2。自定义UITableViewCell

class TableViewCell: UITableViewCell
{
    @IBOutlet weak var addButton: UIButton!
    var tapHandler: ((Int)->())?

    @IBAction func tapFunction(_ sender: UIButton)
    {
        sender.isSelected = !sender.isSelected
        tapHandler?(sender.tag)
    }
}

您可以根据自己的要求配置UITableViewCell