I want to save a Selected Option in a Swift UIPickerView - ios

so I have a UIPicker view. Now I have something selected now with that I want to save that selection so that the next time I go back to that page the same option that I selected is still there. right now it just goes to the first option selected which is grams.
Thx I'm new to Swift
Here is my code
#IBOutlet weak var pickerView: UIPickerView!
var measurementTypes = ["Grams","Ounces", "Pounds"]
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return measurementTypes.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return measurementTypes[row]
}
// Catpure the picker view selection
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selected = measurementTypes[row]
// This method is triggered whenever the user makes a change to the picker selection.
// The parameter named row and component represents what was selected.
}

You can simply save the selected row number in UserDefaults so that it can be accessed next time.
// Capture the picker view selection
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selected = measurementTypes[row]
// Save selected row integer in User Defaults
UserDefaults.standard.set(row, forKey: "pickerViewRow")
}
Then, in override func viewDidLoad() you can retrieve this value and set the picker view:
let row = UserDefaults.standard.integer(forKey: "pickerViewRow")
pickerView.selectRow(row, inComponent: 0, animated: False)

Related

How to connect pickerviews and labels in iOS?

I have two pickerView and two Label on my ViewController.
The question is how I could connect labels to pickerView's data array (string type) and show in labels chosen pickerView cell?
#IBOutlet weak var valuetype1: UILabel!
var pickerData: [String] = [String]()
override func viewDidLoad() {
super.viewDidLoad()
self.picker1.delegate = self
self.picker1.dataSource = self
self.picker2.delegate = self
self.picker2.dataSource = self
pickerData = ["Годы", "Месяцы", "Недели", "Дни", "Часы", "Минуты"]
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
valuetype1.text = pickerData[row]
valuetype2.text = pickerData[row]
}
How could you see I connected labels (valuetype(1..2)) to pickerData but it always show in both labels one String. I need to show in first label String chosen in pickerView1 and another string in second label, chosen in pickerView2.
UIPickerViewDelegate has a method called pickerView(_:didSelectRow:inComponent:). Add this method to your VC class. This method gets called whenever the user selects a row.
Your implementation should look somewhat similar to this.
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
valuetype1.text = pickerData[row]
}
For more information refer to the apple docs: https://developer.apple.com/documentation/uikit/uipickerviewdelegate/1614371-pickerview
EDIT:
When you are using the same controller as a delegate for multiple UIPickerViews, then you can check which picker view triggered the method call simply by comparing the pickerView argument on the pickerView(_:didSelectRow:inComponent:) method.
Try this:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView == picker1 {
valuetype1.text = pickerData[row]
} else if pickerView == picker2 {
valuetype2.text = pickerData[row]
}
}

uipickerview selecting default row

I am using a uipickerview to choose songs from. The problem is when I press play without interacting with the picker view (i.e trying to play the first song that is already selected/loaded by the picker view.) I get an error:
fatal error: unexpectedly found nil while unwrapping an Optional value
I have the code below set for didSelectRow:
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
musicChoice = songs[row]
}
And as I understand, this only initiates once the user scrolls/ interacts with the picker view - so I am trying to use selectedRow somehow but am messing up, any ideas?
Updated pickerview code below:
var songs:[String] = []
var musicChoice = "Something"
let foods = ["Apples", "Bananas", "Corn", "Beans", "Tomatoes"]
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return songs[row]
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return songs.count
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
musicChoice = songs[row]
}
The did select row method is self explanatory it says didSelectRow so you are right without interacting with the rows it doesn't initialise any thing.
Instead of selected row you can always initialise the first songs value to be played. i.e
musicChoice = songs[0]
while you declare the musicChoice variable. That would solve the purpose.

Update UITableViewCell

