Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 带有自定义UITextField选项的UIPickerView_Ios_Swift_Xcode_Uitextfield_Uipickerview - Fatal编程技术网

Ios 带有自定义UITextField选项的UIPickerView

Ios 带有自定义UITextField选项的UIPickerView,ios,swift,xcode,uitextfield,uipickerview,Ios,Swift,Xcode,Uitextfield,Uipickerview,我不确定这是否是一个新手问题,因为这是我第一次使用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"] 当用户单击my tex

我不确定这是否是一个新手问题,因为这是我第一次使用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"]
当用户单击my textField时,他们可以选择上面的字符串。如果用户选择“其他”,我希望UIPickerView关闭并更改为普通文本字段,以便用户可以输入自己的字符串。然后,如果用户删除textField中的所有自定义文本,它将返回UIPickerView

我考虑过让两个文本字段相互重叠,根据用户的选择显示/隐藏,但我觉得这不是正确的方法

任何关于如何实现这一点的帮助都将是巨大的

下面是我的课程中与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
    }
}

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

您只需检查所选选项是否为“其他”,然后设置
textField.inputView=nil
。问题会回到过去。考虑场景:“用户选择其他”,TeXFieldTo变成TeXFieldE,但用户现在想在选择器中选择一个选项。这种事经常发生。你应该有一个隐藏的文本字段,只有当“其他”被选中时才隐藏它。但是我也考虑了这一点,但是我写的是CaleDATA,现在我把文本字段写到我的实体上,我不想在我的实体中创建额外的属性,如果用户选择了一个字母,有时可能是空的。我还在其他类中引用这个属性,所以这也可能会变得非常混乱。理想情况下,如果可能的话,我会把它放在一个文本字段中?@spoax您可以编写条件代码。当用户选择其他时,考虑ObjeTeXFieldValk,在数据库中输入。在编辑模式下,尝试在数据源(字符串数组)中查找相同的值,以设置选择器视图的默认选定行。如果找到,隐藏“OtherTextField”。如果未找到,请在pickerview中设置“Other”,并用数据库值显示otherTextField。使用这种方法将减少对用户体验的混淆。