Как добавить столбец в существующее окно выбора

Мне нужно многокомпонентное средство выбора, но мне нужно добавить новый столбец слева от него. Пока что есть только два из трех, которые мне нужны. Вот текущий код. Я добавил массивы, обернул массив в массив, добавил переменные в виде столбца, а также изменил выходные данные.

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

    }
}

Я добавил переменные, но я должен добавить больше скобок, и тогда я не знаю, как идентифицировать себя, например, почему страна = страна, а кошка не может = кошка? Кроме того, первый столбец, который я собираюсь добавить (далеко слева в ряду), будет иметь только 2 варианта и не повлияет на другие варианты.

1 ответ

Решение

Так как 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)"
        }    
    }
}
Другие вопросы по тегам