Reputation: 234
I have a question regarding pickers in swift. Just began programming in IOS and i had no prior experience in Objective-C. We have to calculate (Total Cost of Ownership) for a project and at the moment i am trying to get the information in pickers.
Problem is : I have made multiple arrays and var segment is in the first picker. But if you choose the first index "A" it should show array carA, and if i choose segment "B" it should show the carB Array.
This is my code until now!. i hope someone can help me :).
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate {
var segment = ["A","B","C","D","E"]
var kilometers = ["24000","36000","48000"]
var looptijd = ["2 jaar","3 jaar","5 jaar"]
var carA = ["Toyota Aygo","Suzuki Swift"]
var carB = ["Prius","Peugeot 207"]
var carC = ["Lexus ch270","audi a3"]
var carD = ["Lexus..","BMW X6"]
@IBOutlet weak var segmentLabel: UILabel!
@IBOutlet weak var kilometersLabel: UILabel!
@IBOutlet weak var looptijdLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
segmentLabel.text = segment[0]
kilometersLabel.text = kilometers[0]
looptijdLabel.text = looptijd[0]
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 4
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if (component == 0 ) {
return segment.count
} else {
if(component == 1) {
return kilometers.count
}
if(component == 2) {
return looptijd.count
}
if(component == 3) {
return carA.count
}
}
return component
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
if (component == 0 ) {
return segment[row]
} else {
if(component == 1) {
return kilometers[row]
}
if(component == 2) {
return looptijd[row]
}
if(component == 3){
return carA[row]
}
return nil // ARE YOU SURE RETURN IT IS NO AFTER CURLY BRACKETS ?
} // THATS WHY YOU SHOULD BETTER INDENT YOUR CODE
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if(component == 0){
var segmentSelected = segment[row]
segmentLabel.text = segmentSelected
} else {
if(component == 1) {
var kilometersSelected = kilometers[row]
kilometersLabel.text = kilometersSelected
}
if(component == 2){
var looptijdSelected = looptijd[row]
looptijdLabel.text = looptijdSelected
}
}
}
}
Upvotes: 0
Views: 962
Reputation: 23053
Here you need to create one more string array. This array can hold the selection and then reload components as first component selected is changed.
First it should be CarA
. So the default selection for that array will be first array, and then change this array value when component 0 row value is changed.
You need to reassign selection array value in pickerView(_:didSelectRow:InComponent:)
method and then after reload all picker components will do the trick.
Below code will work for you I have tested it, reimplement your logic and still if it not works leave a comment I will provide demo for you.
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var picker: UIPickerView!
var segment: [String]!
var kilometers: [String]!
var looptijd: [String]!
var carA: [String]!
var carB: [String]!
var carC: [String]!
var carD: [String]!
var selectionArray: [String]!
@IBOutlet weak var segmentLabel: UILabel!
@IBOutlet weak var kilometersLabel: UILabel!
@IBOutlet weak var looptijdLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
segment = ["A","B","C","D","E"]
kilometers = ["24000","36000","48000"]
looptijd = ["2 jaar","3 jaar","5 jaar"]
carA = ["Toyota Aygo","Suzuki Swift"]
carB = ["Prius","Peugeot 207"]
carC = ["Lexus ch270","audi a3"]
carD = ["Lexus..","BMW X6"]
selectionArray = carA
segmentLabel.text = segment[0]
kilometersLabel.text = kilometers[0]
looptijdLabel.text = looptijd[0]
picker.delegate = self
picker.dataSource = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 4
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if (component == 0 ) {
return segment.count
} else {
if(component == 1) {
return kilometers.count
}
if(component == 2) {
return looptijd.count
}
if(component == 3) {
return carA.count
}
}
return component
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
if (component == 0) {
return segment[row]
} else {
if(component == 1) {
return kilometers[row]
}
if(component == 2) {
return looptijd[row]
}
if(component == 3){
return selectionArray[row]
}
return nil // ARE YOU SURE RETURN IT IS NO AFTER CURLY BRACKETS ?
} // THATS WHY YOU SHOULD BETTER INDENT YOUR CODE
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if (component == 0) {
var selectedString = segment[row];
segmentLabel.text = selectedString
if (selectedString == segment[0]) {
selectionArray = carA
} else if (selectedString == segment[1]) {
selectionArray = carB
} else if (selectedString == segment[2]) {
selectionArray = carC
} else if (selectedString == segment[3]) {
selectionArray = carD
}
picker.reloadAllComponents()
} else {
if(component == 1) {
var kilometersSelected = kilometers[row]
kilometersLabel.text = kilometersSelected
}
if(component == 2){
var looptijdSelected = looptijd[row]
looptijdLabel.text = looptijdSelected
}
}
}
deinit {
self.picker.delegate = nil
self.picker.dataSource = nil
}
}
Upvotes: 2