在Swift 3中,如何在tableview中选择多个选项并保存?如果我搬回去,我想看看我之前选择的并改变它!我使用的是didSelectRowAtIndexPath
和didDeselectRowAtIndexPath
。
当我打开tableview并选择行时,一切正常。我可以做出选择并转到下一个ViewController。但当我回到TableView时,我没有看到我选择的行,也无法改变我的选择。
var selectedRows = Array<IndexPath>()
override func viewDidLoad() {
super.viewDidLoad()
subServicesTableView.allowsMultipleSelection = true
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SubServicesTableViewCell
cell.subServiceName.text = fetchedResultController.object(at: indexPath).name
if !selectedRows.isEmpty {
for row in selectedRows {
if row == indexPath {
cell.isSelected = true
cell.accessoryType = cell.isSelected ? .checkmark : .none
}
}
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let currentCell = subServicesTableView.cellForRow(at: indexPath) as! SubServicesTableViewCell
currentCell.chooseMark.backgroundColor = UIColor.green
selectedSubServices.append(fetchedResultController.object(at: indexPath))
selectedRows.append(indexPath)
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let currentCell = subServicesTableView.cellForRow(at: indexPath) as! SubServicesTableViewCell
currentCell.chooseMark.backgroundColor = UIColor.clear
selectedSubServices = selectedSubServices.filter(){$0 != fetchedResultController.object(at: indexPath)}
selectedRows = selectedRows.filter(){$0 != indexPath}
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
for index in selectedRows {
if index == indexPath {
self.subServicesTableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
if let serviveCell = cell as? SubServicesTableViewCell {
serviveCell.chooseMark.backgroundColor = UIColor.green
}
}
}
}
答案 0 :(得分:0)
不是每次加载viewController时都重新创建selectedRows
,而是引入一个单例,您可以在其中跟踪所选的IndexPath
个实例。
以下是单例类的简单实现:
class RowsManager {
static let shared = RowsManager()
private init() {}
var selectedRows = Array<IndexPath>()
}
从现在开始,请使用selectedRows
。
RowsManager.shared.selectedRows
进行互动
使用单例是一种快速且相当简单的解决方案。但是,iOS回显系统中有许多持久性技术,例如userdefaults,Core Data或写入file system。
答案 1 :(得分:0)
您最好自己管理选择状态。在调用reloadData()
,reloadSections...
,reloadRowsAtIndexPaths...
时,UITableView将清除选择状态。
对于您的电台,它的系统行为。当用户从详细视图控制器弹回时,UIKit将自动取消选择。
要重新获得它,只需存储selectoin状态,并在需要时恢复它。
var selections = [NSIndexPath]()
...
...
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if !selections.contain(indexPath) {
selections.append(indexPath)
}
}