【问题标题】:UIPickerView with a custom UITextField option带有自定义 UITextField 选项的 UIPickerView
【发布时间】:2018-08-29 22:30:06
【问题描述】:

不确定这是否是菜鸟问题,因为这是我第一次使用 UIPickerView。

我班上的 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"]

当用户点击我的 textField 时,他们可以选择上述字符串。如果用户选择“其他”,我希望 UIPickerView 关闭并更改为普通的 TextField,以便用户可以输入自己的字符串。然后,如果用户删除 textField 中的所有自定义文本,它将返回到 UIPickerView。

我曾想过让 2 个文本字段相互叠加,我会根据用户的选择显示/隐藏它们,但我觉得这不是解决此问题的正确方法。

任何关于如何实现这一点的帮助都会很棒。

这是我课程中与 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
    }
}

【问题讨论】:

  • 您可以检查选择的选项是否为“其他”,然后设置textField.inputView = nil。问题会回来的。考虑场景:“用户选择'其他',文本字段变为文本字段,但用户现在想要选择选择器中的选项之一”。它一直在发生。您应该隐藏一个文本字段,并且只有在选择“其他”时才取消隐藏它。

标签: ios swift xcode uitextfield uipickerview


【解决方案1】:

根据我的意见,解决方案是: 在您的代码中,您显示选择器代替键盘,这是正确的。 现在,当用户选择“Other”时,只需在 cameraBodyTextField 中显示选定的值“Other”。 并在 cameraBodyTextField 下方显示一个额外的文本字段。 显示/隐藏可以通过具有更平滑动画的自动布局高度约束来管理。

【讨论】:

  • 我确实也考虑过这一点,但我正在写信给 CoreData,目前我正在将该 textField 写入我的实体,我不想开始在我的实体中创建有时可能会出现的额外属性如果用户选择一个字母,则为空。我也在其他类中引用了这个属性,所以这也会变得相当混乱。理想情况下,如果可能的话,我会把它放在一个 textField 中?
  • @spoax 你可以做条件代码。当用户选择其他时,考虑 otherTextField 值,以输入数据库。在编辑模式下,尝试在数据源(字符串数组)中找到相同的值,以设置选择器视图的默认选定行。如果找到,隐藏“OtherTextField”。如果未找到,请在选择器视图中设置“其他”,并显示带有数据库值的 otherTextField。使用这种方法可以减少对用户体验的混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2018-02-12
  • 2016-03-28
  • 1970-01-01
相关资源
最近更新 更多