使用 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 已被释放,而键值观察者仍向其注册。当前观察信息:以上是关于使用 IQKeyboardManager 关闭键盘以及触发按钮的 touchupinside 事件的主要内容,如果未能解决你的问题,请参考以下文章
iOS IQKeyboardManager 当键盘关闭时底部黑屏
IQKeyBoardManager-键盘toolBar出现在屏幕最顶部
IQKeyboardManager 在 UITextField 上点击时隐藏键盘