使用 IQKeyboardManager 关闭键盘以及触发按钮的 touchupinside 事件

Posted

技术标签:

【中文标题】使用 IQKeyboardManager 关闭键盘以及触发按钮的 touchupinside 事件【英文标题】:Dismiss keyboard as well as fire button's touchupinside event using IQKeyboardManager 【发布时间】:2017-09-14 10:59:05 【问题描述】:

我在 appdelegate 中使用此代码

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

分配 touchResignedGestureIgnoreClasses 属性允许我在键盘打开但不会同时关闭键盘的情况下触发 UIButton 事件。

【问题讨论】:

如果您通过 touchResignedGestureIgnoreClasses 中包含的控件执行任何操作,IQKeyboardManager 不会关闭键盘,因为您已经包含了 UIButton @Jayachandra A 那我该怎么办.. 如果我从这个属性中跳过 UIbutton ,它只会关闭键盘事件不会被触发 【参考方案1】:

尝试在处理按钮事件的函数中添加这行代码:

self.view.endEditing = true

【讨论】:

是的,我可以使用它,但为此我在每个控制器中添加了这一行。但我想要一个通用的解决方案。【参考方案2】:

在这种特定情况下,您可能需要创建自己的按钮类子类 UIButton 并观察其中的事件。稍后将 UIButtons 自定义类指定为您自己创建的按钮。

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;
    



我希望这可能对您有所帮助,如果它不起作用,请遵循下面提到的另一种方法

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;
    

然后从你的视图控制器调用这个函数

self.addKBOForButton(aButton: button)

【讨论】:

我可以在 ViewController 扩展而不是 uibutton 类中声明这些函数并在 viewdidload 中调用它,以便每个控制器都继承此功能吗?? @PreetiRani 我正在编辑我的答案,请看一下 得到这个错误 -----> UIButton 类的实例 0x7fea88ccd6b0 已被释放,而键值观察者仍向其注册。当前观察信息:上下文:0x0,属性:0x6000006427f0>

以上是关于使用 IQKeyboardManager 关闭键盘以及触发按钮的 touchupinside 事件的主要内容,如果未能解决你的问题,请参考以下文章

iOS IQKeyboardManager 当键盘关闭时底部黑屏

IQKeyBoardManager-键盘toolBar出现在屏幕最顶部

IQKeyboardManager 在 UITextField 上点击时隐藏键盘

iOS 键盘框架IQKeyboardManager使用

iOS 键盘自适应(IQKeyboardManager)使用小结

iOS 键盘框架IQKeyboardManager使用