iOS之push和modal大不同

    对于刚入行的小白,之前对于push和modal的理解简单地停留在push的时候用导航控制器,modal的时候既可以用导航控制器也可以用控制器本身的区别,比如各位大侠代码中常见的[self.navigationer  push...]和[self present....]以及

[self.navigationer  present...](原谅没在Xcode里面写的伪代码,相信聪明如你应该so easy!~~)

     废话不多说,简单区分push也就是拿到本控制器的导航控制器通过push的方式“推”到下一个控制器,显示出来的下一个控制器上的导航条其实还是之前的导航条,如果是present....(modal)方式,则是出现了新的导航条...这些基本的,简单到你们可以吐槽的点往往运用起来可以解决大的问题,比如一个界面在不同的接口,需求需要你一个用push的方式进来,然后点击左上角是push回去,而同样的界面在另一个界面接口,则需要你用modal的方式从上往下modal回去,此时我们很多人应该感觉很懵逼,这个时候,充分利用push和modal的导航栏子控件的不同点就能很完美地解决这个问题,我们只需要在自己的界面控制器.m文件里面设置导航栏左侧图标的selector方法里这样写:

1.设置导航栏返回按钮:

    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"btn_return_gray"] style:UIBarButtonItemStylePlain target:self action:@selector(toBack)];

2.在selector方法里:

- (void)toBack

{

    //    判断是被push还是被modal出来的;

    NSArray *viewcontrollers=self.navigationController.viewControllers;

    if (viewcontrollers.count>1) {

        if ([viewcontrollers objectAtIndex:viewcontrollers.count-1]==self) {

            //push方式

            [self.navigationController popViewControllerAnimated:YES];

        }

    }

    else{

        //present方式

        [self.navigationController dismissViewControllerAnimated:YES completion:nil];

    }

}

这样的话,同一个界面就能完美地对接不同界面接口的不同转换模式,运用的原理也就是基于push和modal最大的区别,push方式是把栈底控制器,也就是根控制器先移除,把最新push出来的栈顶控制器保留,modal则是通过覆盖的方式,所以可以根据navigationViewController的子控制器的栈底控制器是不是本身来判断转换方式是modal还是push,这样就有效地解决了上面的问题。

  PS:此处需求对应于模块开发,但若是单人开发,建议封装父类,把此方法写进父类,则采用继承后能有效解决项目开发中所有push,modal的方式切换问题。

 

原文地址:https://www.cnblogs.com/shineDongEr/p/5577068.html