为了在再次运行App时保持行处于选中状态并突出显示状态,我需要在UITableView中获得突出显示的最后一个选择。
因此,我选择了获取选定行标题并将这些数据保存在UserDefaults中,并使用它们重新加载cellForRowAt的方法。
我可以使这些代码选择的标题为[String]。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedCell = tableView.cellForRow(at: indexPath)
let selectedTitle = selectedCell?.textLabel!.text
selectedTitleArray += [selectedTitle!]
print(selectedCell?.textLabel!.text)
print(selectedTitleArray)
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let deselectedCell = tableView.cellForRow(at: indexPath)
let deselectedTitle = deselectedCell?.textLabel!.text
selectedTitleArray = selectedTitleArray.filter{$0 != deselectedTitle}
print(deselectedCell?.textLabel!.text)
print(selectedTitleArray)
}
但是当我将UserDefaults代码放入'didSelectRowAt'时,选择后它无法检测到'didDeselectRowAt'。
当然,当我将UserDefaults代码放入'didDeselectRowAt'中时,取消选择后它无法检测到'didSelectRowAt'。
我不知道应该将UserDefaults放在哪里以保存最后的选择状态。
我应该在哪里放置UserDefault代码?
答案 0 :(得分:0)
我的误会。当同时使用UserDefaults和UserDefaults时,都可以使用。
让我逐步解释。
首先,我建议您不要保存选定单元格的IndexPath,而是保存选定单元格的标题。
首先,很难将NSIndexPath保存在UserDefaults中。 UserDefaults无法直接保存NSIndexPath。
其次,数据顺序可能会在以后更改。如果保存选定单元格的IndexPath,以后将很难处理。
但是,只要标题是常量,就可以更改任何内容。
首先,在全局范围内声明“ var selectedTitleArray:[String] = []”以获取选定行的标题并保存在UserDefaults中。 并且,当然,在全局范围内,声明'var passTitleArray:[String] = []'以检索保存的UserDefaults。
这是第一个代码。
import UIKit
var selectedTitleArray: [String] = []
var passedTitleArray: [String] = []
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
放入“ selectedTitleArray”代码以在“ didSelectRowAt”和“ didDeselectRowAt”中获取选定行的标题。
然后,将“ UserDefalut.standard.set”代码分别放入“ didSelectRowAt”和“ didDeselectRowAt”,以保存选定行的标题。
这是代码。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedCell = tableView.cellForRow(at: indexPath)
let selectedTitle = selectedCell?.textLabel!.text
selectedTitleArray += [selectedTitle!]
print(selectedCell?.textLabel!.text)
print(selectedTitleArray)
UserDefaults.standard.set(selectedTitleArray, forKey: "selectedTitle")
print(passedTitleArray)
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
let deselectedCell = tableView.cellForRow(at: indexPath)
let deselectedTitle = deselectedCell?.textLabel!.text
selectedTitleArray = selectedTitleArray.filter{$0 != deselectedTitle}
print(deselectedCell?.textLabel!.text)
print(selectedTitleArray)
UserDefaults.standard.set(selectedTitleArray, forKey: "selectedTitle")
print(passedTitleArray)
}
在“ viewDidLoad”代码中检索保存的UserDefaults。
这是代码。
override func viewDidLoad() {
super.viewDidLoad()
passedTitleArray = UserDefaults.standard.array(forKey: "selectedTitle") as! [String]
print(passedTitleArray)
}
然后,将检查字符串代码放入“ cellForRowAt”代码中以重新加载单元格。
这是代码。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
if passedTitleArray.contains(cell.textLabel!.text!) {
print("Value exists!")
tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)
} else {
print("No value")
}
return cell
}
而且,请不要忘记使用UserDefault的初始值。
第一次运行该应用程序时,除非您为UserDefault设置了初始值,否则您将收到“ Unexpectedly Nil”错误消息。
在“ AppDelegate.swift”的“ didFinishWithLaunchingWithOption”中放置“ UserDefault.standard.register”代码
这是代码。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UserDefaults.standard.register(defaults: ["selectedTitle":[]])
return true
}