Мое недопонимание.UserDefaults работает, когда я ставлю оба.Позвольте мне объяснить шаг за шагом.
0.IndexPath против названий
Во-первых, я рекомендую сохранять не IndexPath выбранных ячеек, а заголовки выбранных ячеек.Во-первых, трудно сохранить NSIndexPath в UserDefaults.UserDefaults не может сохранить NSIndexPath напрямую.Во-вторых, порядок данных может измениться позже.Если вы сохраните IndexPath для выбранной ячейки, с этим будет сложно справиться позже.Но пока заголовок является константой, вы можете изменить все, что захотите.
1.Первый шаг
Сначала, глобально, объявите 'var selectedTitleArray: [String] = []', чтобы получить заголовки выбранных строк и сохранить их в UserDefaults.И, конечно же, в глобальном масштабе, объявляем var varTTleleArray: [String] = [] 'для извлечения сохраненных пользовательских значений.
Вот первый код.
import UIKit
var selectedTitleArray: [String] = []
var passedTitleArray: [String] = []
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
2.Второй шаг
Поместите код 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)
}
3.Третий шаг
Извлечение сохраненных пользовательских значений по умолчанию в коде 'viewDidLoad'.
Вот код.
override func viewDidLoad() {
super.viewDidLoad()
passedTitleArray = UserDefaults.standard.array(forKey: "selectedTitle") as! [String]
print(passedTitleArray)
}
4.Четвертый шаг
И поставьте проверяющие строковые коды для перезагрузки ячеек в коде cellForRowAt. * 1030 *
Вот код.
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
}
5.Последний шаг
И, не забудьте начальное значение для UserDefault. При первом запуске этого приложения вы получите сообщение об ошибке «Неожиданно ноль», если не установите начальное значение для UserDefault.
Поместите код «UserDefault.standard.register» в «didFinishWithLaunchingWithOption» в «AppDelegate.swift»
Вот код.
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UserDefaults.standard.register(defaults: ["selectedTitle":[]])
return true
}