无法通过 AppDelegate 的标识符调用 Segue

Can't Call Segue By Identifier from AppDelegate

所以我有一个从 ViewController 到 SecondViewController 的转折点。此 segue 由 ViewController 中的 UIButton 触发,模态呈现 SecondViewController。 Segue 的标识符已设置 ("SegueIdentifier"),我可以从我的 ViewController.

中以编程方式调用 segue

当我尝试在我的 AppDelegate 中做同样的事情时,我收到编译器无法找到带有我设置的标识符的 segue 的错误。

let viewController = ViewController()            
viewController.performSegueWithIdentifier("SegueIdentifier", sender: nil)

同样,我从字面上复制并粘贴了 ViewController 中上述方法的 performSegueWithIdentifier 方法调用,其中我还为相同的 segue 调用了 performSegueWithIdentifier 并且它有效。

有什么想法吗?

如果您不想显示您的初始视图,请这样做:

UIApplication.sharedApplication().keyWindow?.rootViewController.performSegueWithIdentifier("SegueIdentifier", sender: nil)

而且这还取决于您将 segue 设置为您的 RootViewController。在执行此操作之前,也请检查一下。

Segue 连接有一些信息,比如 Source Controller、Destination Controller。因此,当您从 ViewController class 调用 performSegue 方法时,它会起作用,因为 class 具有此 Segue 连接的信息。 当您从 App Delegate 调用相同的 Segue 方法时,它不会工作。因为 App Delegate class 没有关于该 Segue 对象的信息或定义。

您还应该检查调用对象是否在 Navigation Controller 下。

故事板转场必须与您尝试转场的特定 viewController 相关联。所以你必须在屏幕上有一个当前视图控制器的实例。您可以使用 UIApplication.sharedApplication().keyWindow?.rootViewController

在 window 中获取对 rootViewController 的访问权限的方法,但是如果您在 rootViewController 上方显示了一个视图控制器并且您想要在显示的视图控制器上执行 segue,您必须访问 rootViewController.presentedViewController.由于您可能有多个 presentedViewController,因此您要做的是:

//get the root view controller
var currentViewController = UIApplication.sharedApplication().keyWindow?.rootViewController
//loop over the presented view controllers and until you get the top view controller
while currentViewController.presentedViewController != nil{
   currentViewController = currentViewController.presentedViewController
}
//And finally
currentViewController.performSegueWithIdentifier("identifier", sender: nil)

在我的一个项目中,我正在处理这种情况,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

NSString *identifier;
BOOL isSaved = [[NSUserDefaults standardUserDefaults] boolForKey:@"loginSaved"];
if (isSaved)
{
    identifier=@"home1";



}
else
{
    identifier=@"dis1";
}
UIStoryboard *    storyboardobj=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *screen = [storyboardobj instantiateViewControllerWithIdentifier:identifier];



[self.window setRootViewController:screen];


return YES;
}

在objective c中,仅供参考。如果对你有帮助的话:)

更新:

在 swift 中,

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {



    var identifier: String = String()

    let isSaved = NSUserDefaults.standardUserDefaults().boolForKey("loginsaved")


    if isSaved

    {
        identifier = "home1"
    }
    else{

        identifier = "dis1"
    }

    let storyboardobj: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let screen: UIViewController = storyboardobj.instantiateViewControllerWithIdentifier(identifier)
    self.window!.rootViewController = screen

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

希望这会有所帮助:)