如何在 swift 中将 NSIndexPath 添加到 NSUserDefaults
How to add NSIndexPath to NSUserDefaults in swift
我正在尝试将 NSIndexPath
保存在 NSUserDefaults
,但出现以下异常:-
Attempt to set a non-property-list object {length = 2, path = 0 - 12} as an
NSUserDefaults/CFPreferences value for key LastSelectedIndeX
我的代码:-
let selectedIndexPath = tableView.indexPathForSelectedRow
NSUserDefaults.standardUserDefaults().setObject(selectedIndexPath, forKey: "lastSelectedIndex")
NSUserDefaults.standardUserDefaults().synchronize()
那么我该如何保存 NSIndexPath
以便稍后在另一个视图控制器中使用它。
NSUserDefault 中不能直接保存indexPath。您可以将 NSArray 、 NSDictionary 、 NSNumber 、 NSString 和 NSDictionary 存储在 NSUserDefault 中。
使用 NSKeyedArchiver
存储 IndexPath:
let data = NSKeyedArchiver.archivedDataWithRootObject(selectedIndexPath)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "indexKey")
使用 NSKeyedArchiver
获取 IndexPath:
let data1 = NSUserDefaults.standardUserDefaults().objectForKey("indexKey") as? NSData
let indexP1 = NSKeyedUnarchiver.unarchiveObjectWithData(data1!) as! NSIndexPath
正如其他人所提到的 (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 版本的语法。
你可以这样做,
收藏,
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)
您必须将索引路径转换为数据,然后才能保存和检索。
希望这会有所帮助:)
此 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)
}
}
}
我正在尝试将 NSIndexPath
保存在 NSUserDefaults
,但出现以下异常:-
Attempt to set a non-property-list object {length = 2, path = 0 - 12} as an NSUserDefaults/CFPreferences value for key LastSelectedIndeX
我的代码:-
let selectedIndexPath = tableView.indexPathForSelectedRow
NSUserDefaults.standardUserDefaults().setObject(selectedIndexPath, forKey: "lastSelectedIndex")
NSUserDefaults.standardUserDefaults().synchronize()
那么我该如何保存 NSIndexPath
以便稍后在另一个视图控制器中使用它。
NSUserDefault 中不能直接保存indexPath。您可以将 NSArray 、 NSDictionary 、 NSNumber 、 NSString 和 NSDictionary 存储在 NSUserDefault 中。
使用 NSKeyedArchiver
存储 IndexPath:
let data = NSKeyedArchiver.archivedDataWithRootObject(selectedIndexPath)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "indexKey")
使用 NSKeyedArchiver
获取 IndexPath:
let data1 = NSUserDefaults.standardUserDefaults().objectForKey("indexKey") as? NSData
let indexP1 = NSKeyedUnarchiver.unarchiveObjectWithData(data1!) as! NSIndexPath
正如其他人所提到的 (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 版本的语法。
你可以这样做,
收藏,
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)
您必须将索引路径转换为数据,然后才能保存和检索。
希望这会有所帮助:)
此 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)
}
}
}