1、在刚开始学习iOS的时候,我们实现界面的跳转还是比较简单的,直接通过
ViewController *root=[[ViewController alloc]init]; [[UIApplication sharedApplication].delegatewindow].rootViewController = root;
来随意的改变window的根视图控制器。
2、中间突出一些效果,还可以使用
[self presentViewController: animated: completion:];
进行模态弹出一个试图控制器,这个试图控制器上不能在进行模态弹出界面,也不能在其上创建试图控制器了。
3、到后来慢慢学习了导航控制器之后,做项目都开始使用push和pop进行界面的进出栈,这时一旦设定根视图控制器,就不能再去改变了。一般来说我们都会在开始创建一个BaseViewController或者BaseNavigationController来作为window的根视图控制,这样以后创建的试图控制器都继承此视图控制器来建立,我们实现界面跳转就是不停的进出栈(现在大多数都是使用导航控制器吧)。我之前也有一个iOS老大,他在项目刚进来时的ViewController上的view作为根视图,之后的所有view都是以此为基础,来不断的进行添加、移除操作,包括底部的tabbar都是使用view来写的,我很佩服他,但是我个人使用不习惯,通过枚举值随意的进行视图的切换。对于导航控制器,其实也可以那样的实现,它的几种常用方法如下:
- (instancetype)initWithNavigationBarClass:(nullable Class)navigationBarClass toolbarClass:(nullable Class)toolbarClass NS_AVAILABLE_IOS(5_0); - (instancetype)initWithRootViewController:(UIViewController *)rootViewController;// Convenience method pushes the root view controller without animation. - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;// Uses a horizontal slide transition. Has no effect if the view controller is already in the stack. - (nullableUIViewController *)popViewControllerAnimated:(BOOL)animated;// Returns the popped controller. - (nullableNSArray<__kindofUIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;// Pops view controllers until the one specified is on top. Returns the popped controllers. - (nullableNSArray<__kindofUIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;// Pops until there's only a single view controller left on the stack. Returns the popped controllers.
//(3)此方法常用,直接跳转到想要去的界面 // popToViewController: animated:出栈,直到指定的视图控制器栈在最上层;返回值为 被出栈的视图控制器 构成的数组 //找到导航控制器中的这个视图控制器 ;注意:不能新建一个,因为新建的不是导航控制器中本来的那个 ; //找到导航控制器中当前所有的视图控制器;.viewControllers NSArray *viewController=self.navigationController.viewControllers; //UIViewController *vc=[viewController objectAtIndex:1];写法或者如下,和C语言中数组下标一样 //从数组中找到 你想返回的视图控制器;索引:从0开始 UIViewController *vc=viewController[1]; [self.navigationController popToViewController:vc animated:YES];
//注意:不要在viewDidLoad中赋值 ;因为 使用导航 返回时 viewDidLoad 不会被调用;
-(void)viewWillAppear:(BOOL)animated { _qqTF.text = _receiveName ; _passWordTF.text = _receivePass ; }
当我们新建一个界面时,可以使用pushViewController:方法;当之前创建过我们需要的界面,且本界面又是从之前的界面上创建的,此时我们千万不要再去使用push方法使本界面再push之前的界面,这样你会发现创建的界面返回时就像一个循环一样,不知道谁push了谁。这时我们要用到的就是pop到指定界面(前提是本界面是从指定界面上push过来的)
for (UIViewController *controller in self.navigationController.viewControllers) { if ([controller isKindOfClass:[指定试图控制器VC class]]) { [self.navigationController popToViewController:controller animated:YES]; } }