我有一个带有可选择的静态单元格的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.
}
}
答案 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
}
}
这是一种无意义的感觉。如果true
为isSelected
,您可以将isSelected
分配给true
...
所以你肯定有问题。
您还要在viewWillAppear
中设置单元格的选定状态,但如果您尝试选择的单元格不可见,会发生什么情况?我可以告诉你:没事。所以这段代码必须移动到其他地方。
这是一个非常简单的行为。我真的建议使用动态单元格,这样更容易处理。