【问题标题】:Dismiss keyboard as well as fire button's touchupinside event using IQKeyboardManager使用 IQKeyboardManager 关闭键盘以及触发按钮的 touchupinside 事件
【发布时间】: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 ,它只会关闭键盘事件不会被触发

标签: ios swift iqkeyboardmanager


【解决方案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>
猜你喜欢
  • 2018-01-12
  • 2013-07-03
  • 1970-01-01
  • 2019-06-06
  • 2013-03-12
  • 2020-02-19
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
相关资源
最近更新 更多