swift - 无论选择什么选项,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
}
}
解决方案
这似乎是模拟器中的一个错误。我测试了上面的代码和 Abdul Karim Khan 在我的设备上提供的代码以及他们应该做的工作。标签根据选择器视图中选择的选项进行更新。
推荐阅读
- operating-system - 如果线程处于临界区或进入临界区会怎样?
- java - 带有给定测试用例的 Java JUnit 测试程序输出
- graphql - Prisma GraphQL 属于并有很多关系
- wordpress - 为什么我的 WordPress 电子邮件会进入垃圾邮件文件夹?
- bash - 无法从 bash 输出中获取特定行
- amazon-web-services - hive log4j:WARN No such property [maxFileSize] in org.apache.log4j.DailyRollingFileAppender
- ios - UIActionSheet 已弃用:当它包含自定义控件时如何替换它?
- java - 如何在 Java 中更正这个 switch case?
- design-patterns - 从分层软件中的不同组件聚合信息的正确方法是什么?
- apache-spark - 在 Spark 中处理 100GB 数据需要多少虚拟内核