首页 > 其他分享 >IOS开发-OC UINavigationController使用

IOS开发-OC UINavigationController使用

时间:2023-07-17 11:12:07浏览次数:42  
标签:marr OC self IOS window UINavigationController navigationController 页面

1.什么是UINavigationController

UINavigationController是iOS中的一个重要的导航控制器类,它可以用来管理页面之间的导航跳转。

UINavigationController的主要特征包括:

- 管理导航栈(navigation stack),实现页面的推入和弹出。
- 包含一个navigation bar,显示导航项和标题。
- 可以通过push和pop方法来进行页面跳转。
- 新页面是被push到栈顶,返回则通过pop返回。
- 支持自定义navigation bar的样式。
- 支持手势返回功能。

2.使用UINavigationController的基本流程:

1. 创建UINavigationController,初始化时指定根视图控制器。

2. 将UINavigationController设置为window的rootViewController。

3. 通过pushViewController方法进行页面跳转。

4. 通过popViewController方法返回上一页。

5. 通过设置navigationBar的属性来自定义样式。

6. 子页面通过navigationItem属性设置导航栏内容。

UINavigationController是iOS中最常用的页面导航方案,可以方便地实现页面进出栈的管理,是开发iOS App必学的一个重要类。掌握使用UINavigationController可以轻松实现iOS App的多页面导航功能。

3.具体实现:

1.创建UINavigationController,初始化时指定根视图控制器。

这一步一般是在AppDelegate文件的application钩子中完成

  //创建ui navigation控制器
     //UINavigationController和tabbercontroller一样本身没有视图和逻辑,所以需要设置一个根视图,这里将opeview页面设置为根视图
    UINavigationController *navigationController=[[UINavigationController alloc]initWithRootViewController:networklisten];
    [navigationController pushViewController:openview animated:YES];

2. 将UINavigationController设置为window的rootViewController。

这一步同样在AppDelegate文件的application钩子中完成,先定义window对象

在AppDelegate的头文件中定义

@property (strong,nonatomic)UIWindow *window;

然后将window的rootViewController设置为UINavigationController,并执行window的makeKyeAndVisible方法

 self.window.rootViewController = navigationController;//将根视图控制室设置为UINavigationController
    [self.window makeKeyAndVisible];

 

 3. 通过pushViewController方法进行页面跳转。

  [self.navigationController pushViewController:nonetview animated:YES];

这里有一个很重要的细节:

如果要从A页面跳到B页面首先要确保A页面已经在UINavigationController里面,否则通过self.navigationController获取的就不是UINavigationController的实例而是nil,其次是确保B页面不在UINavigationController里面。

4. 通过popViewController方法返回上一页。

-(void)back{
    [self.navigationController popViewControllerAnimated:YES];
}

5. 通过设置navigationBar的属性来自定义样式。6. 子页面通过navigationItem属性设置导航栏内容。

这个的实现方法有很多,我一般是在viewWillAppear钩子里直接隐藏掉系统的navigationBar,然后自定义一个。

-(void) viewWillAppear:(BOOL)animated{
    self.navigationController.navigationBarHidden = YES;
    [self initbar];
}

  

-(void)initbar{
   _barview = [[UIView alloc] initWithFrame:CGRectMake(0.0,0.0,self.view.frame.size.width,100)];
    _barview.backgroundColor = [UIColor colorWithRed:240/255.0 green:239/255.0 blue:244/255.0 alpha:1.0];
    [self.view addSubview:_barview];
    _goback = [[UIButton alloc] initWithFrame:CGRectMake(20, 65, 15, 20)];
    [_goback setImage:[UIImage imageNamed:@"left"] forState:UIControlStateNormal];
    [self.view addSubview:_goback];
    _goback.userInteractionEnabled=YES;
    UITapGestureRecognizer *backGesture =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(back)];//创建手势
    [_goback addGestureRecognizer:backGesture];
   _tit =[[UILabel alloc] initWithFrame:CGRectMake((self.view.frame.size.width-80)/2, 63, 80, 19)];
    _tit.text=@"添加家庭";
    _tit.font=[UIFont boldSystemFontOfSize:17];
    _tit.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:_tit];
}

 

这里再教大家如何从一个页面直接返回一个指定的页面并传递参数

如:我现在要返回tabbar中的location页面并携带参数wearid

1.定义一个可变数组marr来存放当前所有的页面栈,通过self.navigationController.viewControllers来获取

2.遍历marr数组,通过isKindOfClass方法来判断是否是自己要跳过去的页面栈

3.如果找到了用对应的页面类型来接收一下marr[i],这里我要跳转的定位页面在tabbar的第一个bar所以我先用setSelectedIndex方法来设置它选择的tabbar为第一个,然后再用UITabBarController类型来接受它,这样才能通过selectedViewController属性来获取到激活的页面也就是location页面,再用location页面接收获取到的激活的页面,再写入要传递参数;最后

调用popToViewController方法跳转过去即可。

