Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改UIPickerView Swift的数据_Swift_Uipickerview - Fatal编程技术网

更改UIPickerView Swift的数据

更改UIPickerView Swift的数据,swift,uipickerview,Swift,Uipickerview,我一直在寻找,但我没有找到我的问题的答案。 我的应用程序应该在另一个选择器更改后更改一个选择器的数据 正如你所看到的,在titleForRow方法中,我想设置数据,我也知道这个方法只调用了一次,但我不知道应该在哪里,也不知道该怎么做 我想,在didSelectRow方法上,我也可以设置数据,但在那里我没有一点应该如何设置的线索 这是我的代码,希望对大家有所帮助 class ViewController: UIViewController, UIPickerViewDelegate, UIPick

我一直在寻找,但我没有找到我的问题的答案。 我的应用程序应该在另一个选择器更改后更改一个选择器的数据

正如你所看到的,在titleForRow方法中,我想设置数据,我也知道这个方法只调用了一次,但我不知道应该在哪里,也不知道该怎么做

我想,在didSelectRow方法上,我也可以设置数据,但在那里我没有一点应该如何设置的线索

这是我的代码,希望对大家有所帮助

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 
    var x = 0 
    @IBOutlet weak var leaguePicker: UIPickerView! 
    @IBOutlet weak var clubPicker: UIPickerView! 
    let league = ["Bundesliga", "Premier League"] 
    let club = [["ManCity", "Arsenal"],["Bayern", "Dortmund"]] 

    override func viewDidLoad() { 
        super.viewDidLoad() 
        leaguePicker.delegate = self 
        leaguePicker.dataSource = self 
        clubPicker.delegate = self 
        clubPicker.dataSource = self 
    } 

    func numberOfComponents(in picker: UIPickerView) -> Int { 
        return 1 
    } 

    func pickerView(_ picker: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
    { 
        switch (picker){ 
            case leaguePicker: 
                return league.count 
            case clubPicker: 
                return club.count 
            default: 
                return 1 
        } 
    } 

    func pickerView(_ picker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
        switch (picker){ 
            case leaguePicker: 
                return league[row] 
            case clubPicker: 
                if (x==0){ 
                    print("titleForRow call.. x=0") 
                    return club[0][row] 
                    // this is just happening at the beginning
                } else { 
                    print("titleForRow call.. x=1") 
                    return club[1][row] 
                    // this does not happen 
                } 
            default: return "an error occurred" 
        } 
    } 

    func pickerView(_ picker: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    { 
        if (picker == leaguePicker) {
             if (row==0){ 
                //clubPicker.selectRow(0, inComponent: 0, animated: true) 
                x=0 
            } else { 
            x=1 // this call is working
            //clubPicker.selectRow(0, inComponent: 1, animated: true) 
            } 
        } 
    picker.reloadAllComponents() 
    //this does not lead to call titleForRow 
    } 
}

当第一个选择器中的值更改时,需要重新加载第二个选择器

func pickerView(_ picker: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
    if (picker == leaguePicker) {
        x = row
        clubPicker.reloadAllComponents()
    }
}
您还需要修复numberOfRowsInComponent:

你的标题可以简化:

func pickerView(_ picker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    switch (picker){ 
        case leaguePicker: 
            return league[row] 
        case clubPicker: 
            return club[x][row] 
        default: return "an error occurred" 
    } 
} 
我还建议您将x变量重命名为更有用的变量,例如selectedLeague

func pickerView(_ picker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    switch (picker){ 
        case leaguePicker: 
            return league[row] 
        case clubPicker: 
            return club[x][row] 
        default: return "an error occurred" 
    } 
}