所以我有一个从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并且它可以工作。
有什么想法吗?
答案 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)