带有自定义 UITextField 选项的 UIPickerView
UIPickerView with a custom UITextField option
不确定这是否是菜鸟问题,因为我是第一次使用 UIPickerView。
我的 class 中的 UIPickerView 有这个数组:
let cameraBodies = ["A","B","C","D","E","F","G","H","I","J",
"K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z","Other"]
当用户单击我的文本字段时,他们可以选择上述字符串。如果用户选择 "other",我希望 UIPickerView 关闭并更改为普通的 TextField,以便用户可以输入自己的字符串。然后,如果用户删除 textField 中的所有自定义文本,它将 return 到 UIPickerView。
我考虑过将 2 个文本字段放在彼此之上 show/hide,具体取决于用户的选择,但我觉得这不是解决此问题的正确方法。
任何有关如何实现此目标的帮助都将非常有用。
这是我的 class 中与 UIPickerView 相关的部分:
class newCameraController : UIViewController{
var selectedBody: String?
var cameraBodyCustomTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Custom Camera Body"
return textField
}()
override func viewDidLoad() {
super.viewDidLoad()
createBodyPicker()
createToolBar()
}
func createBodyPicker() {
let bodyPicker = UIPickerView()
bodyPicker.delegate = self
cameraBodyTextField.inputView = bodyPicker
}
func createToolBar() {
let toolBar = UIToolbar()
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(newCameraController.dismissKeyboard))
toolBar.setItems([doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
cameraBodyTextField.inputAccessoryView = toolBar
}
override func dismissKeyboard() {
view.endEditing(true)
}
extension newCameraController: UIPickerViewDelegate, UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return cameraBodies.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return cameraBodies[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedBody = cameraBodies[row]
cameraBodyTextField.text = selectedBody
}
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
var label: UILabel
if let view = view as? UILabel {
label = view
} else {
label = UILabel()
}
label.textColor = UIColor(red:0.63, green:0.63, blue:0.63, alpha:1.0)
label.textAlignment = .center
label.font = UIFont(name: "Avenir-Medium", size: 16.0)
label.text = cameraBodies[row]
return label
}
}
根据我的看法,解决方案是:
在您的代码中,您显示的是选择器而不是键盘,这是正确的。
现在,当用户选择 "Other" 时,只需在 cameraBodyTextField 中显示所选值 "Other"。
并在 cameraBodyTextField 下方显示一个额外的文本字段。
Show/Hide 可以通过具有更流畅动画的自动布局高度约束进行管理。
不确定这是否是菜鸟问题,因为我是第一次使用 UIPickerView。
我的 class 中的 UIPickerView 有这个数组:
let cameraBodies = ["A","B","C","D","E","F","G","H","I","J",
"K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z","Other"]
当用户单击我的文本字段时,他们可以选择上述字符串。如果用户选择 "other",我希望 UIPickerView 关闭并更改为普通的 TextField,以便用户可以输入自己的字符串。然后,如果用户删除 textField 中的所有自定义文本,它将 return 到 UIPickerView。
我考虑过将 2 个文本字段放在彼此之上 show/hide,具体取决于用户的选择,但我觉得这不是解决此问题的正确方法。
任何有关如何实现此目标的帮助都将非常有用。
这是我的 class 中与 UIPickerView 相关的部分:
class newCameraController : UIViewController{
var selectedBody: String?
var cameraBodyCustomTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Custom Camera Body"
return textField
}()
override func viewDidLoad() {
super.viewDidLoad()
createBodyPicker()
createToolBar()
}
func createBodyPicker() {
let bodyPicker = UIPickerView()
bodyPicker.delegate = self
cameraBodyTextField.inputView = bodyPicker
}
func createToolBar() {
let toolBar = UIToolbar()
toolBar.sizeToFit()
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(newCameraController.dismissKeyboard))
toolBar.setItems([doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
cameraBodyTextField.inputAccessoryView = toolBar
}
override func dismissKeyboard() {
view.endEditing(true)
}
extension newCameraController: UIPickerViewDelegate, UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return cameraBodies.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return cameraBodies[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedBody = cameraBodies[row]
cameraBodyTextField.text = selectedBody
}
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
var label: UILabel
if let view = view as? UILabel {
label = view
} else {
label = UILabel()
}
label.textColor = UIColor(red:0.63, green:0.63, blue:0.63, alpha:1.0)
label.textAlignment = .center
label.font = UIFont(name: "Avenir-Medium", size: 16.0)
label.text = cameraBodies[row]
return label
}
}
根据我的看法,解决方案是: 在您的代码中,您显示的是选择器而不是键盘,这是正确的。 现在,当用户选择 "Other" 时,只需在 cameraBodyTextField 中显示所选值 "Other"。 并在 cameraBodyTextField 下方显示一个额外的文本字段。 Show/Hide 可以通过具有更流畅动画的自动布局高度约束进行管理。