mshrwtnb / ALRT

An easier constructor for UIAlertController. Present an alert from anywhere.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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()
    }
}

@yuhnag
報告ありがとうございます。
1, 2 の再現を確認し、修正しました。1.3.7で修正が含まれています。
a48cea9

アップデート後、解決されるか確認いただけますか?

1.3.7にて、現象1〜3の全てが発生しない事を確認しました。
ご対応ありがとうございました。

3は、わかりにくい報告で申し訳ありません。正確には

テキストフィールドを含むアラート表示時に、テキストフィールドに自動的にフォーカスがあたらず、キーボードが自動的に表示されない

で、1.3.7にて発生しない事を確認しました。