2015-12-19 31 views
9

Próbuję zaprogramować mój kod tak, że jeśli użytkownik naciśnie przycisk Noc, tło zmieni kolor na czarny i pozostanie czarny, jeśli użytkownik zamknie aplikację. (To samo dotyczy trybu dziennego).Jak zapisać UIColor z NSUserDefaults?

Uwaga: już zakodowałem przyciski, a po ich naciśnięciu wszystkie sceny zmieniają się w ten tryb.

Oto mój kod gdzie jadę będzie potrzebował kolor tła być zapisane: (muszę go zarówno if)

if GlobalData.dayBool == true && GlobalData.night == false { 
    backgroundColor = GlobalData.dayColor 
} 

if GlobalData.nightBool == true && GlobalData.dayBool == false { 
    backgroundColor = GlobalData.nightColor 
} 

Moi dzień i noc Kolory:

struct GlobalData { 
    static var score = 0 
    static var dayColor = UIColor(red:0.93, green:0.93, blue:0.93, alpha:1.0) 
    static var nightColor = UIColor(red:0.10, green:0.10, blue:0.10, alpha:1.0) 
    static var dayBool = true 
    static var nightBool = true 
} 

Odpowiedz

12
extension NSUserDefaults { 
    func setColor(value: UIColor?, forKey: String) { 
     guard let value = value else { 
      setObject(nil, forKey: forKey) 
      return 
     } 
     setObject(NSKeyedArchiver.archivedDataWithRootObject(value), forKey: forKey) 
    } 
    func colorForKey(key:String) -> UIColor? { 
     guard let data = dataForKey(key), color = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? UIColor 
     else { return nil } 
     return color 
    } 
} 

Można również utworzyć UIColor z seter pochłaniacza, aby go zapisać automatycznie następująco:

var nightColor: UIColor? { 
    get { 
     return NSUserDefaults.standardUserDefaults().colorForKey("nightColor") 
    } 
    set { 
     NSUserDefaults.standardUserDefaults().setColor(newValue, forKey: "nightColor") 
    } 
} 

edit/update:

Xcode 8.1 • Swift 3.0.1

extension UserDefaults { 
    func set(_ color: UIColor, forKey key: String) { 
     set(NSKeyedArchiver.archivedData(withRootObject: color), forKey: key) 
    } 
    func color(forKey key: String) -> UIColor? { 
     guard let data = data(forKey: key) else { return nil } 
     return NSKeyedUnarchiver.unarchiveObject(with: data) as? UIColor 
    } 
} 

var nightColor: UIColor? { 
    get { 
     return UserDefaults.standard.color(forKey: "nightColor") 
    } 
    set { 
     UserDefaults.standard.set(newValue, forKey: "nightColor") 
    } 
} 
0

Najprostszym sposobem byłoby użycie NSUserDefaults.

Prosty przykład -

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject("Coding Explorer", forKey: "userNameKey") 

W tym przypadku są przechowywane ciąg "Coding Explorer" i można odwoływać się od kluczowej "userNameKey". Jestem pewien, że można zobaczyć, jak można pracować to do rozwiązania: P

Dobrym źródłem, które pomogą Ci zacząć here

Jeśli chcesz coś trochę bardziej wytrzymałe, spojrzeć na CoreData The implementacja jest nieco bardziej skomplikowana. CoreData może nie być tym, czego potrzebujesz do prostego utrzymywania stanu, ale mimo to warto się nim zająć.

link here

Edit

Here is a great example to look at how you can save the actual color to NSUserData

+0

Już spojrzał na tych stronach. Próbuję zapisać kolor tła i potrzebuję pomocy w tym zakresie. Szukałem pomocy i nie ma tam żadnej pomocy. –

+1

@JoshSchlabach Możesz użyć NSKeyedArchiver, aby zapisać obiekt UIColor na NSUserDefaults –