Search code examples
iosswiftuipickerview

Make UIPickerView choice (currency selection) saved for user (Swift)?


My app displays the price of something in £ currency by default when opening the app. I can change the currency but when the app is closed it reverts back to £. How can I make the user selection on the picker override the default currency and save until changed again? I think it is using UserDefaults? I haven't been able to figure it out yet.

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

//    let defaults = UserDefaults.standard

let baseURL = "https://apiv2.bitcoinaverage.com/indices/global/ticker/BTC" // API
let currencyArray = ["AUD", "BRL","CAD","CNY","EUR","GBP","HKD","IDR","ILS","INR","JPY","MXN","NOK","NZD","PLN","RON","RUB","SEK","SGD","USD","ZAR"] // List of currencies
let currencySymbolArray = ["$", "R$", "$", "¥", "€", "£", "$", "Rp", "₪", "₹", "¥", "$", "kr", "$", "zł", "lei", "₽", "kr", "$", "$", "R"]           // Currency symbols
var currencySelected = ""
var finalURL = ""


// Pre-setup IBOutlets
@IBOutlet weak var priceLabel: UILabel!
@IBOutlet weak var currencyPicker: UIPickerView!
@IBOutlet weak var doneButton: UIButton!

@IBAction func doneButton(_ sender: UIButton) {

    currencyPicker.isHidden = true
    doneButton.isHidden = true

}



override func viewDidLoad() {
    super.viewDidLoad()




    currencyPicker.delegate = self
    currencyPicker.dataSource = self

    currencyPicker.selectRow(5, inComponent:0, animated:false) // Select default currency choice to £


    // Print out the default row price 

    finalURL = baseURL + currencyArray[5]
    print(finalURL)
    currencySelected = currencySymbolArray[5]
    getBitcoinData(url: finalURL)

    currencyPicker.isHidden = true
    doneButton.isHidden = true

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
    tapGesture.numberOfTapsRequired = 1
    priceLabel.isUserInteractionEnabled = true
    priceLabel.addGestureRecognizer(tapGesture)
}

@objc func handleTap(_ sender: UITapGestureRecognizer? = nil)
{
    self.currencyPicker.isHidden = false
    self.doneButton.isHidden = false



}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}




// Number of columns

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}
// Number of rows

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return currencyArray.count // Number of rows = the amount in currency array
}

// Row Title

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
   return currencyArray[row]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    finalURL = baseURL + currencyArray[row]
    print(finalURL)
    currencySelected = currencySymbolArray[row]
    getBitcoinData(url: finalURL)

}


//MARK: - Networking
/***************************************************************/

func getBitcoinData(url: String) {

    Alamofire.request(url, method: .get)
        .responseJSON { response in
            if response.result.isSuccess {

                print("Sucess! Got the Bitcoin data.")
                let bitcoinJSON : JSON = JSON(response.result.value!)

                self.updateBitcoinData(json: bitcoinJSON)

            } else {
                print("Error: \(String(describing: response.result.error))")
                self.priceLabel.text = "Error: Check Connection"
            }
    }

}

//MARK: - JSON Parsing
/***************************************************************/

func updateBitcoinData(json : JSON) {

    if let bitcoinResult = json["ask"].double {

        priceLabel.text = currencySelected + String(bitcoinResult)
    } else {
        priceLabel.text = "Price Unavaiable"
    }
}

// let timer = Timer.scheduledTimer(timeInterval: 15, target: self, selector: #selector(self.someMethod), userInfo: nil, repeats: true)
 }

Solution

  • In viewDidLoad()

    if let selectedCurrency = UserDefaults.standard.integer(forKey: "selectedCurrency") {
        currencyPicker.selectRow(selectedCurrency, inComponent:0, animated:false)
    }
    else {
        currencyPicker.selectRow(5, inComponent:0, animated:false)
    }
    

    In didSelectRow

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
       UserDefaults.standard.set(row, forKey: "selectedCurrency")
    }