带有自定义复选标记的swift ios tableview在滚动时保持重新选择单元格

时间:2016-08-07 16:05:22

标签: ios swift uitableview tableview

我有一个包含两个部分的tableview,以及一个在选择单元格时显示的自定义复选标记。

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

所以我怎么能让一个单元格只被选中/取消选择一次。

我的代码:

//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 个答案:

答案 0 :(得分:2)

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

if indexPath == selectedRow {
    cell.stateImage.select()
}
else {
    cell.stateImage.deselect()
}
每次出现单元格时都会调用

。尝试:

if indexPath == selectedRow {
    if !(cell.selected) {
        cell.stateImage.select()
    }
}
else {
    cell.stateImage.deselect()
}