Swift 4 - 如何使用按钮启用/禁用键盘

时间:2017-11-16 16:52:09

标签: ios swift xcode ibaction

我棘手的问题是:

我有2个UITextView按钮。 就像你知道的那样,当我按下UITextView时,会出现键盘。嗯,这不是我想要的。

我想根据特定的@IBAction录音来启用/禁用显示器的键盘。

方案如下: - 第一个按钮(键盘图标)允许用户显示键盘以在其中一个UITextView中键入内容,并在顶部显示FirstResponder init。

  • 第二个按钮(REC图标)允许用户在预先选择的TextView中说话和显示,但不显示键盘

我已经知道有:

  

isUserInteractionEnabled

  

textViewDidBeginEditing

但它并不适合和/或解决我的问题。

这里的屏幕更加明确(不要介意第三个绿色验证按钮,它仅适用于.POST功能):

enter image description here

感谢您的帮助!

5 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您不希望键盘在用户点击textField时出现,而是只有当用户点击键盘按钮时才会出现,并且在点击其他按钮时应该忽略。

所有发布的答案主要只关注显示键盘的第二部分,并在点击按钮时解除它们。更棘手的是当用户点击textField时阻止键盘出现:)

您可以尝试的可能解决方案及其缺点:

解决方案1:

尝试设置文本字段isEnabled = false,确保这会阻止用户点击textField时出现键盘但是猜测即使在调用textfield.becomeFirstResponder()时也不会显示键盘啊麻烦:)

解决方案2:

实施UITextField委托的textFieldShouldBeginEditing并根据是否使用tapped on button或textField本身来回显真或假。

当然可行但你需要找出方法告诉textFieldShouldBeginEditing为什么它会因为按钮而触发,或者因为触摸textField会再次发生并发症。

我的解决方案:

使用2个textFields。一个人永远禁用用户交互并使用另一个textField,这个文本将永远不会出现在用户身上,但会在需要时显示键盘。

足够的谈话让代码:)

第1步:

让我们说屏幕上显示的textField名为textField

textfield.isEnabled = false

这将确保您所做的一切都不会出现键盘。

第2步:

创建第0帧的临时textField(用户永远不能点击:P)

    tempTextField = UITextField(frame: CGRect.zero)
    tempTextField.delegate = self
    self.view.addSubview(tempTextField)

第3步:

现在,当用户点击显示键盘按钮时,请使用临时textField第一响应者

tempTextField.becomeFirstResponder()

当用户点击tempTextField的其他按钮resignFirstResponder时。

tempTextField.resignFirstResponder()

第4步:

但等待用户输入任何内容时,我的textField就会显示。等等只需实现

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == tempTextField {
        self.textfield.text = (self.textfield.text ?? "") + string
    }
    return true
}

修改

您实际上并不需要两个textField,您也可以使用UILabelUITextField来实现相同的目标。我选择了UITextField,因为我不确定你的其他要求是什么!

问题已解决。希望它有所帮助:)

答案 1 :(得分:0)

单击按钮时关闭KeyBoard的功能:

@IBAction func hideKeyboard() {
     textView.resignFirstResponder()
 }

让键盘出现的功能:

 @IBAction func showKeyboard() {
     textView.becomeFirstResponder()
 }

答案 2 :(得分:0)

这样的事情应该有效:

class MyViewController: UIViewController, UITextViewDelegate {

    @IBOutlet var yourTextView: UITextView

        override func viewDidLoad() {
            super.viewDidLoad()

            yourTextView.delegate = self
        }

        @IBAction func showKeyboard(_ sender: UIButton) {
        self.yourTextView.becomeFirstResponder()

    }

      @IBAction func hideKeyboard(_ sender: UIButton) {
        self.yourTextView.resignFirstResponder()

    }

    }

答案 3 :(得分:0)

你说

  

但它并没有真正起作用。

为什么?

您可以使用(swift 3)禁用文本字段交互:

UIKeyboardWillHideNotification

接下来,当您单击键盘按钮时,您可以重新启用交互,这样当用户单击其中一个文本字段时,键盘就会打开。

在键盘关闭时(您可以看到{{1}}回调通知),您可以将交互设置为false。

答案 4 :(得分:0)

只需复制并粘贴简单代码即可为您嵌入键盘的附件按钮

 func addKeyboardToolbar()  {
    let ViewForDoneButtonOnKeyboard = UIToolbar()
    ViewForDoneButtonOnKeyboard.sizeToFit()
    let button = UIButton.init(type: .custom)
    button.setImage(UIImage.init(named: "login-logo"), for: UIControlState.normal)
    button.addTarget(self, action:#selector(doneBtnfromKeyboardClicked), for:.touchUpInside)
    button.frame = CGRect.init(x: 0, y: 0, width:UIScreen.main.bounds.width, height: 30) //CGRectMake(0, 0, 30, 30)
    let barButton = UIBarButtonItem.init(customView: button)
    ViewForDoneButtonOnKeyboard.items = [barButton]
    postTextView.inputAccessoryView = ViewForDoneButtonOnKeyboard
}


@IBAction func doneBtnfromKeyboardClicked (sender: Any) {
        self.contentView.endEditing(true)
    }