Проблема с представлением viewcontroller в iOS 13, XCode 11 - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь представить viewcontroller на topMostViewController, он работает в iOS 12 и ниже. Но в iOS 13 я получаю сообщение об ошибке: «Добавление представления rootViewController вручную в иерархию представлений больше не поддерживается. Пожалуйста, позвольте UIWindow добавить представление rootViewController в саму иерархию представлений».

Я проверил на iOS12 и ниже, ниже код работает нормально. Но на iOS 13 у меня проблемы с представлением viewcontroller. Я напечатал на 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 ]

0 голосов
/ 03 ноября 2019

Я нашел это, чтобы исправить мою проблему (в старом коде Objective-C):

// old way broken in iOS 13
//appDelegate.window.rootViewController = vc;

// this works in iOS 13
[appDelegate.window setRootViewController:vc];
0 голосов
/ 21 октября 2019

Этот код будет работать для создания контроллера представления сверху. Вы можете настроить размер контроллера представления в этой строке: popOverVC.view.frame = lSs Я не уверен, что этот код именно то, что вы просите, но если вам нужно быстрое решение, он представит контроллеры представления в swift 5, iOS13 и xcode 11. Обратите внимание, что это дочерний контроллер представления, поэтому, если вы удалите родителя, он тоже уйдет. Просто замените self на ViewController, который вы хотите представить.

    let popOverVC = UIStoryboard(name: "yourSB", bundle: nil).instantiateViewController(withIdentifier: "vcYouWantID") as! vcYouWant
    self.addChild(popOverVC)
    let lSs = UIScreen.main.bounds
    popOverVC.view.frame = lSs
    popOverVC.view.tag = tag
    self.view.addSubview(popOverVC.view)
    popOverVC.didMove(toParent: self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...