2021-08-09 iOS移动端 记一次 IQKeyboardManager 失效导致输入框被键盘遮挡的问题 iOS 14.7

Swift版本:5.4.2
Xcode版本:12.5.1
真机iOS版本 : 14.7
IQKeyboardManager版本 6.5.5
模拟器版本:14.5

真机上不正常,模拟器正常(!!!!!),推测可能跟系统版本有关。
先说一下解决方案:在ViewController 的viewDidLoad()方法中增加代码

IQKeyboardManager.shared().isEnableAutoToolbar = false

viewWillDisappear ()方法中

IQKeyboardManager.shared().isEnableAutoToolbar = true

------------------------解释

IQKeyboardManager 源码IQKeyboardManager.m 中663行adjustPosition方法中,第674行有这么一句代码

   if (_hasPendingAdjustRequest == NO ||
        textFieldView == nil ||
        rootController == nil ||
        keyWindow == nil)
        return;

如果_rootViewController是nil(断点调试显示其他几项均为true),则不会继续往下执行,即不再走调整父view坐标代码,继而出现键盘遮挡问题。
问题转换为为什么_rootViewController = nil ?
接着在1266行restorePosition方法中最后有这么一句代码

_rootViewController = nil;

且搜索发现只有这一处发现_rootViewController = nil;情况。
此时点击输入框时在此处断点,发现一个调用链方法-(void)textFieldViewDidBeginEditing:(NSNotification*)notification 方法中1603行代码

[strongSelf.textFieldView reloadInputViews];

会触发- (void)keyboardWillHide:(NSNotification*)aNotification方法,
在1529行调用1266行的restorePosition方法,最后执行_rootViewController = nil;
而1603行代码触发的条件是 [self privateIsEnableAutoToolbar],指向了一个属性
enableAutoToolbar,文档对其的解释是

/**
 Automatic add IQToolbar functionality. Default is YES.
 */

默认值是true,如果我们将其关闭,则不会触发上述代码,那么这个问题是不是就可以暂时这么解决了呢?答案是可以。

至此IQKeyboardManager 失效原因的源码断点调试过程就是这样。至于是不是系统原因还有待考证。以上均为断点调试结果,尚未深入框架原理,理解上可能有失偏颇,有了解框架原理的可以试试从底层找找原因,欢迎交流

你可能感兴趣的:(2021-08-09 iOS移动端 记一次 IQKeyboardManager 失效导致输入框被键盘遮挡的问题 iOS 14.7)