IOS用UINavigationController实现在两个页之间导航(下)

2024-02-29 04:48

本文主要是介绍IOS用UINavigationController实现在两个页之间导航(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

续前)

 

第七步:UINavigationItemUIBarButtonItem

通常每个(指任何)视图控制器都可以定义一个UINavigationItemUINavigationItem类就是实现这些功能的,这个类包含了如下表:

左边按钮

标题视图

右边按钮

leftBarButtonItem

titleView

rightBarButtonItem

当它所属的视图控制器在导航控制器所控制的堆栈顶部时,即调用(也就是说该视图控制器即将要显示时),系统自动显示该视图控制器的UINavigationItem,开发人员无需编写任何代码来调用UINavigationItem,但之前必须要设置好。上面程序代码中已经有定制好的导航栏左右按钮,简述说明如下:

定制返回按钮:在缺省情况下,下一页上的返回按钮上的文字是上一页的标题,可以在程序中修改为其它文字,要记住!返回按钮是放在上一页的视图控制器上的,所以必须在上一页对应的视图控制器的实现文件(*.m)中去修改。如在上面lvyouAppDelegate.m中有如下代码:(图中绿色代码部分)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   ……navController = [[UINavigationController alloc] init];//初始化导航控制器//定义名称为“所有城市”的返回按钮。该按钮无需target和action
//因为系统已经实现了返回功能。Style是显示风格UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithTitle:@"所有城市"style:UIBarButtonItemStyleBorderedtarget:nil action:nil];//设置启动应用时第一个要显示的视图控制器,这里是cityViewContrlcityViewController *cityViewContrl = [[cityViewController alloc] init];cityViewContrl.title = @"旅游指南";//设置第一个视图控制器的标题//设置返回按钮cityViewContrl.navigationItem.backBarButtonItem= backButton;[backButton release];//把第一个视图控制器推push到堆栈中[navController pushViewController:cityViewContrl animated:NO];[cityViewContrl release];//把导航(标签栏)控制器放到Window下//[window addSubview:navController.view];[window addSubview:tabBarController.view];// Override point for customization after application launch.[window makeKeyAndVisible];return YES;
}

在导航控制栏上添加系统按钮和左右按钮。

首先在第一页的导航栏上添加一个“折扣信息”按钮,如在上面所述,要记住!返回按钮是放在上一页的视图控制器上的,所以必须在上一页对应的视图控制器的实现文件(*.m)中去修改。这里要求在第一页的导航栏上添加一个“折扣信息”按钮(显然,这不是返回上一页按钮,而是在导航控制栏上添加一个“左按钮”),故可在当前视图控制器的实现文件(*.m)中去修改,即cityViewController.m中去修改,在它原代码中有如下代码:(图中绿色代码部分)


- (void)viewDidLoad {
//创建一个有边框的文体按钮,按下后,调用视图控制器上的discount方法
UIBarButtonItem *discountButton = [[UIBarButtonItem alloc]initWithTitle:@"折扣信息" style:UIBarButtonItemStyleBorderedtarget:self action:@selector(discount:)];self.navigationItem.leftBarButtonItem = discountButton;//设置为左边按钮[discountButton release];//释放内存UITabBarItem *item = [[UITabBarItem alloc]initWithTitle:@"旅游指南"//initWithTabBarSystemItem:UITabBarSystemItemBookmarksimage:[UIImage imageNamed:@"GoldenGateBridge.png"]tag:0];self.tabBarItem = item;[item release];[super viewDidLoad];
}

其次在第二页的导航栏上添加一个“系统按钮”(右边按钮),根据上面分析,这同样以至于返回按钮,故可在当前视图控制器的实现文件(*.m)中去修改,即CityDetailViewController.m中去修改,在它原代码中有如下代码:(图中绿色代码部分)

- (void)viewDidLoad {cityName.text = city;//获取从前一个页面传来的数据//创建一个系统添加按钮,按下后,调用视图控制器上的add方法UIBarButtonItem *rightButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAddtarget:self action:@selector(add:)];// 调用视图控制器上的add方法//设置为导航控制器控制条上的右边按钮
self.navigationItem.rightBarButtonItem = rightButton;[rightButton release];[super viewDidLoad];
}

