首页 > 解决方案 > 无论选择什么选项,Swift UIPickerView 默认为最后一个选项

问题描述

我有一个 UIPickerView,当点击完成按钮时,会一直选择数组的最后一个选项。我可以点击 UITextField 或我正在使用的将 UITextField 分配为第一响应者的按钮。我的代码如下:

编辑。我还应该提到,我正在使用 Xcode 11 GM Seed,如果这会有所作为的话。我在一个单独的项目上测试了下面显示的代码的干净版本,没有其他任何东西,它显示了相同的行为。

@IBOutlet weak var sortTypeTextField: UITextField!

var selectedSortOption = String()

let sortOptions = [
        USER_REVIEWS_SORT_OPTION_DATE,
        USER_REVIEWS_SORT_OPTION_LIKES,
        USER_REVIEWS_SORT_OPTION_DISLIKES
    ]

上面的 sortOptions 是位于不同文件中的字符串数组,但出于这个问题的目的,我将在此处添加:

let USER_REVIEWS_SORT_OPTION_DATE = "Date"
let USER_REVIEWS_SORT_OPTION_LIKES = "Number of Likes"
let USER_REVIEWS_SORT_OPTION_DISLIKES = "Number of Dislikes"
let DONE_TOOLBAR_BUTTON_TITLE = "Done"

我有一个函数 setupUI,我在 viewDidLoad 中调用它以及 sortTypeTextField 的值。该值是 viewController 第一次加载时数组中的第一个字符串。

override func viewDidLoad() {
    super.viewDidLoad()
    setupUI()
}

func setupUI() {
    sortTypeTextField.text = sortOptions[0]
    createSortPicker()
    createPickerToolbar()
}

func createSortPicker() {
    let sortPicker = UIPickerView()
    sortPicker.delegate = self
    sortTypeTextField.inputView = sortPicker
}

func createPickerToolbar() {
    let toolBar = UIToolbar()
    toolBar.sizeToFit()
    let doneButton = UIBarButtonItem(title: DONE_TOOLBAR_BUTTON_TITLE, style: .plain, target: self, action: #selector(dismissKeyboard))
    toolBar.setItems([doneButton], animated: false)
    toolBar.isUserInteractionEnabled = true
    sortTypeTextField.inputAccessoryView = toolBar
}

@objc override func dismissKeyboard() {
    view.endEditing(true)
}

我还使用一个按钮来显示 UIPicker,如下所示:

@IBAction func sortRatingsButtonWasTapped(_ sender: Any) {
    sortTypeTextField?.becomeFirstResponder()
}

如下所示,我希望将 sortTypeTextField 值更改为所选选项,但由于某种原因,当点击工具栏中的“完成”按钮时,无论我选择了第一个、第二个,显示的文本始终是数组中的第三个字符串或第三个。

extension ReviewsViewController: UIPickerViewDelegate, UIPickerViewDataSource {

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        sortOptions.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return sortOptions[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        selectedSortOption = sortOptions[row]
        sortTypeTextField.text = selectedSortOption
    }

}

标签: swiftuipickerview

解决方案


这似乎是模拟器中的一个错误。我测试了上面的代码和 Abdul Karim Khan 在我的设备上提供的代码以及他们应该做的工作。标签根据选择器视图中选择的选项进行更新。


推荐阅读