文档章节

UI_08 UINavigationController、界面通信

黑伞将军
 黑伞将军
发布于 2015/08/25 21:40
字数 1030
阅读 74
收藏 3

⼀、UINavigationController

     UINavigationController:导航控制器,是iOS中最常⽤的多视图控制器 之⼀,它⽤来管理多个视图控制器。 导航控制器可以认为是管理控制器的控制器,主要管理有层级关系的控制器。

     UINavigationController继承于UIViewController,以栈的⽅式管理所 控制的视图控制器,⾄少要有⼀个被管理的视图控制器,这个控制器 我们称作,导航控制器的根视图控制器。 任何继承⾃UIViewController的类(多态)都可以作为根控制器。

1、⼯作原理

  • UINavigationController通过栈的⽅式管理控制器的切换,控制⼊栈和出栈来展⽰各个视图控制器。

  • UINavigationController的ContentView⾥始终显⽰栈顶控制器的view。

  • viewControllers属性存储了栈中的所有被管理的控制器

  • navigationController属性,⽗类中的属性,每个在栈中的控制器,都能通过此属性,获取⾃⼰所在的UINavigationController对象。

2、⼊栈和出栈

  • - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; //进⼊下⼀个视图控制器

  • - (UIViewController *)popViewControllerAnimated:(BOOL)animated; //返回上⼀个视图控制器

  • - (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; //返回到指定的视图控制器

  • - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated; //返回到根视图控制器

3、常⽤属性

  • viewControllers //所有处于栈中的控制器

  • topViewController //位于栈顶的控制器

  • visibleViewController //当前正在显⽰的控制器

  • navigationBar //导航条



⼆、定制UINavigationBar

     navigationBar—导航条,iOS7之后默认是透明的,iOS7之前默认是不 透明的。

     navigationBar在透明情况,与contentView会重合⼀部分区域。 navigationBar在不透明情况,contentView跟在navigationBar的下⾯。 navigationBar竖屏下默认⾼度44,横屏下默认⾼度32.


1、管理UINavigationItem

      UINavigationBar也是以栈的⽅式管 理⼀组UINavigationItem。提供push和pop操作item。

      每个视图控制器都有⼀个navigationItem属性。navigationItem中设 置的左按钮、右按钮、标题等,会随着控制器的显⽰,也显⽰到 navigationBar上

UINavigationBar

  • barStyle                      样式 

  • translucent                 透明度:YES时布局从状态栏顶端开始。NO时布局从状态栏底端开始

  • tintColor                     颜色

  • backgroundImage:     背景图片


//设置导航栏的barStyle(样式)translucent
   
//白色(默认)
   
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
   
self.navigationController.navigationBar.translucent = YES //(半透明)
   
self.navigationController.navigationBar.translucent = NO //(不透明)
   
//黑色
//    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
   
//设置导航栏的barTintColor
   
self.navigationController.navigationBar.barTintColor = [[UIColor brownColor] colorWithAlphaComponent:0.3];
   
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
   
////设置导航栏的backgroundImage,像素:6444,小于44
//    64
   
UIImage *image = [UIImage imageNamed:@"NavBar_64"];
    [
self.navigationController.navigationItem setPrompt:@"Prompt"];

    [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];

2、UINavigationItem

     UINavigationItem属于MVC中的M。封装了要显⽰在UINavigationBar上的数据。

  • title //标题

  • titleView //标题视图

  • leftBarButtonItem //左按钮

  • rightBarButtonItem //右按钮

//1、每一个导航控制器(NavigationController),有且只有一个导航栏(NavigationBar)
//2、导航栏上面展示的都是UINavigationItem里面的内容
//3、每一个视图控制器都有一个navigationItem
   
//设置导航栏上的UIBarButtonItem,三种设置方式
   
//a.系统样式
//    UIBarButtonItem *rightBI = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(clickRightBI:)];
   
//b.使用title初始化设置UIBarButtonItem
   
UIBarButtonItem *rightBI = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStylePlain target:self action:@selector(clickRightBI:)];
   
//c.使用image初始化UIBarButtonItem,此时,image需要进行渲染设置,默认渲染为模版方式。需要将image渲染方式设置为原图方式
   
UIImage *image1 = [UIImage imageNamed:@"NavBtnLeft"];
   
