2016-05-03 19 views
3

Ich versuche NSIndexPath bei NSUserDefaults zu retten, aber bekam die folgende Ausnahme: -Wie fügt NSIndexPath zu NSUserDefaults in schnellen

Versuch, ein nicht-Eigenschaft-List-Objekt zu setzen {length = 2, path = 0-12} als NSUserDefaults/CFPreferences Wert für Schlüssel LastSelectedIndeX

Mein Code: -

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

so wie kann ich Speichern Sie NSIndexPath, damit ich es später bei einem anderen View-Controller verwenden kann.

Antwort

9

Sie können IndexPath nicht direkt in NSUserDefault speichern. Sie können NSArray, NSDictionary, NSNumber, NSString und NSDictionary in NSUserDefault speichern.

Shop IndexPath mit NSKeyedArchiver:

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

Get IndexPath NSKeyedArchiver mit:

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

Nun, Sie nicht * haben * es als ein Wörterbuch zu speichern. Sie könnten den Pfad in einer Zeichenfolge codieren, indem Sie die Form "1.2.3.4" verwenden. – trojanfoe

+0

@trojanfoe auch guten Weg .. !! –

+0

Ich denke nur "Way 1" wird funktionieren. – trojanfoe

1

Wie NSIndexPath von den anderen erwähnt ist nicht Eigenschaftsliste konform.

Eine Lösung ist es, diese einfache Erweiterung der NSUserDefaults zu verwenden, um die NSIndexPath als ein Array von zwei ganzen Zahlen speichern

extension NSUserDefaults { 

    func indexPathForKey(key : String) -> NSIndexPath? 
    { 
    guard let indexArray = arrayForKey(key) as? [Int] else { return nil } 
    return NSIndexPath(forRow: indexArray[0], inSection: indexArray[1]) 
    } 

    func setIndexPath(indexPath : NSIndexPath, forKey key: String) 
    { 
    setObject([indexPath.row, indexPath.section], forKey:key) 
    } 
} 
+0

Warum nur zwei ganze Zahlen? – trojanfoe

+0

@trojanfoe Warum nicht? Die * einfache * Form ist nur 'row' und' section'. – vadian

+0

Aber ein Indexpfad kann mehr als 2 Ebenen tief sein. – trojanfoe

0

Sie können so etwas tun,

speichern wie,

var myDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults() 
    var indexPath: NSIndexPath = self.myTableView.indexPathForSelectedRow 
    var data: NSData = NSKeyedArchiver.archivedDataWithRootObject(indexPath) 
    myDefaults["lastSelectedIndex"] = myDefaults 

Abrufen wie,

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

Sie müssen Indexpfad in Daten konvertieren, dann können Sie speichern und abrufen.

Hope this helfen :)