第八步:标签栏控制器(UITabBarController

标签栏控制器是用数组来管理所控制的视图控制器。这些被管理的视图控制器即可以是导航控制器,也可以是一般的视图控制器。另外,这些视图控制器之间是平等关系,而不像导航控制器所管理的视图控制器之间是所谓的“上下级关系”。缺省情况下,标签栏上显示的是各个视图的标题,如下图显示了五个标签。

iPhone OS的标签栏最多可显示五个标签

iPhone开发学习笔记016鈥斺斢肬INavigationController实现在两个页之间导航(下)

当你选择某一个视图控制器时,该视图控制器就执行。当你选择另一个视图控制器时,当前视图控制器的状态被保留。非常类似微软中的多窗口的概念。

关系:               平等关系             上、下级之间关系

标签栏控制器

UITabBarController

导航控制器

(旅游信息)

一般视图控制器

cityViewController

一般视图控制器

CityDetailViewController

一般视图控制器

(美食天地)

MeiShiTianDi

 

下面我们将创建一个标签栏控制器,如上表,它有两个标签“旅游信息”和“美食天地”。“旅游信息”由于前面已经完成,它管理着两个视图控制器(cityViewController、 CityDetailViewController),因此,下面重点讲解未完成的工件。

1、项目的委托AppDelegate声明注册一个标签控制器、初始化后放到主窗口Window

首先:因为项目名称仍然是lvyou,所以要在项目.h中(lvyouAppDelegate.h)声明一个标签控制器:

//lvyouAppDelegate.h原代码开始
#import <UIKit/UIKit.h>
@interface lvyouAppDelegate : NSObject <UIApplicationDelegate> {UIWindow *window;UINavigationController *navController;//此行新加,对应的实现文件.m上必须要有代码!UITabBarController *tabBarController;// 声明一个标签控制器
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
//lvyouAppDelegate.h原代码结束
其次:要在项目.m中(lvyouAppDelegate.m)初始化,并将所要管理的控制器(本例是两个:一个导航控制器、另一个是美食天地视图控制器)放到其viewControllers数组中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   tabBarController = [[UITabBarController alloc] init];//初始化标签栏控制器MeiShiTianDi *viewController =[[MeiShiTianDi alloc] init];//初始化控制器viewController.title=@"美食天地";navController = [[UINavigationController alloc] init];//初始化导航控制器//加入标签栏控制器的控制器数量矩阵
//本例为两个控制器navController viewControllertabBarController.viewControllers =[NSArray arrayWithObjects:navController, viewController,nil];[viewController release];//因它不是第一个视图控制器,故释放内存//定义名称为“所有城市”的返回按钮。该按钮无需target和action
//因为系统已经实现了返回功能。Style是显示风格UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithTitle:@"所有城市"style:UIBarButtonItemStyleBorderedtarget:nil action:nil];//设置启动应用时第一个要显示的视图控制器,这里是cityViewContrlcityViewController *cityViewContrl = [[cityViewController alloc] init];cityViewContrl.title = @"旅游指南";//设置第一个视图控制器的标题//设置返回按钮cityViewContrl.navigationItem.backBarButtonItem= backButton;[backButton release];//把第一个视图控制器推push到堆栈中[navController pushViewController:cityViewContrl animated:NO];//这里假定是导航栏的第一个视图,所以animated:NO不要动画化。[cityViewContrl release];//把导航(标签栏)控制器放到Window下//[window addSubview:navController.view];[window addSubview:tabBarController.view]; //把标签栏控制器放到Window下// Override point for customization after application launch.[window makeKeyAndVisible];return YES;
}

2、创建另一个(第三个)视图控制器——美食天地:MeiShiTianDi

方法同前:

>>请选择File > New File。在New File窗口中,请选择Cocoa Touch Classes,然后选择UIViewController-subclass。同时,请勾选Options区域中标题为With XIB for user interface的选择框。为文件起个名字,视图控制器名称为MeiShiTianDi。此时,系统已经生成三个文件(*.h*.m*.xib,在新的视图控制器的视图上(MeiShiTianDi.xib)添加一些按钮(加四个,命名为“广东菜、浙江菜、四川菜、东北菜”)。

1)、添加标签栏控制器的属性到lvyouAppDelegate.h中——(上一步已经完成!)

2)、lvyouAppDelegate.m文件中的- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中,用代码方式创建一个标签栏控制器,并初始化它,最后将两个控制器navController(旅游信息)、viewController(美食天地)放在标签控制器上。——(上一步已经完成!)

