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

时间:2016-05-16 11:56:13

标签: ios swift uiviewcontroller uistoryboardsegue appdelegate

所以我有一个从ViewController到SecondViewController的segue。此segue由ViewController中的UIButton触发,并以模态方式呈现SecondViewController。 Segue的标识符已设置(“SegueIdentifier”),我可以从我的ViewController中以编程方式调用segue。

当我尝试在AppDelegate中执行相同操作时,我收到编译器无法找到带有我设置的标识符的segue的错误。

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

同样,我从ViewController中的上述方法中复制并粘贴了performSegueWithIdentifier方法调用,其中我也为同一个segue调用performSegueWithIdentifier并且它可以工作。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

如果您不想显示初始视图,请执行以下操作:

description

并且还取决于你将segue设置为RootViewController。在你这样做之前,请检查一下。

答案 1 :(得分:1)

Segue连接有一些信息,如源控制器,目标控制器。因此,当您从ViewController类调用performSegue方法时,它将起作用,因为该类具有此Segue连接的信息。 当您从App Delegate调用相同的Segue方法时,它将无法正常工作。因为App Delegate类没有关于该Segue对象的信息或定义。

您还应该检查调用对象是否属于导航控制器。

答案 2 :(得分:1)

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

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

它是客观的c,仅供参考。如果它可以帮助你:))

更新:

快速地说,

 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
}

希望这会有所帮助:)

答案 3 :(得分:0)

故事板segue必须绑定到您试图偏离的特定viewController。因此,您必须在屏幕上拥有当前视图控制器的实例。您可以使用UIApplication.sharedApplication().keyWindow?.rootViewController

在窗口中访问rootViewController的方法,但是如果您在rootViewController上方显示了一个视图控制器,并且想要在显示的视图控制器上执行segue,则必须访问rootViewController.presentedViewController。由于您可能有多个presentViewControllers,您所做的就是:

//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)