滚动时 UITableViewCell 的选定按钮消失 [英] Selected button of a UITableViewCell get disappear when scrolling

查看:43
本文介绍了滚动时 UITableViewCell 的选定按钮消失的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理一个用 swift 3 编码的项目,我在 UITableViewCell 中有一个 UIButton,一旦点击按钮,图像就会改变.尽管选定的按钮按预期被选中,但一旦 UITableview 滚动,选定的图像就会消失,因为单元格被重用.因为我是编程新手,所以在编写逻辑时遇到了麻烦.帮助将非常感谢以下代码.

I'm working on a project coded in swift 3 and I have a UIButton inside a UITableViewCell where the image changes once the button is tapped. Though the selected buttons get selected as intended, once the UITableview scrolls the selected images gets disappear since the cells are been reused. As I'm new to programming having troubles of writing the logic. Help would much appreciate the code as bellow.

CellFoRow

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

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

   }

这是创建单元格的地方.

This is where the cell is been created.

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)
        }
    }


}

推荐答案

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

You need to maintain the button selection status at the controller level. You need to make changes to the model that you are using to configure your tableview.

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

I have created a similar scenario. I have used an array selectionStatusArray to maintain the button's selection status.

示例:

1.UIViewController 包含 UITableView

1. UIViewController containing 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.

You can configure the UITableViewCell according to your requirements.

这篇关于滚动时 UITableViewCell 的选定按钮消失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