Как предотвратить скрытие клавиатуры в UITextView при нажатии кнопки отправки? - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть UITextView, рядом с ним и отдельно от текстового представления есть кнопка отправки.Когда пользователь вводит текст в текстовом представлении и нажимает кнопку «Отправить», клавиатура скрывается.Я не хочу прятать клавиатуру после нажатия пользователем кнопки «Отправить».Как мне этого добиться?

Обновление вопроса для предоставления более подробной информации.1) Кнопка отправки - это отдельная кнопка UIB.2) у меня нет никакого resignFirstResponder, вызываемого исключительно в коде.3) После нажатия кнопки отправки, у меня следующий код, который показывает / скрывает клавиатуру.

override func viewDidLoad() {
    super.viewDidLoad()
    // Setup keyboard event
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name:NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name:NSNotification.Name.UIKeyboardWillHide, object: nil)
}

// Setup keyboard event
@objc func keyboardWillShow(notification:NSNotification){
    print("keyboardWillShow")
    var userInfo = notification.userInfo!
    var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    keyboardFrame = self.view.convert(keyboardFrame, from: nil)

    var contentInset:UIEdgeInsets = self.scrollView.contentInset
    contentInset.bottom = keyboardFrame.size.height
    scrollView.contentInset = contentInset
}

@objc func keyboardWillHide(notification:NSNotification){
    print("keyboardWillHide")
    let contentInset:UIEdgeInsets = UIEdgeInsets.zero
    scrollView.contentInset = contentInset
}

Код отправки кнопки нажал

@IBAction func sendButtonClicked(_ sender: UIButton) {

    // Disable textview and send button while message is being sent
    messageTextView.isEditable = false
    sendButton.isEnabled = false

    fetchSendMessage( ) { (result, error) in
        if error != nil {
            ShowDialog.showDialog(title: nil, message: (error?.localizedDescription)!, viewController: self)
        } else {
            if (result?.success)! {
                self.arry = (result?.data)!

                self.fetchMessages(page: 1, completed: {
                    self.insertNewMessage(sentMessage)
                })

                // Clear the message & Enable textview and send button
                self.messageTextView.isEditable = true
                self.messageTextView.text = "Type Message"
                self.messageTextView.textColor = UIColor.greyColour
                self.sendButton.isEnabled = true
                self.messageTextView.endEditing(true)
            } else {
                ShowDialog.showDialog(title: "Message not sent", message: (result?.errors![0].message)!, viewController: self)

                // Retain typed message
                // Enable textview and send button
                self.messageTextView.isEditable = true
                self.sendButton.isEnabled = true
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Когда мы пытаемся отключить UITextView's редактируемую опцию или UserInteraction, клавиатура автоматически скрывается.

Вместо этого

messageTextView.isEditable = false

Путь 2:

Вы можете создать UIView и добавить SubSubView в UIWindow, что будетне скрыть клавиатуру, а также пользователь не может печатать.

var overView : UIView? // GLOBAL DECLARATION

func addOverView() { // CALL THIS WHEN SEND BUTTON CLICKED

   let window = UIApplication.shared.keyWindow!
   overView = UIView(frame: window.bounds)
   overView?.backgroundColor = UIColor.red.withAlphaComponent(0.4)

   let windowCount = UIApplication.shared.windows.count
   UIApplication.shared.windows[windowCount-1].addSubview(overView!)
}

func removeOverView() { // CALL THIS WHEN RESPONSE RECEIVED

    overView?.removeFromSuperview()
}

Способ вывода 2:

enter image description here

Путь 1:

Использование UTextView Delegate,

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

    if isSendBtnClicked == true {

        return false
    }


    return true
}



@IBAction func sendButtonClicked(_ sender: UIButton) {

    // Disable textview and send button while message is being sent
    self.isSendBtnClicked = true
    sendButton.isEnabled = false

    fetchSendMessage( ) { (result, error) in
        if error != nil {
            ShowDialog.showDialog(title: nil, message: (error?.localizedDescription)!, viewController: self)
        } else {
            if (result?.success)! {
                self.arry = (result?.data)!

                self.fetchMessages(page: 1, completed: {
                    self.insertNewMessage(sentMessage)
                })

                // Clear the message & Enable textview and send button
                self.isSendBtnClicked = false
                self.messageTextView.text = "Type Message"
                self.messageTextView.textColor = UIColor.greyColour
                self.sendButton.isEnabled = true
                self.messageTextView.endEditing(true)
            } else {
                ShowDialog.showDialog(title: "Message not sent", message: (result?.errors![0].message)!, viewController: self)

                // Retain typed message
                // Enable textview and send button
                self.isSendBtnClicked = false
                self.sendButton.isEnabled = true
            }
        }
    }
}

После того, как пользователь нажмет кнопку «Отправить», клавиатура не будет скрыта, и пользователь сможет ввести, но не будет вводитьtextview до ответа от fetchSendMessage()

0 голосов
/ 02 декабря 2018

Вы можете переопределить метод в UITextViewDelegate

func textViewShouldEndEditing(UITextView) -> Bool

Пусть этот метод вернет false, и UITextView не должен оставлять первый респондент, то есть закрыть клавиатуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...