如何在Swift中将NSIndexPath添加到NSUserDefaults

5

我正在尝试将NSIndexPath保存在NSUserDefaults中,但遇到了以下异常:

尝试将非属性列表对象 {length = 2, path = 0 - 12} 设置为NSUserDefaults/CFPreferences关键字LastSelectedIndeX的值

我的代码:

let selectedIndexPath = tableView.indexPathForSelectedRow
   NSUserDefaults.standardUserDefaults().setObject(selectedIndexPath, forKey: "lastSelectedIndex")
   NSUserDefaults.standardUserDefaults().synchronize()

那么我该如何保存NSIndexPath, 以便在另一个视图控制器中使用呢?

4个回答

13

你不能直接在NSUserDefault中保存indexPath。你可以将NSArray,NSDictionary,NSNumber,NSString和NSDictionary存储在NSUserDefault中。

使用NSKeyedArchiver来存储IndexPath:

let data = NSKeyedArchiver.archivedDataWithRootObject(selectedIndexPath)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "indexKey")

使用NSKeyedArchiver获取索引路径:

let data1 = NSUserDefaults.standardUserDefaults().objectForKey("indexKey") as? NSData
let indexP1 = NSKeyedUnarchiver.unarchiveObjectWithData(data1!) as! NSIndexPath

1
你不必一定将它存储为字典。你可以使用字符串编码路径,形式如“1.2.3.4”。 - trojanfoe

3

正如其他人所提到的那样,(NS)IndexPath不符合属性列表规范。

解决方法是使用这个简单的UserDefaults扩展,将IndexPath保存为两个整数的数组。

extension UserDefaults {

  func indexPath(forKey key : String) -> IndexPath?
  {
    guard let indexArray = array(forKey: key) as? [Int] else { return nil }
    return IndexPath(row: indexArray[0], section: indexArray[1])
  }

  func set(_ indexPath : IndexPath, forKey key: String)
  {
    set([indexPath.row, indexPath.section], forKey: key)
  }
}

您可以在编辑历史记录中找到旧版Swift的语法。


为什么只有两个整数? - trojanfoe
@trojanfoe 为什么不呢?简单的形式只是rowsection - vadian
但是索引路径可以超过2级深度。 - trojanfoe
@trojanfoe 我知道,但问题显然是关于UITableView的。 - vadian

1
这段 Swift 代码适用于任何深度的 IndexPath。
extension UserDefaults {
    func indexPath(forKey key: String) -> IndexPath? {
        if let data = data(forKey: key), let indexPath = try? JSONDecoder().decode(IndexPath.self, from: data) {
            return indexPath
        }
        return nil
    }
    func set(_ indexPath: IndexPath, forKey key: String) {
        if let data = try? JSONEncoder().encode(indexPath) {
            set(data, forKey: key)
        }
    }
}

0
你可以像这样做,
保存为,
  var myDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    var indexPath: NSIndexPath = self.myTableView.indexPathForSelectedRow
    var data: NSData = NSKeyedArchiver.archivedDataWithRootObject(indexPath)
    myDefaults["lastSelectedIndex"] = myDefaults

获取类似于,

    var data2: NSData = myDefaults.dataForKey("lastSelectedIndex")
    var indexPath2: NSIndexPath = NSKeyedUnarchiver.unarchiveObjectWithData(data2)

你需要将IndexPath转换为数据,然后才能保存和检索。

希望这可以帮到你 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接