如何将列添加到pre-exisiting pickerview

时间:2018-01-16 14:36:05

标签: arrays swift labels pickerview

我需要一个多组件选择器视图,但我需要在它的最左边添加一个新列。到目前为止,它只有我需要的三个中的两个。这是当前的代码。我已经添加了数组,在数组中包装了一个数组,将变量添加为列并且还更改了输出。

import UIKit

class Country {
    var cats: String
    var country: String
    var cities: [String]

    init(country:String, cities:[String]) {
        self.cats = cat
        self.country = country
        self.cities = cities
    }
}

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var countryLbl: UILabel!

    var countries = [Country]()

    override func viewDidLoad() {
        pickerView.delegate = self
        pickerView.dataSource = self

        cats.apppend(Cat(cat: "furry",
        countries.append(Country(country: "India", cities: ["Delhi", "Ahmedabad", "Mumbai", "Pune"]))
        countries.append(Country(country: "USA", cities: ["New York", "DC", "Fairfax"]))
        countries.append(Country(country: "Austrailia", cities: ["Sydney", "Melbourne"]))

        super.viewDidLoad()
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 3
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        if component == 0 {
            return countries.count
        }
        else {
            let selectedCountry = pickerView.selectedRow(inComponent: 0)
            return countries[selectedCountry].cities.count
        }

    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if component == 0 {
            return countries[row].country
        }
        else {
            let selectedCountry = pickerView.selectedRow(inComponent: 0)
            return countries[selectedCountry].cities[row]
        }
    }

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

        let selectedCountry = pickerView.selectedRow(inComponent: 0)
        let selectedCity = pickerView.selectedRow(inComponent: 1)
        let country = countries[selectedCountry].country
        let city = countries[selectedCountry].cities[selectedCity]

        countryLbl.text = "Country: \(country)\nCity: \(city)"

    }
}

我添加了变量,但我添加了更多括号,然后我不知道如何识别自己,为什么country = country但cat不能= cat?此外,我要添加的第一列(最左边的行)只有2个选项,不会影响其他选择。

1 个答案:

答案 0 :(得分:0)

由于cats组件与国家/地区无关,因此请勿将cats添加到Countries类(顺便说一下,应该是struct

在视图控制器中只有一个单独的cats数组。您需要更新所有选择器视图方法。

struct Country {
    let country: String
    let cities: [String]
}

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    @IBOutlet weak var pickerView: UIPickerView!
    @IBOutlet weak var countryLbl: UILabel!

    let cats = ["Cat1", "Cat2"]    
    var countries = [Country]()

    override func viewDidLoad() {
        pickerView.delegate = self
        pickerView.dataSource = self

        countries.append(Country(country: "India", cities: ["Delhi", "Ahmedabad", "Mumbai", "Pune"]))
        countries.append(Country(country: "USA", cities: ["New York", "DC", "Fairfax"]))
        countries.append(Country(country: "Austrailia", cities: ["Sydney", "Melbourne"]))

        super.viewDidLoad()
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 3
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if component == 0 {
            return cats.count
        } else if component == 1 {
            return countries.count
        } else {
            let selectedCountry = pickerView.selectedRow(inComponent: 1)
            return countries[selectedCountry].cities.count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if component == 0 {
            return cats[row]
        } else if component == 1 {
            return countries[row].country
        } else {
            let selectedCountry = pickerView.selectedRow(inComponent: 1)
            return countries[selectedCountry].cities[row]
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if component == 0 {
            // do something with the new cat
        } else if component == 1 || component == 2 {
            if component == 1 {
                pickerView.reloadComponent(2)
            }

            let selectedCountry = pickerView.selectedRow(inComponent: 1)
            let selectedCity = pickerView.selectedRow(inComponent: 2)
            let country = countries[selectedCountry].country
            let city = countries[selectedCountry].cities[selectedCity]

            countryLbl.text = "Country: \(country)\nCity: \(city)"
        }    
    }
}