代码之家  ›  专栏  ›  技术社区  ›  mrpotter

如何向预先存在的pickerview添加列

  •  1
  • mrpotter  · 技术社区  · 7 年前

    我需要一个多组件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)"
    
        }
    }
    

    我添加了变量,但我是否添加了更多括号,然后我不知道如何识别自我,比如为什么国家=国家,而猫不能=猫?此外,我要添加的第一列(该行最左边)只有两个选项,不会影响其他选项。

    1 回复  |  直到 7 年前
        1
  •  0
  •   rmaddy    7 年前

    cats 组件与国家无关,请勿添加 到您的 Countries 类(应为 struct ,顺便提一下)。

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

    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)"
            }    
        }
    }