iOS13で、アラートが表示されなくなる場合がある
yuhnag opened this issue · comments
iOS 13にて、UIViewControllerをセットせずにshow()をコールすると、下記のような現象が起こるようです。
お手数ですが、確認をお願いできませんでしょうか。
現象
1.デバッグに以下の警告が表示される
Keyboard cannot present view controllers (attempted to present <UIAlertController: 0x------->
2.アラートが表示できなくなる
アラートを頻繁に表示していると、何かのタイミングで、それ以降、アラートが表示できなくなります。
詳細な再現条件は分かっていませんが、下記のコードのように、テキストフィールドを持つアラートを表示し、キーボードが表示されているタイミングで、OK等のクロージャから次のアラートを表示すると、私の環境(6世代iPad, iPadOS 13.4.1)ではほぼ再現します。
ただ、頻度は低いですが、キーボードを表示しなくても、同じ現象が発生する場合があります。
この現象が発生すると、以降、アラートを表示しようとすると、デバッグエリアに、下記のような警告が表示されます。
[View] First responder error: non-key window attempting reload - allowing due to manual keyboard (first responder window is <UIRemoteKeyboardWindow: 0x105869c00; frame = (0 0; 768 1024); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x28157ed00>>, key window is <UITextEffectsWindow: 0x1049365e0; frame = (0 0; 768 1024); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x2815c6040>>)
ALRT.create(.alert, title: "テスト", message: "テスト")
.addTextField { textfield in
textfield.placeholder = ""
textfield.tag = 0
}
.addOK() { action, textFields in
// このアラートは表示されず、以降、アラートが表示できなくなる
ALRT.create(.alert, title: "エラー", message: "エラー").addOK().show()
}
.addCancel()
.show()
3.アラートのテキストエリアにフォーカスがあたらず、キーボードが自動表示されない
原因
UIApplication.topMostViewController()が、キーボード用のWindow(UIRemoteKeyboardWindow)を返しているのが原因ではないでしょうか。
下記のように修正したところ、問題は発生しなくなりました。
private extension UIApplication {
func topMostViewController() -> UIViewController? {
let uiWindow: UIWindow? = {
for window in windows.reversed() {
if NSStringFromClass(type(of: window)) == "UIWindow" {
return window
}
}
return windows.last
}()
guard let keyWindow = uiWindow else {
return nil
}
return keyWindow.rootViewController?.topMostViewController()
}
}
1.3.7にて、現象1〜3の全てが発生しない事を確認しました。
ご対応ありがとうございました。
3は、わかりにくい報告で申し訳ありません。正確には
テキストフィールドを含むアラート表示時に、テキストフィールドに自動的にフォーカスがあたらず、キーボードが自動的に表示されない
で、1.3.7にて発生しない事を確認しました。