Objective-C 混用UITabBar与UINavigation

news/2024/10/31 7:33:38/

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

文章目录

  • 前言
  • 一、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 对象,动态创建UIViewControllerUIViewController *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*) vcmenuName: (NSString*) menuNamenormal: (NSString*) normalhighlighted: (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 {// 隐藏下面的tabpage.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.ppmy.cn/news/463944.html

相关文章

【im群发推送软件】(Apple Push Notification service):APNs 是苹果提供的推送服务

iMessage 推送需要您对苹果的推送服务和相关开发技术有一定的了解,并熟悉应用程序开发的相关知识。以下是一些关键的方面和步骤,供您参考: 开发者账号和证书:您需要注册苹果开发者账号,并获取开发者证书用于推送服务。…

【MySQL】一文带你了解数据库索引与事务

文章目录 1. 索引的概念2.索引的创建与使用2.1 自动创建对应列的索引2.2 自己创建普通索引2.3 删除索引2.4 索引查询 3. 索引的弊端4. 事务的概念5. 事务的特性6. 事务的使用 1. 索引的概念 数据库索引是一种提高数据库查询效率的数据结构。它可以快速地定位和访问数据库中的数…

计算机的硬盘维修,四大电脑硬盘常见错误及修复方案

硬盘驱动器是计算机系统中最重要的单元之一,如果它不能正常工作,系统就很难有序运行。计算机的核心操作系统都存储在在硬盘驱动器上,因此硬盘驱动器运行状况非常重要,需要我们额外的关注。如果用户发现硬盘驱动器无法正常工作,就需要对硬盘驱动器的问题进行诊断,然后采取…

但打不开 固态硬盘 插电脑上 能识别_硬盘无法识别修复恢复

您知道电脑硬盘是如何读取和存储数据的吗?恢复软件是如何找回数据的吗?通过这个视频教程,你将了解你丢失的数据是否还在,这些文件能否找回。 请点击 - 》》》》 观看视频 如何安全找回丢失数据的方法 1. 下载并安装B计划数据恢复软…

计算机硬盘检测和修复工具,教你怎么使用硬盘检测修复工具教程

有的朋友出现电脑硬盘读取速度变慢的情况,通过重装系统后发现没有变化,这个可能就是硬盘出现大量的坏道导致的,那么如何检测硬盘坏道以及修复呢?下面小编带你看下如何硬盘检测修复工具的操作教程。 电脑硬盘的寿命一般是3到5年&am…

群晖硬盘已损毁 Linux 修复,通用解决方案:修复Synology系统硬盘损坏

在矿难发生之前,我买了一个带两个红色磁盘的星际蜗牛C机壳来存储数据。我没想到红盘的质量会这么差。从去年年初到现在,UNC错误间歇出现。这周它崩溃了。记录修复过程: Synology系统内部使用的软团队管理。初始化新插入的硬盘后,通常会将其格式化为3个分区。通常,前两个与…

centos 硬盘 修复

xfs_repair -n /dev/sdb centos 硬盘 修复 sudo parted -l sudo parted -l [localhost home]$ sudo parted -l Model: Dell VIRTUAL DISK (scsi) Disk /dev/sda: 1000GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags:Number Start End…

服务器机械硬盘坏了怎么修复,硬盘修复软件:如何修复硬盘错误?

吴川 华南区技术负责人 概要 您在使用硬盘时是否遇到了一些硬盘错误提示,比如提示格式化或无法访问等?本文将介绍硬盘故障的一些症状和原因,您可以根据实际情况选择硬盘修复软件/工具对硬盘错误进行修复。若因硬盘故障导致数据丢失,也可以在本文中找到数据恢复方法。 一、硬…