首页 文章

3组件Dynamic Multi UIPickerView Swift

提问于
浏览
2

我是Swift编程的新手(为了好玩而做:))并且我很难尝试创建一个3组件UIpickerview,其中每个组件根据选择的先前组件更改其值 . 我几乎得到它的工作,但坚持最后一个组件 - 在我的pickerview titleForRow方法中出现一个致命错误:索引超出范围(当它返回城市[selectedCity] .post [row])任何建议/帮助将非常感谢!

提前谢谢了 .

导入UIKit

class Country {var name:String var cities:[City]

init(name:String, cities:[City]) {
    self.name = name
    self.cities = cities
}

}

class City {var name:String var posts:[String]

init(name:String, posts:[String]) {
    self.name = name
    self.posts = posts
}

}

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

    countries.append(Country(name: "UK", cities: [City(name: "London", posts: ["L01", "L02", "L03"]),City(name: "Manchester", posts: ["M01", "M02"]), City(name: "Bristol", posts: ["B01", "B02", "B03"])]))
    countries.append(Country(name: "USA", cities: [City(name: "New York", posts: ["N01"]),City(name: "Chicago", posts: ["C01", "C02"])]))
    countries.append(Country(name: "China", cities: [City(name: "Beijing", posts: ["BL01", "BL02", "BL03", "BL04"]),City(name: "Shanghai", posts: ["SM01", "SM02"]), City(name: "Shenzhen", posts: ["SB01", "SB02", "SB03"]), City(name: "Hong Kong", posts: ["SH01"])]))

    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 if component == 1 {
        let selectedCountry = pickerView.selectedRow(inComponent: 0)
        return countries[selectedCountry].cities.count
    } else {
        let selectedCountry = pickerView.selectedRow(inComponent: 0)
        let selectedCity = pickerView.selectedRow(inComponent: 1)
        return countries[selectedCountry].cities[selectedCity].posts.count
    }
}

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

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

    let selectedCountry = pickerView.selectedRow(inComponent: 0)
    let selectedCity = pickerView.selectedRow(inComponent: 1)
    let selectedPost = pickerView.selectedRow(inComponent: 2)
    let post = countries[selectedCountry].cities[selectedCity].posts

    countryLbl.text = "The right answer was: \(post) in \(selectedCountry)"

}

}

1 回答

  • 1

    创建国家和城市对象,如下所示 . 将城市数组分配给城市 .

    class Country {
    
        var name: String
        var cities: [City]
    
        init(name:String, cities:[City]) {
            self.name = name
            self.cities = cities
        }
    }
    
    class City {
    
        var name: String
        var posts: [String]
    
        init(name:String, posts:[String]) {
            self.name = name
            self.posts = posts
        }
    }
    

相关问题