连接多个 UIPickerView 时,titleForRow 出错

When connecting multiple UIPickerView,having error at titleForRow

我正在为具有 UIDatePickerUIPickerViewTableView 的汽车创建高级搜索,但我遇到了问题 titleForRow.And 我可以正确地看到数据,如果我隐藏了一个 pickerview(分数)并看到另一个 pickerview(结果)。但是在我打开第二个 pickerview(结果)并打开另一个 pickerview(分数)而不隐藏第一个之后,当我尝试滚动分数选择器时我有错误titleForRow 表示 "Array Index out of Range"。那么,如果我要在一个视图控制器上使用多个 pickerview?我如何以正确的方式连接它们?有什么帮助吗?

这是我为 2picker 和 1date picker 设计的,

Pic 1

如您所见,当我点击其中一个静态 table 单元格时,选择器出现,当我再次点击时,选择器隐藏。

这是我的高级搜索控制器

Pic 2

这是我用来控制 pickerview 和静态 table 单元格的代码

var pickerCollection : String = "Score"

override func viewDidLoad() {
    TegKeychain.set("currentView", value: "Advance")
    super.viewDidLoad()
    datePickerChanged()
    //self.scorePicker?.delegate = self

    scoreDetailLabel.text = scoresValues[0]
    resultDetailLabel.text = resultsValues[0]

    detailLabel.text = venue
}

override func viewDidAppear(animated: Bool) {
    TegKeychain.set("currentView", value: "Advance")
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if indexPath.section == 0 && indexPath.row == 0 {
        toggleDatepicker()
    }
    if indexPath.section == 2 && indexPath.row == 0{
        pickerCollection = "Score"
        toggleScorePicker()
        scorePicker.reloadAllComponents()
    }
    if indexPath.section == 2 && indexPath.row == 2{
        pickerCollection = "Result"
        toggleResultPicker()
        resultPicker.reloadAllComponents()
    }
    println("Section : \(indexPath.section)")
    println("Row : \(indexPath.row)")
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if datePickerHidden && indexPath.section == 0 && indexPath.row == 1 {
        return 0
    }
    else if scorePickerHidden && indexPath.section == 2 && indexPath.row == 1{
        return 0
    }
    else if resultPickerHidden && indexPath.section == 2 && indexPath.row == 3{
        return 0
    }
    return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if pickerCollection == "Score"{
        return scoresValues.count
    }
    if pickerCollection == "Result"{
        return resultsValues.count
    }
    return 0
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    if pickerCollection == "Score"{
        return scoresValues[row]
    }
    if pickerCollection == "Result"{
        return resultsValues[row]
    }
    return ""
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerCollection == "Score"{
        scoreDetailLabel.text = scoresValues[row]
    }
    if pickerCollection == "Result"{
        resultDetailLabel.text = resultsValues[row]
    }
}

// I will not show Date Picker to make it simple.

结果选择器和分数选择器

/////////////////////////////////////////////////////// Scores ///////////////////////////////////////////////////////////////////

var scorePickerHidden = true

var scores :[String:String] = ["":"All","S":"S","R":"R","RA":"RA","above 5":"Above 5","above 4":"Above 4","above 3":"Above 3","above 2":"Above 2","above 1":"Above 1","above 0":"Above 0"]
var scoresValues : [String] = ["All","S","R","RA","Above 5","Above 4","Above 3","Above 2","Above 1","Above 0"]

func toggleScorePicker() {

    scorePickerHidden = !scorePickerHidden

    tableView.beginUpdates()
    tableView.endUpdates()

}

/////////////////////////////////////////////////////// Results ///////////////////////////////////////////////////////////////////

var resultPickerHidden = true

var results :[String:String] = ["":"All","not yet":"Not Yet","unsold":"Unsold","sold by nego":"Sold by nego","others":"Others"]
var resultsValues : [String] = ["All","Not Yet","Unsold","Sold by nego","Others"]

func toggleResultPicker() {

    resultPickerHidden = !resultPickerHidden

    tableView.beginUpdates()
    tableView.endUpdates()

}

有什么帮助和建议吗?我不能只使用单个选择器,因为它不符合我的要求 design.So,有没有其他方法,当适当的静态单元格被点击时,我可以连接我正确的选择器视图?

如果您要使用多个选择器视图,则必须在属性 Inspector.So 处使用标签 属性,假设我们有两个 UIPickerView。在属性检查器中,设置每个带有标签 #1 的 UIPickerView 和另一个带有 #2.And 的 UIPickerView 确保它们都连接到同一视图控制器的委托和数据源。

然后在你的代码中,

var scoresValues = []
var resultsValues = []

override func viewDidLoad(){
    super.viewDidLoad()
    scoreValues = ["a","b",...]
    resultsValue = ["c","d",...]   
}

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if pickerView.tag == 1{
        return scoresValues.count
    }
    else{
        return resultsValues.count
    }
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    if pickerView.tag == 1{
        return scoresValues[row]
    }
    else{
        return resultsValues[row]
    }
}

我展示的是使用 2 个选择器 only.If 你想使用更多选择器,你可以使用 if/else 或开关来处理它们。