//MeiShiTianDi.h原代码开始
#import <UIKit/UIKit.h>
@interface MeiShiTianDi : UIViewController {
}
@end
//MeiShiTianDi.m原代码结束//MeiShiTianDi.h原代码开始
#import "MeiShiTianDi.h"
@implementation MeiShiTianDi// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {//UIImage *tabImage = [UIImage imageNamed:@"shrimp.jpg"];//设置视图控制器在标签栏上的标题和图像// 文字是:美食天地。图像是:UITabBarSystemItemBookmarks
UITabBarItem *item = [[UITabBarItem alloc]initWithTitle:@"美食天地"initWithTabBarSystemItem:UITabBarSystemItemBookmarks//image:tabImagetag:0];
//本例还注释掉了使用自己的图像shrimp.jpg的两行代码。如你交换一下也能运行
self.tabBarItem = item;[item release]; [super viewDidLoad];
}
- (void)didReceiveMemoryWarning {// Releases the view if it doesn't have a superview.[super didReceiveMemoryWarning];// Release any cached data, images, etc that aren't in use.
}- (void)viewDidUnload {[super viewDidUnload];// Release any retained subviews of the main view.// e.g. self.myOutlet = nil;
}
- (void)dealloc {[super dealloc];
}
@end
//MeiShiTianDi.m原代码结束

3)、设置视图控制器在标签栏上的标题和图像(UITabBarItem

每个视图控制器类都有一个UITabBarItem。通过这个类,可以设置视图控制器在标签栏上的标题和图像。标题和图像分为两个类,一类是自己的图像和文字(格式为.png);另一类是系统提供的图像和文字。

首先添加图像到项目中,(在资源文件夹下)

添加UITabBarItem代码到cityViewController.mviewDidLoad方法下,这里使用用户自己的图像,图像名是:GoldenGateBridge.png

- (void)viewDidLoad {
//创建一个有边框的文体按钮,按下后,调用视图控制器上的discount方法
UIBarButtonItem *discountButton = [[UIBarButtonItem alloc]initWithTitle:@"折扣信息" style:UIBarButtonItemStyleBorderedtarget:self action:@selector(discount:)];self.navigationItem.leftBarButtonItem = discountButton;//设置为左边按钮[discountButton release];//释放内存//设置视图控制器在标签栏上的标题和图像// 文字是:旅游指南。图像是:GoldenGateBridge.pngUITabBarItem *item = [[UITabBarItem alloc]initWithTitle:@"旅游指南"//initWithTabBarSystemItem:UITabBarSystemItemBookmarksimage:[UIImage imageNamed:@"GoldenGateBridge.png"]tag:0];self.tabBarItem = item;[item release];[super viewDidLoad];
}

添加UITabBarItem代码到MeiShiTianDi.mviewDidLoad方法下,这里使用系统提供的图像,图像名是:UITabBarSystemItemBookmarks,当然,本例还注释掉了使用用户自己的图像的两行代码。如果你交换一下,也能运行。

- (void)viewDidLoad {//UIImage *tabImage = [UIImage imageNamed:@"shrimp.jpg"];//设置视图控制器在标签栏上的标题和图像// 文字是:美食天地。图像是:UITabBarSystemItemBookmarks
UITabBarItem *item = [[UITabBarItem alloc]initWithTitle:@"美食天地"initWithTabBarSystemItem:UITabBarSystemItemBookmarks//image:tabImagetag:0];
//本例还注释掉了使用用户自己的图像shrimp.jpg的两行代码。如你交换一下也能运行
self.tabBarItem = item;[item release]; [super viewDidLoad];
}


这篇关于IOS用UINavigationController实现在两个页之间导航(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757617

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、