如何在UITableView中检测处于选定状态的最后一行?

时间:2018-10-23 22:54:09

标签: swift uitableview nsuserdefaults

为了在再次运行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代码?

1 个答案:

答案 0 :(得分:0)

我的误会。当同时使用UserDefaults和UserDefaults时,都可以使用。
让我逐步解释。

0。 IndexPath与标题

首先,我建议您不要保存选定单元格的IndexPath,而是保存选定单元格的标题。
首先,很难将NSIndexPath保存在UserDefaults中。 UserDefaults无法直接保存NSIndexPath。
其次,数据顺序可能会在以后更改。如果保存选定单元格的IndexPath,以后将很难处理。
但是,只要标题是常量,就可以更改任何内容。

1。第一步

首先,在全局范围内声明“ var selectedTitleArray:[String] = []”以获取选定行的标题并保存在UserDefaults中。 并且,当然,在全局范围内,声明'var passTitleArray:[String] = []'以检索保存的UserDefaults。

这是第一个代码。

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”代码中检索保存的UserDefaults。

这是代码。

override func viewDidLoad() {
    super.viewDidLoad()
    passedTitleArray = UserDefaults.standard.array(forKey: "selectedTitle") as! [String]
    print(passedTitleArray)
}

4。第四步

然后,将检查字符串代码放入“ 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  
}

5。最后一步

而且,请不要忘记使用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
}