Swift iOS 16 我无法再从键盘呈现 UIViewController,而不关闭它

Mer*_*yth 5 keyboard uiviewcontroller ios swift ios16

在 iOS 16 之前,我可以通过使用以下代码在键盘上呈现 UIViewController 而无需关闭它:

if let window = UIApplication.shared.windows.last, 
    String(describing: type(of: window)).equals("UIRemoteKeyboardWindow") {

    let presentingVC = window.rootViewController

    presentingVC.present(self.myViewController, animated: animated)
}
Run Code Online (Sandbox Code Playgroud)

我尝试在模拟器中运行此代码,在 iPhone 13 上模拟 iOS 16。

不幸的是,在打开键盘的情况下运行此代码(像以前一样),“UIRemoteKeyboardWindow”不再出现在窗口中。

我只找到了“UITextEffectsWindow”,但从那里呈现“myViewController”,它显示在键盘下。

有没有人遇到过这个问题并且知道如何通过键盘启动 UIViewController 而不关闭它?

我需要这段代码主要是因为我有自定义选择器,允许用户输入更新 UI 的值,而无需关闭键盘。

更新:

我在使用 iOS 16 的 iPhone 13 模拟器上从当前稳定的 Xcode 版本 (13.4.1) 构建并运行了该应用程序,现在我可以找到 UIRemoteKeyboardWindow。我曾经从 Xcode 版本 14 beta 启动该应用程序。由于 Xcode beta 版本,找不到 UIRemoteKeyboardWindow 会出现错误吗?

mal*_*lex 1

在iOS16中UIRemoteKeyboardWindow是看不到windows数组的UIApplication

可以访问UIInputWindowController任何parent.inputViewController

然后,您可以呈现任何视图控制器,而UIInputWindowController无需隐藏键盘。

如果您使用自定义输入视图控制器(而不是键盘),您应该观察UIResponder.keyboardWillChangeFrameNotification得到

inputViewController.parent
Run Code Online (Sandbox Code Playgroud)

如果您仅使用键盘输入,则应该创建一个假输入视图控制器,使您的视图控制器成为启动时的第一响应者,捕获UIResponder.keyboardWillChangeFrameNotification以存储UIInputWindowController对象,然后退出第一响应者以立即隐藏假输入视图。

代码示例

class SomeViewController: UIViewController {

    private var currentInputViewController: UIInputViewController?
    private var keyboardWindowController: UIViewController?

    override var inputViewController: UIInputViewController?
       isFirstResponder ? currentInputViewController : nil
    }

    init() {
        super.init()

        // some code

        NotificationCenter.default.addObserver(self, selector: #selector(storeKeyboardWindowController), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    }

    @objc private func storeKeyboardWindowController() {
        if let vc = currentInputViewController?.parent {
            keyboardWindowController = vc
        }
    }

    @objc func inputViewButtonClicked() {
        let vc = AnotherViewControoler()
        keyboardWindowController?.present(vc, animated: true)
    }
}
Run Code Online (Sandbox Code Playgroud)