setSelectedIndex
  NSMutableArray *marr = [[NSMutableArray alloc]initWithArray:self.navigationController.viewControllers];for(int i=0;i<marr.count;i++){
           if([marr[i] isKindOfClass:[UITabBarController class]]){
               [marr[i] setSelectedIndex:0];
               UITabBarController *bar =marr[i];
               location * loc =bar.selectedViewController;
               [loc setWearid:_listdata[indexPath.row][@"wearerId"]];
               self.navigationController.navigationBarHidden = YES;
               [self.navigationController popToViewController:marr[i] animated:YES];
               return;
           }
       }
  

 

再教大家如何从页面栈中移除指定的页面 

1.获取所有页面栈

2.遍历可变数组,移除要移除的页面栈

3.将self.navigationController.viewControllers设置为完成移除操作之后的可变数组marr

NSMutableArray *marr = [[NSMutableArray alloc]initWithArray:self.navigationController.viewControllers];
for (UIViewController *vc in marr) {
    if ([vc isKindOfClass:[XXX class]]) {
        [marr removeObject:vc];
        break;
    }
}
 self.navigationController.viewControllers = marr;

//也可以直接根据下标移除
 [marr removeObjectAtIndex:1];

如何返回根视图(第一个页面)

[self.navigationController popToRootViewControllerAnimated:true];

 

标签:marr,OC,self,IOS,window,UINavigationController,navigationController,页面
From: https://www.cnblogs.com/SadicZhou/p/17559344.html

相关文章

  • Java 实现 WebSocket 集群转发:使用 Redis 发布订阅
    场景浏览器客户端client1连接到了服务端A的websocket节点。浏览器客户端通过弹性负载均衡,把请求分配到了服务端B,服务端B上没有client1的连接。需求服务端B把消息转发到服务端A上,找到客户端client1的连接,发送出去。画示意图......
  • 1-ElasticSearch - Docker安装
    1、下载镜像文件dockerpullelasticsearch:7.4.2dockerpullkibana:7.4.22、创建实例创建文件夹和配置文件mkdir-p/mydata/elasticsearch/configmkdir-p/mydata/elasticsearch/dataecho"http.host:0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml创......
  • 【NestJS系列】DI依赖注入与IOC控制反转
    前言上篇文章我们学习了如何使用nest-cli来快速生成一个NestJS后端项目,当我们打开编辑器查看代码时,会发现整个代码风格有点类似JAVA的spring框架,并且你会发现一些service类在controller控制器的constructor中注入后,可以不需要手动new就可以直接使用该类对应的实例方法。比如:imp......
  • IOS开发-实现图片缓存优化性能
    在Objective-C中,可以这么实现图片的本地缓存:1.创建一个用于存储图片的缓存文件夹;2.根据图片URL构建缓存文件名;3.检查缓存路径是否存在,如果存在直接读取缓存图片;4.不存在则从网络下载图片;5.保存图片到缓存,以名称cacheFilename;6.以后再加载同一个URL的图片,就直接从......
  • net core-socket编程
    基本概念:TCP和UDP的区别具体区别如下:1)TCP是面向连接的传输。UDP是无连接的传输2)TCP有流量控制、拥塞控制,检验数据数据按序到达,而UDP则相反。3)TCP的路由选择只发生在建立连接的时候,而UDP的每个报文都要进行路由选择4)TCP是可靠性传输,他的可靠性是由超时重发机制实......
  • dockerhub网页无法访问解决
    docker官网最近无法访问,如果只是拉取镜像,其实问题不大,可以通过设置中科大,阿里等镜像仓库解决;但是如果想要查询tag,即docker镜像版本类型等信息,docker本身的命令并不支持,只能从web网页查看,找到一个网站,大部分热门的可查,据说有一些镜像可能版本较老,凑合使用吧:Docker......
  • subprocess Python执行系统命令最优选模块
    简介subprocess是Python中执行操作系统级别的命令的模块,所谓系级级别的命令就是如ls/etc/userifconfig等和操作系统有关的命令。subprocess创建子进程来执行相关命令,并连接它们的输入、输出和错误管道,获取它们的返回状态。subprocess来源Subprocess模块开发之前,标准......
  • Docker 学习之路之 Dockerfile
    Docker镜像原理Docker镜像是由特殊的文件系统叠加而成的,其本质是一个分层的文件系统镜像制作由容器转为镜像dockercommit容器ID镜像名称:版本号#将镜像保存成压缩文件dockersave-o压缩文件名称镜像名称:版本号#将压缩的镜像加载成镜像dockerload-i压缩......
  • 微软宣布Win10准备热烈的迎接Docker
    在DockerCon2017大会上,Docker团队今天宣布了LinuxKit,这是一个安全、干净和便携式的Linux子系统container容器环境。LinuxKit允许工具构建自定义的Linux子系统,可以仅包含完全运行时平台的组件需要。所有的系统服务都是可替换的容器,可以删除不需要的一切。 因为LinuxKit......
  • 微软宣布Win10准备热烈的迎接Docker
    在DockerCon2017大会上,Docker团队今天宣布了LinuxKit,这是一个安全、干净和便携式的Linux子系统container容器环境。LinuxKit允许工具构建自定义的Linux子系统,可以仅包含完全运行时平台的组件需要。所有的系统服务都是可替换的容器,可以删除不需要的一切。 因为LinuxKit......