zoukankan      html  css  js  c++  java
  • 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的方式切换问题。

     

  • 相关阅读:
    native和webview切换
    appium API接口
    appium自动化测试之UIautomatorviewer元素定位
    appium的兼容问题
    adb常用命令
    java include包含指令例子
    设备与设备之间 的数据传输
    sitecore(keyvaluelanguage)的灵活应用
    java eclipse 连接数据库全过程
    java1200例-文字的探照灯效果
  • 原文地址:https://www.cnblogs.com/shineDongEr/p/5577068.html
Copyright © 2011-2022 走看看