web-dev-qa-db-ja.com

アプリデリゲートからセグエを実行swift

アプリのデリゲートからビューコントローラーを起動する必要があります。

ビューコントローラー間でセグエを実行する方法で。

Trueがビューコントローラーを表示する必要がある場合、これはアプリデリゲートにあるというifステートメントがあります。

アプリのデリゲートからこれを行うにはどうすればよいですか?

17
user3405152

c_rathの答えはほぼ正しいですが、ビューコントローラをルートビューコントローラにする必要はありません。実際には、アプリデリゲートからでも、ナビゲーションスタックのトップビューと他のビューコントローラーの間でセグエをトリガーできます。たとえば、ストーリーボードビューコントローラーをプッシュするには、次のようにします。

Swift 3.0以降

// Access the storyboard and fetch an instance of the view controller
let storyboard = UIStoryboard(name: "Main", bundle: nil);
let viewController: MainViewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! MainViewController;

// Then Push that view controller onto the navigation stack
let rootViewController = self.window!.rootViewController as! UINavigationController;
rootViewController.pushViewController(viewController, animated: true);

Swift 2.0以前

// Access the storyboard and fetch an instance of the view controller
var storyboard = UIStoryboard(name: "Main", bundle: nil)
var viewController: MainViewController = storyboard.instantiateViewControllerWithIdentifier("ViewController") as MainViewController

// Then Push that view controller onto the navigation stack
var rootViewController = self.window!.rootViewController as UINavigationController
rootViewController.pushViewController(viewController, animated: true)
38
Lyndsey Scott

segueidentifierを使用する場合は、Swift2.2

self.window?.rootViewController!.performSegueWithIdentifier("YOUR SEGUE IDENTIFIER", sender: nil)

Swift 3.1の場合:

self.window?.rootViewController!.performSegue(withIdentifier: "YOUR SEGUE IDENTIFIER", sender: nil)
10
sadasd

アプリデリゲートでセグエしたい場合Swift 3.

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        if UserDefaults.standard.bool(forKey: PARAM.STATUS) {
            DispatchQueue.main.async {
                self.window?.rootViewController?.performSegue(withIdentifier: PARAM.SEGUETOHOME, sender: nil)
            }

        }
        // Override point for customization after application launch.
        return true
    }

DispatchQueue.main.asyncを使用しない場合、セグエが実行されないことに注意してください

3
Harshil Kotecha

新しいViewControllerをインスタンス化する必要はありません。このようにpresentedViewControllerからセグエを実行するだけです(Swift 3.0以降)。

guard let mainController = self.window?.rootViewController?.presentedViewController as? MainViewController else { return }
mainController.performSegue(withIdentifier: "SEGUE_ID", sender: nil)

アプリケーションがUITabBarControllerに基づいている場合、次のことを行う必要があります。

  • uITabBarControllerをフェッチする
  • viewControllersからのUITabBarControllerコレクションから適切なコントローラーを選択します
  • UITabBarControllerのインデックスを変更
  • 最後に、セグエを行うことができます

もちろん、UITabBarControllerにあるビューコントローラのインデックスを知っている必要があります。

コード例:

guard let tabBarController = self.window?.rootViewController?.presentedViewController as? UITabBarController else { return }
guard let tabBarViewControllers = tabBarController.viewControllers else { return }
guard let mainViewController = tabBarViewControllers[0] as? MainViewController else { return }
tabBarController.selectedIndex = 0
mainViewController(withIdentifier: "SEGUE_ID", sender: nil)
1
mkul

rootViewController[〜#〜] not [〜#〜]UINavigationViewControllerから継承した場合、次のようになります。

基本的に、現在表示されているタブが何であるかを確認し、rootViewControllerから継承するUITabBarControllerではなく、[〜#〜] that [〜#〜]ビューコントローラからプッシュします。 ] _。

        let root = self.window?.rootViewController as UITabBarController

        switch(root.selectedIndex){
        case 0:
            root.viewControllers?[0].pushViewController(viewController, animated: true)
            break;
        case 1:
            root.viewControllers?[1].pushViewController(viewController, animated: true)
            break
        default:
            println("Error presenting ViewController")
            break;
        }

私のアプリケーションにはUITabBarControllerから継承するinitial/rootViewControllerがあり、それぞれのUITabBar関係コントローラーはUINavigationControllerから継承しているため、それらからpushViewControllerを取得できます。

1
Sakiboy

セグエはあるシーンから別のシーンへの移行なので、実際にはAppDelegateからセグエを実行することはできません。ただし、できることの1つは、新しいView Controllerをインスタンス化してAppDelegateから提示することです。次のようなものが動作するはずです...

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    var storyboard = UIStoryboard(name: "Main", bundle: nil)
    var viewController: MasterViewController = storyboard.instantiateViewControllerWithIdentifier("viewController") as MasterViewController

    window?.rootViewController = viewController
    window?.makeKeyAndVisible()

    return true
}
0
c_rath

appDelegateからセグエを実行する場合。ストーリーボードのViewController間のセグエを実装します。セグエに識別子を与えます。

self.window?.rootViewController!.performSegue(withIdentifier: "your_identifier", sender: nil)
0
Prashant Sharma