Как обнаружить последние строки в выбранном состоянии в UITableView? - PullRequest
0 голосов
/ 24 октября 2018

Для сохранения выбранных строк и выделенного состояния при повторном запуске приложения мне необходимо получить выделенный последний выбор в 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?

1 Ответ

0 голосов
/ 24 октября 2018

Мое недопонимание.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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...