Ios 关闭键盘和点火按钮';使用IQKeyboardManager触发touchupinside事件

Ios 关闭键盘和点火按钮';使用IQKeyboardManager触发touchupinside事件,ios,swift,iqkeyboardmanager,Ios,Swift,Iqkeyboardmanager,我正在appdelegate中使用此代码 IQKeyboardManager.sharedManager().enable = true IQKeyboardManager.sharedManager().shouldResignOnTouchOutside = true IQKeyboardManager.sharedManager().touchResignedGestureIgnoreClasses = [UINavigationBar.self,UIControl.self] 分配to

我正在appdelegate中使用此代码

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

分配touchResignedGestureIgnoreClasses属性允许我在键盘打开时触发UIButton事件,但不会同时解除键盘

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


self.view.endEditing=true

在这种特定情况下,您可能需要创建自己的按钮类子分类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;
    }
}
然后从viewcontroller调用此函数

self.addKBOForButton(aButton: button)

如果您通过touchResignedGestureIgnoreClasses中包含的控件执行任何操作,IQKeyboardManager不会关闭键盘,因为您已经包含了UIButton@JayachandraA那我该怎么办。。如果我从这个属性中跳过UIbutton,它只会关闭键盘事件don't get firedYes我可以使用它,但为此我在每个控制器中添加了这一行。但是我想要一个通用的解决方案。我可以在ViewController扩展中声明这些函数而不是uibutton类,并在viewdidload中调用它,以便每个控制器都继承此功能吗???@PreetiRani我正在编辑我的答案,请查看获取此错误------>类UIButton的实例0x7fea88ccd6b0已解除分配,而键值观察器仍在向其注册。当前观测信息:(