Objective-C 混用UITabBar与UINavigation

news2024/12/31 5:30:32

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、pandas是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

混用UITabBar与UINavigation做app,tab和nav,有时候显示有时候需要隐藏,记录目前使用的解决方案。


一、效果

1、主页使用UITabBar管理,有三个tab分页

2、在tab分页的根视图时显示tab,隐藏nav。

3、二级页面全部用UINavigationController管理。

4、使用pushViewController打开页面时,隐藏tab,显示nav;

5、导航栏的文字显示黑色

6、导航栏的返回按钮不显示中文

 

二、实现

1.AppDelegate.m

代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    self.window.rootViewController = [[MainTabBarController alloc] init];
    
    // 设置导航栏的文字为黑色
    // 满足5【导航栏的文字显示黑色】
    [[UINavigationBar appearance] setTintColor: [UIColor blackColor]];

    return YES;
}

// 其他代码.....

在AppDelegate.m中,设置rootViewController为【MainTabBarController】

2.MainTabBarController.m

代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self createBottomMenuIconButton];
    // 其他代码....
}

-(void)createBottomMenuIconButton{
    NSMutableArray *bottomViewCtrls  = [NSMutableArray arrayWithCapacity:0];

    NSArray* bottomMenus = [self getLocalBottomMenu];
    for (NSDictionary *bottomMenu in bottomMenus) {
        NSString *name =  [bottomMenu objectForKey: @"name"];
        NSString *normal =  [bottomMenu objectForKey: @"normal"];
        NSString *highlighted =  [bottomMenu objectForKey: @"highlighted"];

        //结合 xx.class 对象,动态创建UIViewController
        UIViewController *vc = [[[bottomMenu objectForKey: @"vcclass"] alloc] init];
        // 满足3【二级页面全部用UINavigationController管理】
        UINavigationController *nav = [self createBottomMenu:vc menuName:name normal: normal highlighted: highlighted];
        [self.bottomViewCtrls addObject:nav];
    }
    
    //有底部导航菜单
    // 满足1【使用UITabBar管理,有三个tab分页】
    if(bottomViewCtrls.count > 0){
        self.viewControllers= bottomViewCtrls;
    }
}

- (UINavigationController*) createBottomMenu: (UIViewController*) vc
                                    menuName: (NSString*) menuName
                                      normal: (NSString*) normal
                                 highlighted: (NSString*) highlighted{
    vc.tabBarItem.title = menuName;

    UIImage* imageNormal = [UIImage imageNamed: normal];
    vc.tabBarItem.image = imageNormal;
    UIImage* imagePressed = [UIImage imageNamed: highlighted];
    vc.tabBarItem.selectedImage = [imagePressed imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    //将分页设置成UINavigationController的根视图。
    //这样包装之后,才能正常使用pushViewController打开页面
    UINavigationController* nav = [[UINavigationController alloc]initWithRootViewController:vc];
    return nav;
}

-(NSArray *)getLocalBottomMenu{
    NSArray *bottomMenus = @[
        @{@"id":@"home",@"name":@"首页",@"normal":@"tab_home",@"highlighted":@"tab_home_active",@"vcclass":TabItemHome.class},
        @{@"id":@"message",@"name":@"消息",@"normal":@"tab_message",@"highlighted":@"tab_message_active",@"vcclass":TabItemMessage.class},
        @{@"id":@"profile",@"name":@"我的",@"normal":@"tab_profile",@"highlighted":@"tab_profile_active",@"vcclass":TabItemProfile.class}
    ];
    return bottomMenus;
}

(1)通过【self.viewControllers= bottomViewCtrls】设置tab的分页。

(2)如果创建tab分页的时候,不用UINavigationController包装一下,在页面中使用pushViewController,就会报错,提示当前视图不支持UINavigationController。

(3)结合xx.class和[[[bottomMenu objectForKey: @"vcclass"] alloc] init],动态创建UIViewController。

(4)tab分页需要增删改时,修改【getLocalBottomMenu】的代码,即可。

2.tab分页的基类BaseTabViewController

代码如下:

//BaseTabViewController.h
-(void) setTitle:(nonnull NSString*) title;
-(void)openPage:(UIViewController*)page;



//BaseTabViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];
    // 满足6【导航栏的返回按钮不显示中文】
    [self setNavSetting];
    // 其他代码...
}

// 满足2【在tab分页的根视图时显示tab,隐藏nav】
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // 隐藏导航
    [self.navigationController setNavigationBarHidden:YES animated:animated];
    // 其他代码...
}

