滚动时如何在UITableView上保留自定义选择格式

时间:2018-04-02 23:42:16

标签: ios swift uitableview select scroll

我有一个带有可选择的静态单元格的TableView(一次可以选择一个),我设置了一个自定义的“SelectionView”,这样当选择一个单元格时,它周围会出现一个蓝色轮廓。

问题是当我滚动或离开视图并返回(通过转到另一个视图控制器)时,我的自定义格式以某种方式“中断”。有时它会消失(滚动时),有时它似乎擦除了轮廓的一半(当我离开视图控制器并返回时。)

有没有办法确保我的自定义选择视图保留在那里?

这是我的代码:

class BackgroundDesignController: UITableViewController {

    let selectionView = UIView()
    let defaults = UserDefaults.standard
    var  selectedBackground = "my default"

    @IBOutlet var myTableView: UITableView!

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        if(indexPath == [0,0]){
            BackgroundName = "blank"
            NotificationCenter.default.post(name: NSNotification.Name("BackgroundDesignNotification"), object: nil)
        }
        if(indexPath == [0,1]) {
            BackgroundName = "leaves"
            NotificationCenter.default.post(name: NSNotification.Name("BackgroundDesignNotification"), object: nil)
        }
        if(indexPath == [0,2]) {
            BackgroundName = "water"
            NotificationCenter.default.post(name: NSNotification.Name("BackgroundDesignNotification"), object: nil)
        }
        if(indexPath == [0,3]) {
            BackgroundName = "wood"
            NotificationCenter.default.post(name: NSNotification.Name("BackgroundDesignNotification"), object: nil)
        }          
    }

    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        if cell.isSelected {
            cell.isSelected = true
        } else {
            cell.isSelected = false
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        //customize the selectedBackgroundView
        selectionView.layer.borderColor = UIColor.cyan.cgColor
        selectionView.layer.borderWidth = 6.0 //
        UITableViewCell.appearance().selectedBackgroundView = selectionView
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        //let indexPath = IndexPath(row: 1, section: 0)

        //reset the selected background  to the current value of the Background user default
        switch BackgroundName{
        case "blank":
            myTableView.selectRow(at: [0,0], animated: false, scrollPosition: .none)
            self.view.layoutIfNeeded()
        case "leaves":
            myTableView.selectRow(at: [0,1], animated: false, scrollPosition: .none)
            self.view.layoutIfNeeded()
        case "water":
            myTableView.selectRow(at: [0,2], animated: false, scrollPosition: .none)
            self.view.layoutIfNeeded()
        case "wood":
            myTableView.selectRow(at: [0,3], animated: false, scrollPosition: .none)
            self.view.layoutIfNeeded()
        default:
            print("There is a problem: no value for BackgroundName")
        }

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

1 个答案:

答案 0 :(得分:0)

根据我对您的问题的理解,您没有正确地重置您的细胞状态。 请记住,滚动时,tableview将重用单元格。因此,这意味着您需要通常在cellForRowAt函数中重置其状态。 但是当您使用静态单元格时,可能需要在willDisplayCell中执行此操作。 如果我们看一下你对该函数的实现:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
            if cell.isSelected {
                cell.isSelected = true
            } else {
                cell.isSelected = false
            }
        }

这是一种无意义的感觉。如果trueisSelected,您可以将isSelected分配给true ... 所以你肯定有问题。

您还要在viewWillAppear中设置单元格的选定状态,但如果您尝试选择的单元格不可见,会发生什么情况?我可以告诉你:没事。所以这段代码必须移动到其他地方。

这是一个非常简单的行为。我真的建议使用动态单元格,这样更容易处理。