2015-09-02 22 views
5

Bu problemle 5 gün boyunca mücadele ediyorum. Şaka değil. Lütfen yardım et! İşte karşılaştığım problem.NSUserDefaults'da bir sözlük depolamak ve saklanan verileri kullanmak.

biliyorum Ne:

Ben global bir değişken olarak var addressDict = Dictionary<Int, Array<String>>() ilan etti. Şimdi, adres kodumda saklanan verileri eklemek ve veriyi NSUserDefaults içine kaydedilebilecek şekilde değiştirmek için aşağıdaki kodun kullanıldığını anlıyorum.

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving 
self.defaults.setObject(data, forKey: "addressDict") //storing 
if let data2 = self.defaults.objectForKey("addressDict") as? NSData { 
    let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2) 
} 

Şimdi, uygulamanın çalışma her zaman, addressDict2 depolanan verileri tarafından geçersiz olur benim addressDict uygulama başladığında, addressDict hiçbir veri yokken çünkü. Bu yüzden, addressDict2'a bazı verileri eklemiş olmama rağmen, hiçbir veriye sahip olmayan addressDict'un üzerine yazılıyor.

yüzden self.defaults.setObject(data, forKey: "addressDict"), yukarıda ancak hat olmadan kod çalıştırabilir ve şimdi, addressDict2 artık addressDict, hiçbir verileri tutan bir değişken tarafından üzerlerine bu sorunu çözmek için. Bu yüzden eklediğim veriler addressDict2'da saklanır. Ancak, bunu yaparsam, addressDict2'a artık yeni bilgiler ekleyemiyorum çünkü artık self.defaults.setObject(data, forKey: "addressDict") yok. Ben bilmek istedikleriniz

... burada ikilemimi bkz umut:

Bu benim kod yapmak istiyorum şeydir. addressDict2 gibi bazı değişkenlere yeni bilgiler ekleyebilmek istiyorum. Uygulama başladığında, addressDict2'daki verilerin addressDict'a kopyalanmasını istiyorum. Yani bu, tutmasını istediğim verileri tutmak için addressDict neden olur.

denedim Ne: Yukarıda ne anlama geldiğini anlatmaya çalışacağım için

, burada bazı kodudur. Not, bu kod çalışmaz, sadece ne demek istediğimi açıklamak ve aşağıdaki kodun işe yarayıp yaramayacağını göstermek, sorunumu çözecektir, sanırım (lütfen yanılıyorsam düzeltin).

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving 
self.defaults.setObject(data, forKey: "addressDict") //storing 
if let data2 = self.defaults.objectForKey("addressDict") as? NSData { 
    let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2) 
} 

burada addressDict artık boş olacaktır ve üzerine yazmaz: Bu kodu çalıştırdığınızda, Şimdi

override func viewDidLoad() { 
    super.viewDidLoad() 

    if NSUserDefaults.standardUserDefaults().objectForKey("addressDict") != nil { 
     if let data2 = defaults.objectForKey("addressDict") as? NSData { 
      addressDict = NSKeyedUnarchiver.unarchiveObjectWithData(data2) //there is an error here that states: "Cannot assign a value of type AnyObject? to a value of type Dictionary<Int, Array<Strings>> 
     } 
    } 
} 

: benim viewDidLoad() Yani, şu gibi şey olurdu Boş verilerle addressDict2. Ve tüm kalıcı olarak saklanan verilerle addressDict'u kullanabileceğim! Ve hayat iyi olacak. Ama bunun nasıl yapılacağını bilmiyorum.

P.S. Sorunun uzunluğu için cidden özür dilerim. Zaman ayırdığın için teşekkürler!

+0

http://stackoverflow.com/a/32264073/730.701). Gönderdiğim kod derler ve iyi çalışır. İhtiyacın olan şey basit bir yazımdır. – Adam

+0

Aslında 'NSKeyedUnarchiver' kullanmak için gerekli değildir, çünkü' Int', 'String' ve' Array' türlerini içeren bir sözlük özellik listesiyle uyumludur. – vadian

+0

@Adam, Burada belirttiğim soruya cevap verdiğinizden emin değilim (elbette, çok yanlış olabilirim). Sanırım, @Rajatp olarak yazarak, onu bir adres daha 'addressDict' ve 'addressDict2' ile birleştirerek bir adım daha ileri götürüyorum. Böylece, addressDict2'deki veriler "addressDict" içine yerleştirilebilir. – aejhyun

cevap

1

sözlüğüne verileri kaydedilirken:

let foundationDictionary = NSMutableDictionary(dictionary: StoreDictionary) let dict = NSKeyedArchiver.archivedDataWithRootObject(foundationDictionary) NSUserDefaults.standardUserDefaults().setObject(dict, forKey: "yourkey") 

kaydedilen verileri kullanırken: Zaten [burada] sorunuzu (cevap var

if NSUserDefaults.standardUserDefaults().objectForKey("UserDetails")!=nil { 

let dict : NSData = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as! NSData dictionaryName = NSKeyedUnarchiver.unarchiveObjectWithData(dict) as? NSDictionary 
}