// 满足4【使用pushViewController打开页面时,隐藏tab,显示nav】
- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    // 显示导航
    [self.navigationController setNavigationBarHidden:NO animated:animated];
    // 其他代码...
}

-(void) setTitle:(nonnull NSString*) title{
    self.navigationItem.title = title;
}
-(void)setNavSetting {
    // 设置导航栏的返回按钮没有中文,对下一个打开的页面起效
    UIBarButtonItem* backBtn = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    self.navigationItem.backBarButtonItem = backBtn;
    
}

-(void)openPage:(UIViewController*)page {
    // 隐藏下面的tab
    page.hidesBottomBarWhenPushed = YES;

    //通过nav打开页面
    [self.navigationController pushViewController:page animated:YES];
    
}

(1)通过【page.hidesBottomBarWhenPushed = YES】隐藏tabbar;

(2)导航栏的返回按钮,总是要父页设置的。所以,在当前页,需要设置返回按钮,去掉它自带的文字;

(3)【viewWillAppear】当页面要展示的时候,隐藏导航;【viewWillDisappear】当页面要隐藏时,显示导航。

3.HomeTab.m

代码如下:

//HomeTab.h
@interface HomeTab : BaseTabViewController
// 其他代码.....


//HomeTab.m

// 在要打开页面的方法中,调用openPage打开PageA页面
[self openPage: [[PageA alloc] init]];

在h文件中,将HomeTab类设置成继承BaseTabViewController,所以在要打开页面的方法中,可以直接调用openPage打开PageA页面。

以上,就是tab相关的设置

4.二级页面的基类BasePageViewController

代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    // 满足6【导航栏的返回按钮不显示中文】
    [self setNavSetting];
    // 其他代码...
}

-(void)setNavSetting {
    // 设置导航栏的返回按钮没有中文,对下一个打开的页面起效
    UIBarButtonItem* backBtn = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    self.navigationItem.backBarButtonItem = backBtn;
    
}

-(void) setTitle:(nonnull NSString*) title {
    self.navigationItem.title = title;
}

将复用的内容,做到基类中。

5.二级页面pageA

代码如下:

//PageA.h
@interface PageA : BasePageViewController


//PageA.m

//调用pushViewController打开页面
[self.navigationController pushViewController:page animated:YES];

在h文件中,将PageA类设置成继承BasePageViewController。


总结

以上是我目前使用的一种UITabBar与UINavigation混用方案,基本满足了我的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/661828.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有关浪涌保护器参数科普

浪涌保护器(SPD)或简称电涌保护器是一种用于确保防止瞬态浪涌的设备。它用于保护家庭和商业应用免受电压瞬变的影响。它与必须保护的负载并联连接。 什么是瞬态浪涌? 瞬态浪涌是持续几微秒的功率(电压和电流)的突然增…

CleanMyMac X4.13.6电脑清理垃圾最干净的软件

CleanMyMac是一款Mac清理工具,MacOSX系统下知名系统清理软件,它可以流畅地与系统性能相结合,只需简单的步骤就可以节省硬盘空间,提高电脑的运行速度,时刻保持电脑的清洁和健康,监视和优化Mac的性能。 现在…

高可用数据库集群mariadb(mysql)

一、概述 是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件 二、端口号 22 三、高可用MHA简述 目前在mysql高可用方面是一个成熟的方案,是一套优秀的高可用环境下故障切…

在用户界面线程上等待的危险性

我们做这么一个假设哈。 如果有一个线程,它拥有一个窗口,则在这个线程的整个运行过程中,我们都不应该调用 Sleep 函数。为什么? 因为 Sleep 调用会导致线程在睡眠等待期停止处理窗口消息。即使对于持续时间较短的睡眠也是如此&a…

【正点原子STM32连载】 第三十三章 DAC实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第三…

亚马逊云服务器EC2开通Windows系统实例和远程RDP连接远程桌面

在这篇文章中,我们准备详细的亲测记录开通亚马逊云服务器EC2开通Windows系统。这里需要提醒的是,如果我们是初次免费体验亚马逊云服务器账户的话,是有支持单个云服务器750小时免费,如果我们超过部分是需要支付的,所以如…

探究贴纸滤镜和美颜SDK的技术实现原理