UIImage *image2 = [image1 imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

    UIBarButtonItem *leftBI = [[UIBarButtonItem alloc] initWithImage:image2 style:UIBarButtonItemStylePlain target:self action:@selector(clickRightBI:)];

    //添加Bar

    self.navigationItem.leftBarButtonItem = leftBI;
    [leftBI
release];
   
self.navigationItem.rightBarButtonItem = rightBI;
    [rightBI
release];
   
   
//设置导航栏上要显示的title
   
self.navigationItem.title = @"登录页面";
   
//设置导航栏上要显示的titleView

    self.navigationItem.titleView = [[UISegmentedControl alloc] initWithItems:@[@"消息", @"电话"]];

3、UIBarButtonItem

UIBarButtonItem属于MVC的M。定义了UINavigationItem上按钮的触

发事件,外观等

  • -initWithBarButtonSystemItem:target:action:

  • -initWithTitle:style:target:action:

  • -initWithImage:style:target:action:

  • tintColor

4、结构



三、界⾯间通信

1、属性传值

RegisterViewController.h

@property(nonatomic, retain) NSString *text;

LoginViewController.h

registerVC.text = @"someString";

2、代理传值

1.创建协议

RegisterViewControllerDelegate.h

#import <Foundation/Foundation.h>
@class NSString;

@protocol RegisterViewControllerDelegate <NSObject>

- (
void)sendValue:(NSString *)text;

@end

2.遵守、实现协议

LoginViewController.h

#import <UIKit/UIKit.h>

#import "RegisterViewControllerDelegate.h"

@interface LoginViewController : UIViewController<RegisterViewControllerDelegate>

@end

LoginViewController.m

- (void)sendValue:(NSString *)text
{
   
_label.text = text;

}

3.使用代理

RegisterViewController.h

//注意:声明一个代理属性,(因为registerVC是委托人,它要拥有一个代理属性,用来设置代理)

@property(nonatomic, assign)id<RegisterViewControllerDelegate> delegate;


RegisterViewController.m

- (void)clickBI:(UIBarButtonItem *)BI
{
    [
self.navigationController popViewControllerAnimated:YES];
    [
_delegate sendValue:@"hello"];

}

4.设置代理

LoginViewController.m
- (
void)clickBI:(UIBarButtonItem *)BI
{
   
RegisterViewController *registVC = [[RegisterViewController alloc] init];
   
    registVC.
delegate = self;
    [
self.navigationController pushViewController:registVC animated:YES];

}


© 著作权归作者所有

黑伞将军
粉丝 1
博文 33
码字总数 34553
作品 0
张家口
程序员
私信 提问
问题1:UIView不会被释放--block中如果有self的话会造成循环引用

程序使用的是 UINavigationController 。 使用tableView来显示对应的城市,在下载离线地图的时候,通过高德地图的一个api来下载,下载过程中,使用异步线程进行ui界面更新。这个 dispatchas...

抢地主
2016/05/08
11
0
穿透Session 0 隔离(二)

上一篇我们已经对Session 0 隔离有了进一步认识,如果在开发过程中确实需要服务与桌面用户进行交互,可以通过远程桌面服务的API 绕过Session 0 的隔离完成交互操作。 对于简单的交互,服务可...

junwong
2012/03/09
958
1
UINavigationController导航控制器

1.UINavigationController概述 UINavigationController继承于UIViewController,以栈的方式管理所控制的视图控制器,所以至少要有一 个被管理的视 图控制器 UINavigationController通过入栈和出...

tuwangsheng
2014/04/29
0
0
UITabBarController和UINavigationController的区别

UITabBarController 和UINavigationController都可以作为 window的根控制器(rootViewController),但界面内容的展示样式是不同的。其区别如下: 1 UITabBarController的导航栏展示位置在屏幕...

奋斗的青春年华
2016/06/20
44
0
如何在present出来的viewController里使用push方法

MenuViewController * menuViewController = [[MenuViewController alloc] init]; menuViewController.delegate = self; UIViewController * controller = self.view.window.rootViewControl......

浪子艾菲儿
2014/08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 带这么多钱,你要泡我吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :白给?#今日歌曲推荐# 分享Lana Del Rey的单曲《Yayo》: 《Yayo》- Lana Del Rey 手机党少年们想听歌,请使劲儿戳(这里) @红薯...

小小编辑
18分钟前
37
4
搭建tftp服务

前言: 最近整理一些以前的学习笔记。 过去都是存储在本地,此次传到网络留待备用。 TFTP服务: TFTP:Trivial File Transfer Protocol 不重要文件传输协议 主要用来传送小文件,不支持认证和...

迷失De挣扎
今天
4
0
rest 的理解

rest:表现层状态转移。 什么是restful协议?https://en.wikipedia.org/wiki/Representational_state_transfer 使用restful的好处。 Rest是一种体系结构样式,他定义了一组用于创建web服务的...

xiaoxiao_go
今天
5
0
聊聊spring cloud的CachingSpringLoadBalancerFactory

序 本文主要研究一下spring cloud的CachingSpringLoadBalancerFactory CachingSpringLoadBalancerFactory spring-cloud-openfeign-core-2.2.0.M1-sources.jar!/org/springframework/cloud/o......

go4it
昨天
8
0
一篇文章搞定——JDK8中新增的StampedLock

一、StampedLock类简介 StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时使读写锁之间可以互相转换,更细粒度控...

须臾之余
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部