2017-09-14 1 views
1

J'utilise ce code dans appdelegateRejeter clavier ainsi que l'événement touchupinside de bouton de tir en utilisant IQKeyboardManager

IQKeyboardManager.sharedManager().enable = true 
IQKeyboardManager.sharedManager().shouldResignOnTouchOutside = true 
IQKeyboardManager.sharedManager().touchResignedGestureIgnoreClasses = [UINavigationBar.self,UIControl.self] 

attribution touchResignedGestureIgnoreClasses propriété me permet ainsi d'utiliser l'événement UIButton si le clavier est ouvert, mais il ne licencie le clavier simultanément.

+0

IQKeyboardManager rejette le clavier wont si vous effectuez des actions grâce à des contrôles qui sont inclus dans les ** touchResignedGestureIgnoreClasses **, alors que vous avez inclus votre UIButton –

+0

@Jayachandra A Que dois-je faire alors .. si je sauter Bouton UI de cette propriété, il ne fait que rejeter le clavier l'événement ne se déclenche pas –

Répondre

0

Essayez d'ajouter cette ligne de code dans votre fonction que l'événement de bouton poignées:

self.view.endEditing = true

+0

Oui, je peux l'utiliser, mais pour cela, j'ai ajouté cette ligne dans chaque contrôleur. Mais je veux une solution générale. –

0

Dans de tels cas spécifiques que vous pourriez nécessaire pour créer votre propre bouton classe sous-classing UIButton et observer la événements à l'intérieur. Ensuite, spécifiez la classe personnalisée UIButtons comme votre propre bouton que vous avez créé.

class KOButton: UIButton { 

    var isKeyBoardOpened = false 

    // Only override draw() if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func draw(_ rect: CGRect) { 
     // Drawing code 

     self.addObserver(self, forKeyPath: "highlighted", options: .new, context: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(keyboardOpened), name: Notification.Name.UIKeyboardDidShow, object: nil) 
    } 

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
     if keyPath == "highlighted" { 
      UIApplication.shared.keyWindow?.endEditing(true) 
      self.isKeyBoardOpened = false 
     } 
    } 

    func keyboardOpened() { 
     isKeyBoardOpened = true; 
    } 


} 

Storyboard changes

J'espère que cela pourrait vous aide, si elle did't le travail suit l'autre approche mentionnée ci-dessous

Ecrire une extension pour UIViewController

// Declare a global var to produce a unique address as the assoc object handle 
private var AssociatedObjectHandle: UInt8 = 0 
extension UIViewController{ 

    var isKeyBoardOpened: Bool { 
     get { 
      return objc_getAssociatedObject(self, &AssociatedObjectHandle) as! Bool 
     } 
     set { 
      objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 


    func addKBOforButton(aButton: UIButton) { 
     aButton.addObserver(self, forKeyPath: "highlighted", options: .new, context: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(keyboardOpened), name: Notification.Name.UIKeyboardDidShow, object: nil) 
    } 

    override open func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
     if keyPath == "highlighted" { 
      UIApplication.shared.keyWindow?.endEditing(true) 
      self.isKeyBoardOpened = false 
     } 
    } 

    func keyboardOpened() { 
     isKeyBoardOpened = true; 
    } 
} 

Et puis appelez cette fonction depuis votre viewcontroller

self.addKBOForButton(aButton: button) 
+0

puis-je déclarer ces fonctions dans l'extension ViewController au lieu de la classe uibutton et l'appeler dans viewdidload afin que chaque contrôleur hérite de cette fonctionnalité ?? –

+0

cela n'a pas fonctionné pour moi –

+0

@PreetiRani j'édite ma réponse, jetez s'il vous plaît un coup d'oeil –