在移动应用高需求的背景下,贴纸滤镜和美颜SDK成为了移动应用中不可或缺的功能之一。那么,这些功能是如何实现的呢?本文将探究贴纸滤镜和美颜SDK的技术实现原理。 一、贴纸滤镜的技术实现原理 贴纸滤镜是一种可以在图片或视频上添加贴纸、滤镜…

1、DuiLib的编译和运行

文章目录 1、原生DuiLib的编译和运行1.1、下载并解压成这个样子1.2、打开.sln解决方案文件1.3、编译成功 2、网易DuiLib编译和运行2.1、下载并解压成这个样子2.2、打开.sln解决方案文件2.3、编译成功 3、腾讯DuiLib编译和运行vs 20173.1、下载并解压成这个样子3.2、打开.sln解决…

个人IP打造全过程:如何打造出属于自己的个人IP?

随着互联网的快速发展,个人IP已经逐渐成为一个热门话题。拥有自己的个人IP可以为你带来更多的机会和收益,让你在竞争激烈的市场中脱颖而出。但是,要想打造自己的个人IP并不是一件容易的事情。本文将为你介绍如何打造属于自己的个人IP。#IP# 一…

Burp Suite 功能详解(渗透测试工具)

一、抓包。 找到 代理--拦截--打开自带浏览器(这里也可以自己找扩展设置代理,但还要添加安全证书等等,我觉得太麻烦了,还不如直接使用Burp Suite自带的浏览器抓包)。 这是Burp Suite自带网页的页面。 点击开启拦截。 …

VMware Cloud Director Availability 4.6 | 灾难恢复和迁移 | DRaaS

VMware Cloud Director Availability 4.6 | 灾难恢复和迁移 | DRaaS 请访问原文链接:https://sysin.org/blog/vmware-cloud-director-availability-4/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org VMware Cloud …

二维码在隐患排查中的应用:扫码上报,实时通知

正值安全生产月,对企业而言隐患排查是安全管理的重要环节,众多企业设立了安全部门,部门内的相关人员会定期对生产设备、作业场所、作业人员等进行检查,以确保安全隐患的消除,从而预防事故的发生。 传统的隐患排查主要…

2018年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2018年1月真题 四、写作:第56~57小题,共65分。其中论证有效性分析30 分,论说文35分。 56.论证有效性分析: 分析下述论证中存在的缺陷和漏洞,选择若干要点,写一篇600字左右的文章,对该论证的有…

掌握Spring Cloud:打造高效可靠的微服务生态系统

1、SpringCloud概述 Spring Cloud是一个用于构建分布式系统的开源框架,它提供了一系列的组件和工具,用于实现微服务架构中的各项核心功能。本文将重点介绍Spring Cloud中的关键组件,并详细探讨它们的功能和作用。 网关:Zuul/Gat…

自动化测试-selenium基础操作

元素操作 方法: 1、.send_keys() # 输入方法 2、.click() # 点击方法 3、.clear() # 清空方法# 导包 from time import sleep from selenium import webdriver# 实例化浏览器 driver webdriver.Chrome()# 打开网址 driver.get(https://www.baidu.com/)# 需求 e…

HTTP项目常见状态码笔记(200,302,400,403,404,405,500...),

目录 认识 "状态码" (status code) 出现200 403 Forbidden 出现404 404 Not Found 出现 405 Method Not Allowed 出现 500 Internal Server Error 504 Gateway Timeout 302 Move temporarily 301 Moved Permanently 出现 "空白页面" 出现 &qu…

制作内网离线百度地图

下载离线地图瓦片 通过百度ak(没有的可以去百度官网自行申请下载),拉取下列git 项目,可以免费下载离线瓦片 https://gitee.com/jinqianwang/baidu-offline-map-download 目录结构: 使用步骤: 第一步&am…

Midjourney绘画常用聊天界面介绍

刚开始使用MJ (Midjourney) 的小伙伴可能对这个复杂的界面有点迷糊,网站也无法翻译。 实不相瞒刚开始的时候我也一脸懵逼,对于小白来说启动门槛很高,但是认识之后就一点也不复杂。 接下来我们分三步认识Midjourney的界面: 第一步: 打开Mid…

基于Java+Swing+Mysql实现酒店管理系统

基于JavaSwingMysql实现酒店管理系统 一、系统介绍二、功能展示1.用户登陆2.首页3.开房4.退房5.房间信息6、顾客信息 三、数据库四、其它1.其他系统实现2.获取源码 一、系统介绍 系统功能:用户登陆、验证码验证、开房、退房、房间信息、顾客信息 运行环境&#xf…