Моя кнопка должна быть нажата дважды, прежде чем мой текст будет добавлен в мой tableView - PullRequest
0 голосов
/ 16 марта 2020

У меня есть UITextView и кнопка, программно ограниченная в UIView, когда нажатие текстового представления показывает клавиатуру, и представление перемещается вверх с помощью клавиатуры, как я хочу, поскольку у меня есть функции, которые имеют дело с этим

Моя проблема заключается в том, что когда я вставляю какой-то текст в UITextView, мне нужно дважды нажать кнопку, прежде чем вызывать установленную мной функцию, и в табличном представлении отображаются данные

Кто-нибудь знает причину, почему это так? происходит, и почему это не работает при первом нажатии на кнопку, вот мой код

var message = [String]()

let messageView: UIView = {
    let view = UIView()
    return view     
}()

let sendButton: UIButton = {
    let button = UIButton()
    button.setTitle(" send", for: .normal)
    button.setTitleColor(.green, for: .normal)
    button.addTarget(self, action: #selector(handleSend), for: .touchUpInside)
    return button
}()

@objc func handleSend() {
      message.append(messageTextView.text)
      tableview.reloadData()
}

let messageTextView: UITextView = {
    let textView = UITextView()
    textView.textColor = .black
    textView.font = UIFont.preferredFont(forTextStyle: .headline)

    return textView
}()

let line: UILabel = {
    let label = UILabel()
    label.backgroundColor = .gray
    return label
}()

let tableview: UITableView = {
    let tv = UITableView()
    tv.backgroundColor = UIColor.white
    tv.translatesAutoresizingMaskIntoConstraints = false
    return tv
}()


override func viewDidLoad() {
    super.viewDidLoad()

    constraints()
    hideKeyboardWhenTappedAround()

    tableview.delegate = self
    tableview.dataSource = self
    tableview.register(TableViewCell.self, forCellReuseIdentifier: "cell")
    tableview.separatorStyle  = UITableViewCell.SeparatorStyle.none

   NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:       UIWindow.keyboardWillShowNotification, object: nil)

  NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: UIWindow.keyboardWillHideNotification, 

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return message.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
   return UITableView.automaticDimension
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->     UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell


    cell.textLabel?.text = message[indexPath.row]
    cell.selectionStyle = .none
    cell.textLabel?.numberOfLines = 0

    return cell

}

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Я сталкиваюсь с этим типом проблем во многих различных областях, не только связанных с клавиатурой.

Я обнаружил, что наилучшим решением является помещение функций в очередь, даже 1 миллисекунды вполне достаточно! .

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1), execute:
        {
             // YOUR CODE WILL BE EXECUTED IN THIS BLOCK
        })

Этот DispatchQueue.main.asyncAfter помог мне решить многие проблемы, когда код должен работать, но не работает.

0 голосов
/ 16 марта 2020

Хотя ваш код неясен, но я думаю, я понял, почему вы можете столкнуться с этой проблемой. Я вижу, у вас есть вызов метода hideKeyboardWhenTappedAround(), здесь, если вы используете UITapGestureRecognizer, вы можете установить cancelsTouchesInView на false.

Когда это свойство равно false, представление получает все касания в последовательности мультитач, которая не соответствует состоянию по умолчанию, равному true, когда ранее доставленные касания отменяются.

...