1. ホーム
  2. スイフト

[解決済み】UIViewControllerの最上位機種を取得する。

2022-04-17 21:53:30

質問

一番上の UIViewController にアクセスしないと UINavigationController . 今のところ、こんな感じです。

UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(vc, animated: true, completion: nil)

しかし、これでは何もできないようです。その keyWindowrootViewController もnilでない値のようなので、オプションの連鎖は問題ないでしょう。

注意 このようなことをするのは良くないことです。MVCパターンを壊してしまいます。

解決方法は?

presentViewController はビューコントローラを表示します。これはビューコントローラを返すものではありません。もし UINavigationController を探しているのでしょう。 presentedViewController で、ルートから始めて、提示されたビューを繰り返し見ていく必要があります。

if var topController = UIApplication.sharedApplication().keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

    // topController should now be your topmost view controller
}

Swift 3 以上用。

if var topController = UIApplication.shared.keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

    // topController should now be your topmost view controller
}

iOS 13+の場合

let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first

if var topController = keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

// topController should now be your topmost view controller
}