我通过按下一个连接到我想要更改的视图控制器的自定义segue的按钮来更改根视图控制器。自定义segue如下所示:
- (void)perform{
UIViewController *source = (UIViewController *)self.sourceViewController;
source.view.window.rootViewController = self.destinationViewController;
}
但这只会立即更改根视图控制器。我希望控制器能够在旧控制器上消失。
答案 0 :(得分:21)
这样做的常见方法是:
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YourSBName" bundle:nil];
UIViewController *vc = [sb instantiateInitialViewController];// Or any VC with Id
DictateITAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = vc; // PLEASE READ NOTE ABOUT THIS LINE
[UIView transitionWithView:appDelegate.window
duration:INTERVAL_DURATION
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{ appDelegate.window.rootViewController = vc; }
completion:nil];
现在有几点说明:
appDelegate.window.rootViewController = vc; // PLEASE READ NOTE ABOUT THIS LINE
您实例化的新视图控制器将以默认方向显示,即肖像。因此,如果您在横向中执行此操作,则新视图控制器将显示为纵向,然后转为横向。这条线为我解决了这个问题。
答案 1 :(得分:3)
我认为已经有很多答案,但这样的事情应该有效:
[UIView transitionWithView:self.sourceViewController.view.window
duration:0.5
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^{
self.sourceViewController.view.window.rootViewController = self.destinationViewController;
} completion:^(BOOL finished) {
// Code to run after animation
}];
答案 2 :(得分:2)
我需要将其转换为我当前项目的Swift 3.0。这是一种方法:
//Get the storyboard that contains the VC you want
let storyboard = UIStoryboard(name: "Main", bundle: nil)
//Get the VC you want to push onto the stack
//You can use storyboard.instantiateViewController(withIdentifier: "yourStoryboardId")
guard let vc = storyboard.instantiateInitialViewController() else { return }
//Get the current app delegate
guard let appDel = UIApplication.shared.delegate as? AppDelegate else { return }
//Set the current root controller and add the animation with a
//UIView transition
appDel.window?.rootViewController = vc
UIView.transition(with: appDel.window!,
duration: 0.25,
options: .transitionCrossDissolve,
animations: { appDel.window?.rootViewController = vc } ,
completion: nil)
答案 3 :(得分:-3)
最简单的方法是:
[sourceViewController presentViewController:destinationViewController animated:YES completion:nil];