swift2 如何在swift中将NSIndexPath添加到NSUserDefaults中

7cwmlq89  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(201)

我正在尝试将NSIndexPath保存在NSUserDefaults,但出现以下异常:-
尝试将非属性列表对象{长度= 2,路径= 0 - 12}设置为项LastSelectedIndexNSUserDefaults/CFPreferences值
我的密码:-

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

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

xuo3flqw

xuo3flqw1#

无法将indexPath直接保存在NSUserDefault中。可以将NSArray、NSDictionary、NSNumber、NSString和NSDictionary存储在NSUserDefault中。

使用NSKeyedArchiver存储索引路径:

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
xghobddn

xghobddn2#

正如其他人所提到的,(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版本的语法。

ne5o7dgx

ne5o7dgx3#

此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)
        }
    }
}
fafcakar

fafcakar4#

你可以这样做,
保存为,

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转换为数据,然后才能保存和检索。
希望这对你有帮助:)

相关问题