I've got a problem. I have this tableview and this pickerView
and this is the pickerView functions of the viewcontroller:
let gender = ["M","F"]
#IBOutlet weak var dataTableView: UITableView!
//pickerFuncs
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return gender[row]
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return gender.count
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
print(gender[row])
}
How to modify the "m" in the cell with the selection of the uipicker? thanks everybody!
Create a variable
var currentGender = "M"
Set your TableViewCell with currentGender like
cell.gender = currentGender
When you select a row in UIPickerView,
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
currentGender = gender[row]
// Then reload your TableView row
let indexPath = IndexPath(item: rowNumber, section: 0)
tableView.reloadRows(at: [indexPath], with: .top)
}
I'm assuming you want to have your M and F appear inside your pickerView. To do this you have to create a reference. This can be done through an IBOutlet or you can do it programmatically like so: let pickerView = UIPickerView(). On a side note, I am also assuming you are only using one pickerView in the View Controller. If you are using multiple, set each of the pickerViews a tag. This can be done in the interface builder and programatically like so: pickerView.tag = 1. Then change your pickerView functions based on those tags.
Create a variable.
var gender = "M"
Initialise again your gender variable. In this delegate method.
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
gender = gender[row]
// Then reload your TableView row
table view.reloadData()
}
Add these lines to your cellforrow_atIndexPath.
Cell.genderIdicatorLbl.text = gender
Note: genderIndicatorLbl is IBOutlet for your gender indicator Label

extract value from UIpickerview as variable

so i have this code for a UIpickerview and i want to get the value selected as a variable to use later, i tried using a variable gravity but it says "initialisation of variable gravity was never used...." here's my code:
var g = ["9.807", "3.711"]
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return g.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return g[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
var gravity = Float(g[row])
}
You need to declare the var outside of the scope of your method:
var gravity: Float?
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
gravity = Float(g[row])
}
A local variable scope is limited to the method and as you don't use it within the method you get a warning for that.
This is Swift not Javascript :)
Your gravity var is local, so the given warning makes total sense (i.e., its scope is limited to the given function).
You should use the following UIPickerView method to get the currently selected index:
func selectedRow(inComponent component: Int) -> Int
For instance:
let gIndex = pickerView.selectedRow(inComponent: 0)
let gValue = Float(g[gIndex])!
Note that you do not even need to implement the didSelectRow delegate method to get this information.
As correctly pointed out in the comments, you of course need to declare and bind your UIPickerView to an instance var of your view controller:
#IBOutlet weak var pickerView: UIPickerView!
To use pickerView, first mention its DataSource and Delegate.
UIPickerViewDataSource, UIPickerViewDelegate
Now create this by right clicking on pickerView -> to the ViewContoller.swfit.You will get like:
#IBOutlet var pickerView: [UIPickerView]!
Create an array which contains the content you want to show in pickerView. Just like this:
var array:[String] = ["David","Mikel","Akhil","Akshay","Zlatan"]
Now you have to use pickerView functions. These functions can only be used if you mention DataSource and Delegate in class. The functions are:
// number of rows or number of components
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
// number of rows that we have to set
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return array.count
}
// set title in picker view according to the elements
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return array[row]
}
// when an element is selected, store in a string
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
pickerString = array[row]
print(pickerString) // pickerString is String type. You can create this, to show the content selected.
}

Save UIPickerView selection to NSUserDefaults swift

I am trying to save the user's selection from UIPickerView to NSUserDefaults. I have found answers in obj-c but not swift. Here is my UIPickerView code:
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return pickerData[row]
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
race = pickerData[row]
}
And when you press a save button, it is supposed to save what is selected to NSUserDefaults. Here is my saving code:
#IBAction func save(sender: AnyObject) {
var defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(race, forKey: "race")
}
When I try to display the text on a label, it shows up blank:
override func viewDidLoad() {
super.viewDidLoad()
self.raceLabel.text = defaults.objectForKey("race") as? String
Let me know if my question needs any clarification, thanks.
Update your code as specified below and it will work
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
race = row
}
Every time you select a row, this function is called and the argument of the parameter row represents the row that was selected in your UIPickerView.
If you assign pickerData[row] value to race, you are assigning a value from your pickerData array at the index number represented by the row selected in your UIPickerView Object.

Resources