swift - 更改 UIPickerView Swift 的数据

标签 swift uipickerview

我进行了很多搜索,但没有找到我的问题的答案。 我的应用程序应该在更改另一个选择器后更改一个选择器的数据。

正如你所看到的,在 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, numberOfRowsInComponent component: Int) -> Int 
{ 
    switch (picker){ 
        case leaguePicker: 
            return league.count 
        case clubPicker: 
            return club[x].count 
        default: 
            return 1 
    } 
} 

并且您的 titleForRow 可以简化:

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

关于swift - 更改 UIPickerView Swift 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46041251/

相关文章:

xcode - 设置具有正确详细信息的自定义单元格样式,但它不显示详细信息文本标签?

ios - 更改 UIPickerView 列的大小

ios - 在 iOS 的 UIDatePicker 中隐藏日期

ios - 将 UIPickerView 的组件设置为分隔符

ios - 单击 Swift 4 中的自定义按钮时调整单元格大小

swift - 将参数附加到 Swift 中的 button.addTarget 操作

ios - 移动或导出模式下的 DocumentPickerViewController 被不存在的 URL 解雇(制作文档提供程序应用程序扩展)

Swift 让用户在选择器上进行选择查看按钮的标题

iphone - UIPickerView 的奇怪尺寸问题

UITableView 快速获取 titleForHeadersInSection