带有自定义复选标记的swift ios uitableview在滚动时不断取消选择单元格

Posted

技术标签:

【中文标题】带有自定义复选标记的swift ios uitableview在滚动时不断取消选择单元格【英文标题】:swift ios tableview with custom checkmark keeps reselecting cell when scrolling 【发布时间】:2016-08-07 16:05:22 【问题描述】:

我有一个包含两个部分的表格视图和一个在选择单元格时显示的自定义复选标记。

唯一的问题是,如果我选择一个单元格并向下滚动,则每次该单元格出现在屏幕上时都会重新选择该单元格,而所有其他单元格都会再次隐藏。

那么我怎样才能让一个单元格只被选中/取消选中一次。

我的代码:

//Keep track of selected row
    var selectedRow: NSIndexPath? = NSIndexPath(forRow: 0, inSection: 0)

    func loadStates() 
        ApiService.getStates()  (JSON) -> () in
            self.states = JSON["stateData"]
            self.tableView.reloadData()
            let index = NSIndexPath(forRow: 0, inSection: 0)
            self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Top)
        
    

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        loadStates()
    

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

        let paths:[NSIndexPath]

        if let previous = selectedRow 
            paths = [indexPath, previous]
         else 
            paths = [indexPath]
        
        selectedRow = indexPath
        tableView.reloadRowsAtIndexPaths(paths, withRowAnimation: .None)

        if (indexPath.section == 1) 
            tableView.deselectRowAtIndexPath(indexPath, animated: false)
            performSegueWithIdentifier("searchCitySegue", sender: indexPath)
        else 
            tableView.deselectRowAtIndexPath(indexPath, animated: false)
            dismissViewControllerAnimated(true, completion: nil)
        

    

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 2
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        if (section == 1)
            return states.count
        
        return 1 
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        var cell: searchStateTableViewCell!

        if (indexPath.section == 0) 
            cell = tableView.dequeueReusableCellWithIdentifier("staticStateCell") as! searchStateTableViewCell
            cell.titleLabel?.text = "All states"

            if indexPath == selectedRow 
               cell.stateImage.select()
             else 
                cell.stateImage.deselect()
            

        else if (indexPath.section == 1) 
            cell = tableView.dequeueReusableCellWithIdentifier("stateCell") as! searchStateTableViewCell
            let state = states[indexPath.row]
            cell.configureWithStates(state)
            if indexPath == selectedRow 
                cell.stateImage.select()
             else 
                cell.stateImage.deselect()
            
        

        return cell

    

那么,是什么导致我的单元格在每次重新出现在屏幕上时运行选定的动画?

【问题讨论】:

【参考方案1】:

我很确定这是因为cellForRowAtIndexPath 使用此代码:

if indexPath == selectedRow 
    cell.stateImage.select()

else 
    cell.stateImage.deselect()

每次出现单元格时都会被调用。试试:

if indexPath == selectedRow 
    if !(cell.selected) 
        cell.stateImage.select()
    

else 
    cell.stateImage.deselect()

【讨论】:

我试图实现你的代码,但如果我向下滚动然后再次向上滚动,单元格仍然会被重新选择,因此它会在屏幕上可见:/ @user2636197 将 !(cell.selected) 替换为代码中确定单元格是否已处于选定状态的任何逻辑。这样,如果是,它就不会再次尝试将其置于选定状态。 我已经尝试过了if indexPath == selectedRow if !cell.stateImage.selected cell.stateImage.select() print("select normal") else if cell.stateImage.selected cell.stateImage.deselect() print("deselect normal") 一旦单元格被滚动出屏幕并再次返回,它就会被取消选择然后再次被选中。每次我向后/第四次滚动时看到选择动画运行真的很烦人

以上是关于带有自定义复选标记的swift ios uitableview在滚动时不断取消选择单元格的主要内容,如果未能解决你的问题,请参考以下文章

将单元格图像自定义为 Swift 中的 AccessoryType

ios swift:Tableview“un”-复选标记单元格

Firebase Analytics for iOS — 带有预定义事件的自定义参数 (Swift)

在 iOS 中实现 - 带有自定义标记器的 Android MultiAutoCompleteTextView,如 Whatsapp [附加图片]

向不同部分的单元格添加多个复选标记,并将其状态保存在Swift iOS中

如何在iOS swift中实现带有月份、日期和时间的自定义选择器?