web-dev-qa-db-ja.com

iOS 13、Xcode 11でのビューコントローラーの表示に関する問題

TopMostViewControllerにビューコントローラを表示しようとしています。 iOS 12以下で動作します。しかし、iOS 13では次のエラーが発生します。

RootViewControllerのビューをビュー階層に手動で追加することはサポートされなくなりました。 UIWindowがrootViewControllerのビューをビュー階層自体に追加することを許可してください。

私はiOS 12以下で確認しましたが、以下のコードは正常に動作します。しかし、iOS 13では、ビューコントローラーの表示に問題があります。 viewDidLoadに印刷しました。印刷されますが、ビューは表示されません。

func presentInWindow(animated flag: Bool = true, completion: (() -> Void)? = nil) {

        DispatchQueue.main.async {
            var alertWindow: UIWindow?
            alertWindow = UIWindow(frame: UIScreen.main.bounds)
            alertWindow?.windowLevel = UIWindow.Level.alert + 1
            alertWindow?.rootViewController = UIApplication.topViewController()
            if let rootViewController = alertWindow?.rootViewController {
                alertWindow?.makeKeyAndVisible()
                rootViewController.present(self, animated: flag, completion: completion)
            }
        }

}
static func topViewController() -> UIViewController? {

        var topViewController: UIViewController?

        if #available(iOS 13.0, *) {

            topViewController = shared.connectedScenes
                .filter({$0.activationState == .foregroundActive})
                .map({$0 as? UIWindowScene})
                .compactMap({$0})
                .first?.windows
                .filter({$0.isKeyWindow}).first?.rootViewController
        } else {
            topViewController = shared.delegate?.window??.rootViewController
        }

        while true {
            if let presented = topViewController?.presentedViewController {
                topViewController = presented
            } else if let nav = topViewController as? UINavigationController {
                topViewController = nav.visibleViewController
            } else {
                break
            }
        }

        return topViewController
}
2
Karthik

以前は正常に動作していたアプリを更新しているときに同じエラーを受け取りました。 AppDelegate.Swiftの新しい要件は次のとおりです。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    return true
  }

  // MARK: UISceneSession Lifecycle
  func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
  }
  func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { }
}

hth

0
AB Murphy