2021-08-09 iOS移動端 記一次 IQKeyboardManager 失效導(dǎo)致輸入框被鍵盤遮擋的問題 iOS 14.7

Swift版本:5.4.2
Xcode版本:12.5.1
真機(jī)iOS版本 : 14.7
IQKeyboardManager版本 6.5.5
模擬器版本:14.5

真機(jī)上不正常,模擬器正常(!!!!!),推測可能跟系統(tǒng)版本有關(guān)。
先說一下解決方案:在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(斷點調(diào)試顯示其他幾項均為true),則不會繼續(xù)往下執(zhí)行,即不再走調(diào)整父view坐標(biāo)代碼,繼而出現(xiàn)鍵盤遮擋問題。
問題轉(zhuǎn)換為為什么_rootViewController = nil ?
接著在1266行restorePosition方法中最后有這么一句代碼

_rootViewController = nil;

且搜索發(fā)現(xiàn)只有這一處發(fā)現(xiàn)_rootViewController = nil;情況。
此時點擊輸入框時在此處斷點,發(fā)現(xiàn)一個調(diào)用鏈方法-(void)textFieldViewDidBeginEditing:(NSNotification*)notification 方法中1603行代碼

[strongSelf.textFieldView reloadInputViews];

會觸發(fā)- (void)keyboardWillHide:(NSNotification*)aNotification方法,
在1529行調(diào)用1266行的restorePosition方法,最后執(zhí)行_rootViewController = nil;
而1603行代碼觸發(fā)的條件是 [self privateIsEnableAutoToolbar],指向了一個屬性
enableAutoToolbar,文檔對其的解釋是

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

默認(rèn)值是true,如果我們將其關(guān)閉,則不會觸發(fā)上述代碼,那么這個問題是不是就可以暫時這么解決了呢?答案是可以。

至此IQKeyboardManager 失效原因的源碼斷點調(diào)試過程就是這樣。至于是不是系統(tǒng)原因還有待考證。以上均為斷點調(diào)試結(jié)果,尚未深入框架原理,理解上可能有失偏頗,有了解框架原理的可以試試從底層找找原因,歡迎交流????

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容