2017-09-02 4 views
0

J'ai un problème avec mon application iOS. Je veux mettre en œuvre quelque chose comme un MessagingViewController où vous avez un UITextView et Button (sendButton) ci-dessous un UITableView. Si vous appuyez sur le texte, le clavier apparaît, la vue monte ... jusqu'ici tout va bien. Mais, si j'entre du texte et un onglet/appuyez sur le bouton Envoyer (indépendamment de ce qui devrait se passer maintenant) pendant la saisie ou si l'intervalle entre la saisie et l'onglet Bouton est trop petit, le tap ne sera pas reconnu . Si vous essayez iMessage ou WhatsApp ce n'est pas un problème.En tapant sur le bouton du clavier, le tap ne sera pas reconnu

Je ne sais pas quoi faire, j'ai aussi essayé CocoaPods comme SlackViewController ou InputAccessoryView mais c'est toujours le même problème. Pendant la frappe, le bouton ne sera pas reconnu. Je l'ai essayé avec le IBAction normal d'un UIButton et UITapGestureRecognizer.

J'espère que quelqu'un peut m'aider, ce problème rend l'UX horrible.

Merci beaucoup!

Editer: Voici un exemple où le bouton est dans un InputAccessoryView.

import UIKit 

class MessagingViewController: UIViewController, UITableViewDataSource { 

var messages: [String] = ["12", "32"] 
var accessory: UIView! 
var cancelButton: UIButton! 
var charactersLeftLabel: UILabel! 
var sendButton: UIButton! 


@IBOutlet var tableView: UITableView! 
@IBOutlet var messagesTextView: UITextView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    tableView.dataSource = self 
    tableView.register(UINib(nibName: TableViewCell.className, bundle:nil), 
         forCellReuseIdentifier: TableViewCell.className) 
    addAccessoryView() 

    NotificationCenter.default.addObserver(self, selector: #selector(MessagingViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
    NotificationCenter.default.addObserver(self, selector: #selector(MessagingViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 

} 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return messages.count 
} 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as? TableViewCell 

    cell?.titleLabel.text = "Sender: \(indexPath.row): " 
    cell?.detailLabel.text = messages[indexPath.row] 

    return cell! 
} 

func addAccessoryView() { 
    let frame = CGRect(x:0, y:0, width: self.view.frame.width,height: 45) 
    accessory = UIView(frame: frame) 
    accessory.backgroundColor = UIColor.lightGray 
    accessory.alpha = 0.6 
    accessory.translatesAutoresizingMaskIntoConstraints = false 
    self.messagesTextView.inputAccessoryView = accessory 


    sendButton = UIButton(type: .custom) 
    sendButton.setTitleColor(UIColor.red, for: .normal) 
    sendButton.setTitle("Send", for: .normal) 
    sendButton.setTitleColor(UIColor.white, for: .disabled) 
    sendButton.addTarget(self, action: #selector(MessagingViewController.sendButtonTapped(_:)), for: .touchUpInside) 
    sendButton.showsTouchWhenHighlighted = true 
    sendButton.isEnabled = true 
    sendButton.translatesAutoresizingMaskIntoConstraints = false 
    accessory.addSubview(sendButton) 
    let sendTrailingConstraint = NSLayoutConstraint(item: sendButton, attribute: .trailing, relatedBy: .equal, toItem: accessory, attribute: .trailing, multiplier: 1.0, constant: -20) 
    accessory.addConstraint(sendTrailingConstraint) 
    let sendCenterYConstraint = NSLayoutConstraint(item: sendButton, attribute: .centerY, relatedBy: .equal, toItem: accessory, attribute: .centerY, multiplier: 1.0, constant: 0) 
    accessory.addConstraint(sendCenterYConstraint) 
} 

func sendButtonTapped(_ sender: UIButton) { 
    messages.append(messagesTextView.text) 
    messagesTextView.text.removeAll() 

    tableView.reloadData() 
    tableView.scrollToRow(at: IndexPath(row: messages.count - 1, section: 0), at: .bottom, animated: true) 
} 

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
     if self.view.frame.origin.y == 0{ 
      self.view.frame.origin.y -= keyboardSize.height 
     } 
    } 
} 

func keyboardWillHide(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
     if self.view.frame.origin.y != 0{ 
      self.view.frame.origin.y += keyboardSize.height 
     } 
    } 
} 

}

+0

Ajoutez votre code essayé ici ou comme de github. –

Répondre

0

Je viens de tester sur mon projet, il est fonctionne sans aucun problème, ajoutez votre code pour voir ce que vous avez fait. (Je ne peux pas commenter donc je mets ceci comme réponse)

+0

j'ai ajouté un exemple, merci! –

+0

ça fonctionne parfaitement ... vous pouvez m'envoyer votre projet, je peux le tester. –

+0

Désolé mais ce n'est pas le cas, l'avez-vous testé sur votre téléphone ou sur simulateur? Par exemple, vous pouvez vérifier le pod de cacao "SlackViewController" là vous avez le même problème .. Le bouton d'envoi ne réagit pas en tapant .. Dans mon exemple, c'est juste une seule application de vue, tout ce que j'ai est le viewcontroller fichier storyboard .. Toutes les connexions entre storyboard et view Controller sont faites. –