界面跳转

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


你可能感兴趣的:(push,pop,界面跳转,根视图,模态弹出)