Android Paylaşılan Tercihler İçin iOS Eşdeğeri


105

Bir Android uygulamasını iOS'a taşıyorum, kullandığım şeylerden biri de, her seviye tamamlandığında kaydetmek için Android'deki Paylaşılan Tercihler oldu.

Bu şekilde, kullanıcı uygulamaya geri döndüğünde, 3. seviyeye kadar veya her neyse onu görebilir.

İOS'ta da benzer bir mekanizma var mı? veya uygulamaya özel bir dosyaya manuel olarak yazmam gerekiyor mu?

Öyleyse, yalnızca uygulamamın görebildiği dosyalara nasıl yazabilirim?

Teşekkürler.


1
Sanırım iOS'ta buna en yakın şey NSUserDefaults . Ve işte nasıl kaydedilip geri alınacağına dair basit bir örnek.
Tarek Hallak

Yanıtlar:


203

NSUserDefaults kullanın : - bunun, bahsettiğiniz geçerli düzey gibi küçük veri bitleri için olduğunu unutmayın. Bunu kötüye kullanmayın ve büyük bir veritabanı olarak kullanın, çünkü uygulamanızı her açtığınızda belleğe yüklenir, ondan bir şeye ihtiyacınız olsun veya olmasın (uygulamanızın diğer bölümleri de bunu kullanacaktır).

Amaç-C:

Okuma:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

if ([preferences objectForKey:currentLevelKey] == nil)
{
    //  Doesn't exist.
}
else
{
    //  Get current level
    const NSInteger currentLevel = [preferences integerForKey:currentLevelKey];
}

Yazı:

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSString *currentLevelKey = @"currentlevel";

const NSInteger currentLevel = ...;
[preferences setInteger:currentLevel forKey:currentLevelKey];

//  Save to disk
const BOOL didSave = [preferences synchronize];

if (!didSave)
{
    //  Couldn't save (I've never seen this happen in real world testing)
}

.

Swift:

Okuma:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

if preferences.objectForKey(currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integerForKey(currentLevelKey)
}

Yazı:

let preferences = NSUserDefaults.standardUserDefaults()

let currentLevelKey = "currentLevel"

let currentLevel = ...
preferences.setInteger(currentLevel, forKey: currentLevelKey)

//  Save to disk
let didSave = preferences.synchronize()

if !didSave {
    //  Couldn't save (I've never seen this happen in real world testing)
}

Ayrıca hızlı if let savedLevel = preferences.integerForKey(currentLevelKey) { currentLevel = SavedLevel}
Raghu Teja

4
@chitti hayır, işe yaramaz,
integerForKey

40

İşte Swift 3 için bir güncelleme

Okuma

let preferences = UserDefaults.standard

let currentLevelKey = "currentLevel"
if preferences.object(forKey: currentLevelKey) == nil {
    //  Doesn't exist
} else {
    let currentLevel = preferences.integer(forKey: currentLevelKey)
}

yazı

let preferences = UserDefaults.standard

let currentLevel = ...
let currentLevelKey = "currentLevel"
preferences.set(currentLevel, forKey: currentLevelKey)

Güncelleme

Gönderen UserDefaults dokümantasyon

synchronize()varsayılan veritabanı için bekleyen eşzamansız güncellemeleri bekler ve geri döner; bu yöntem artık gereksizdir ve kullanılmamalıdır.


2
class Configuration {

    static func value<T>(defaultValue: T, forKey key: String) -> T{

        let preferences = UserDefaults.standard
        return preferences.object(forKey: key) == nil ? defaultValue : preferences.object(forKey: key) as! T
    }

    static func value(value: Any, forKey key: String){

        UserDefaults.standard.set(value, forKey: key)
    }

}

Misal

//set
Configuration.value(value: "my_value", forKey: "key_1")

//get
let myValue = Configuration.value(defaultValue: "default_value", forKey: "key_1")

-1

Önceki cevaba göre, bunun UserDefaultsios'taki paylaşılan tercihlere eşdeğer olduğunu zaten biliyorsunuz . Veri türüne göre ortak bir yazma işlevi ve okuma oluşturma işlevi oluşturabilirsiniz. Ve istediğiniz yöntemi istediğiniz yerden arayın.

ViewController.swift

 // write data
 writeAnyData(key: "MY_KEY", value: "MyData")
 // read string data 
 readStringData(key: "MY_KEY"), animated: true)

Utils.swift

// read and write user default
let userDefault = UserDefaults.standard
// write
func writeAnyData(key: String, value: Any){
    userDefault.set(value, forKey: key)
    userDefault.synchronize()
}

// read int values
func readIntData(key: String) -> Int{
    if userDefault.object(forKey: key) == nil {
        return 0
    } else {
        return userDefault.integer(forKey: key)
    }
}

// read string values
func readStringData(key: String) -> String{
    if userDefault.object(forKey: key) == nil {
        return ""
    } else {
        return userDefault.string(forKey: key)!
    }
}
// read bool value
func readBoolData(key: String) -> Bool{
    if userDefault.object(forKey: key) == nil {
        return false
    } else {
        return userDefault.bool(forKey: key)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.