簡體   English   中英

從App Delegate swift執行Segue

[英]Perform Segue from App Delegate swift

我需要從app delegate啟動一個視圖控制器。

在您在視圖控制器之間執行segue的方式。

我有一個if語句,如果true需要顯示一個視圖控制器,這是在app委托中。

我如何從應用代表執行此操作?

c_rath的答案大多是正確的,但您不需要將視圖控制器設置為根視圖控制器。 實際上,您甚至可以從App Delegate觸發導航堆棧頂視圖和任何其他視圖控制器之間的segue。 例如,要推送故事板視圖控制器,您可以執行以下操作:

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)

如果你想使用segue identifier ,你可以在Swift 2.2使用。

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

對於Swift 3.1:

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

如果你想在App Delegate Swift 3.0中使用segue

  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 ,則不會執行segue

這里是如果你會做什么rootViewController 沒有繼承UINavigationViewController

基本上你檢查當前顯示的選項卡是什么,然后從THAT視圖控制器推送,而不是從UITabBarController繼承的rootViewController

        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;
        }

我的應用程序的初始/ RootViewController的,從繼承UITabBarController ,每個是UITabBar關系控制器繼承UINavigationController ,讓我pushViewController從他們。

你並不需要實例化新的視圖控制器,只是從執行賽格瑞presentedViewController像這樣(迅速3.0+)

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

如果您的應用程序基於UITabBarController ,您必須:

  • 獲取UITabBarController
  • UITabBarController viewControllers集合中選擇適當的控制器
  • 更改UITabBarController索引
  • 最后你可以執行segue

當然,您必須知道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)

您實際上無法從AppDelegate執行segue,因為segue是從一個場景到另一個場景的過渡。 但是,您可以做的一件事是實例化一個新的視圖控制器並從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
}

如果你想從AppDelegate執行segue。 在故事板中的ViewControllers之間實現segue。 給你的segue提供標識符。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM