Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.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中,键盘有时会显示在textfield picker视图中_Ios_Swift_Keyboard_Uitextfield_Uipickerview - Fatal编程技术网

在iOS中,键盘有时会显示在textfield picker视图中

在iOS中,键盘有时会显示在textfield picker视图中,ios,swift,keyboard,uitextfield,uipickerview,Ios,Swift,Keyboard,Uitextfield,Uipickerview,我有一个文本字段,点击该字段时显示UIPickerView。我将其添加为文本字段的inputView。有时,当我点击文本字段时,它会显示键盘而不是选择器视图。我还添加了一个自定义类,该类子类UITextField override func viewDidLoad() { // ... monthTextField.addTarget(self, action: #selector(monthTextFieldDidTap), for: UIControl.Event.touch

我有一个文本字段,点击该字段时显示
UIPickerView
。我将其添加为文本字段的
inputView
。有时,当我点击文本字段时,它会显示键盘而不是选择器视图。我还添加了一个自定义类,该类子类
UITextField

override func viewDidLoad() {
    // ...
    monthTextField.addTarget(self, action: #selector(monthTextFieldDidTap), for: UIControl.Event.touchDown)
}


@objc func monthTextFieldDidTap(textField: UITextField) {
    activePickerType = PickerType.month
    viewDatePicker(textField)
}

@objc func yearTextFieldDidTap(textField: UITextField) {
    activePickerType = PickerType.year
    viewDatePicker(textField)
}

func viewDatePicker(_ textField: UITextField) {
    self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
    self.datePicker.delegate = self
    self.datePicker.dataSource = self
    textField.inputView = self.datePicker
    // ...
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if (textField == monthTextField) {
        return true
    }
    return false
}
UITextField
的自定义子类:

class PickerTextField: UITextField {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func caretRect(for position: UITextPosition) -> CGRect {
        return CGRect.zero
    }

    func selectionRects(for range: UITextRange) -> [Any] {
        return []
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        UIMenuController.shared.isMenuVisible = false
        self.resignFirstResponder()
        return false
    }
}

如何确保在点击
UITextField
时不会显示键盘,并始终显示
UIPickerView

将这些行放在viewDidLoad而不是monthTextFieldDidTap中

self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
self.datePicker.delegate = self
self.datePicker.dataSource = self
monthTextField.inputView = self.datePicker



func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if (textField == monthTextField) {
    activePickerType = PickerType.month
    viewDatePicker(textField)

}
return true
}

在monthTextFieldDidTap(textField:UITextField)函数中添加self.view.endEditing()行,如下所示:

@objc func monthTextFieldDidTap(textField: UITextField) {
    self.view.endEditing(true)
    monthTextField.tintColor = UIColor.clear    //optional to use. It just removes cursor blinking on picker Textfield
    self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
    self.datePicker.delegate = self
    self.datePicker.dataSource = self
    textField.inputView = self.datePicker
    // ...
}

我有三个文本字段
monthTextField
yearTextField
statextfield
。因此,这使得其他
UIPickerView
元素不显示。将委托分配给文本字段,并在shouldbegeinediting中检查文本字段,并将这些行改为它们的行。activePickerType=PickerType.year viewDatePicker(textField)如果我没有给出
textField.inputView=pickerView
并点击第二个文本字段,我将得到
由于未捕获的异常“UIViewControllerHierarchyConsistency”而终止应用程序,原因:“子视图控制器:应具有父视图控制器:但请求的父视图控制器为:”
错误。它工作正常。我在
文本字段中分配了错误的控件。inputView
。谢谢。为viewDidLoad中的所有文本字段设置inputView。当我检查时,它不会在我的案例中显示键盘。还有什么是你在问题中没有提到的,你正在使用的吗?它适用于上述答案。请检查更新的代码。我主要是在第一次点击文本字段值时显示键盘。这适用于上面的答案。请检查更新的代码。我主要是在第一次点击文本字段值时显示键盘。