2016-12-05 5 views
0

Я пытаюсь создать приложение, которое будет иметь возможность настраивать цвета кнопок и устанавливать цвета по умолчанию, пока они не будут изменены пользователем.Сохранение и вызов функций UIColor

Я исследовал с помощью UserDefaults и ключей, и я попытался внедрить их в свой код. Несмотря на то, что я не получаю ошибку, данные сбрасываются при смене раскадровки, даже если я установил значения для данных ключа.

Любая помощь или совет будут оценены, так как это мой первый проект Xcode/Swift. Кроме того, если кто-то будет так любезен объяснить, как я бы установил цвета кнопок в других раскадках, а также в вышеупомянутых вариантах, я был бы очень признателен.

// 
// SettingsViewController.swift 
// Calculator++ 
// 
// Created by School on 12/4/16. 
// Copyright © 2016 BlueFireStudios. All rights reserved. 
// 

import UIKit 

class SettingsViewController: UIViewController { 


//Setting default values 
var defaults = UserDefaults.standard 

//Setting slider starting positions 

//Digit slider defaults 
var redValue1: CGFloat = CGFloat(UserDefaults.standard.integer(forKey: "red")) 
var greenValue1: CGFloat = CGFloat(UserDefaults.standard.integer(forKey:"green")) 
var blueValue1: CGFloat = CGFloat(UserDefaults.standard.integer(forKey: "blue")) 



//Outlet for display button labeled "4" 
@IBOutlet weak var digitdisp: UIButton! 

var myInt = Int() 

//Displays digit color settings 
func displayColors1() { 
    digitdisp.backgroundColor = UIColor(red: redValue1, green: greenValue1, blue: blueValue1, alpha: 1.0) 
    defaults.set(NSKeyedArchiver.archivedData(withRootObject: UIColor.red), 
     forKey:"red") 
    defaults.set(NSKeyedArchiver.archivedData(withRootObject: UIColor.blue), forKey:"blue") 
     defaults.set(NSKeyedArchiver.archivedData(withRootObject: UIColor.green), forKey:"green") 

} 
//Setting R color in digit RGB set (red in func displayColors1) 
@IBAction func redslider1(_ sender: UISlider) { 
    redValue1 = CGFloat(sender.value) 
    defaults.set(NSKeyedArchiver.archivedData(withRootObject: UIColor.red, forKey:"red") 
    displayColors1() 
} 

//Setting G color in digit RGB set (green in func displayColors1) 
@IBAction func greenslider1(_ sender: UISlider) { 
    greenValue1 = CGFloat(sender.value) 
    defaults.set(NSKeyedArchiver.archivedData(withRootObject: UIColor.green), forKey:"green") 
    displayColors1() 
} 

//Setting B color in digit RGB set (blue in func displayColors1) 
@IBAction func blueslider1(_ sender: UISlider) { 
    blueValue1 = CGFloat(sender.value) 
    defaults.set(NSKeyedArchiver.archivedData(withRootObject: UIColor.blue), forKey:"blue") 


    displayColors1() 

} 



override func viewDidLoad() { 
    super.viewDidLoad() 
    myInt = 50 
    displayColors1() 


    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little  preparation before navigation 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 
*/ 

}

+2

Было бы проще для людей, чтобы диагностировать, если вы упростили код вниз до минимального кода, необходимого для воспроизведения проблемы. Т.е. переписывайте его, чтобы включить только один набор цветов, одну кнопку, один набор слайдеров. Протестируйте его, посмотрите, все еще проблема, затем опубликуйте этот код. –

+0

вы можете снизить уровень сложности своих кодов, сохранив UIColor вместо 3 отдельных CGFloats. Почему бы просто не делать: 'defaults.set (signdisp.backgroundColor, forKey:" myFavoriteColor ")'? –

+0

@Joe Daniels Можете ли вы действительно сделать это прямо с объектами UIColor? Документация NSUserDefaults предполагает, что она может (напрямую) хранить типы данных списка свойств (см. Https://developer.apple.com/reference/foundation/userdefaults). Для общей работы вокруг других типов данных, но, в частности, UIColor, см. Http://stackoverflow.com/questions/1275662/saving-uicolor-to-and-loading-from-nsuserdefaults –

ответ

0

Для одного из ваших наборов цвет/кнопка/слайдер, вы сохраняете три значения по умолчанию, которые вы никогда не читали в и использовать в любом месте:

defaults.set(CGFloat(redValue2), forKey: "SetRed2") 
defaults.set(CGFloat(greenValue2), forKey: "SetGreen2") 
defaults.set(CGFloat(blueValue2), forKey: "SetBlue2") 

Единственные значения, вы читаете значения по умолчанию для вашего другого совершенно несвязанного набора ключей:

var redValue1: CGFloat = CGFloat(UserDefaults.standard.integer(forKey: "SetRed1")) 
var greenValue1: CGFloat = CGFloat(UserDefaults.standard.integer(forKey: "SetGreen1")) 
var blueValue1: CGFloat = CGFloat(UserDefaults.standard.integer(forKey: "SetBlue1")) 

Т.е. вы являетесь чтение (и запись) по умолчанию с использованием ключей, заканчивающихся символом 1, но только запись (не чтение) по умолчанию с использованием ключей, заканчивающихся символом 2.

0

Чтобы сохранить его:

var red: CGFloat = 0 
var green: CGFloat = 0 
var blue: CGFloat = 0 
var alpha: CGFloat = 0 

UserDefaults.standard.set([red, green, blue, alpha], forKey: "textColor") 

Чтобы получить:

if let textColor = prefs.array(forKey: "textColor") { 
     lblFirst.textColor = UIColor(red: textColor[0] as! CGFloat, green: textColor[1] as! CGFloat, blue: textColor[2] as! CGFloat, alpha: textColor[3] as! CGFloat) 
    } 
Смежные вопросы