UI基础之—UINavigationController

1. UINavigationController属性

①UINavigationController 继承自UIViewController, 导航控制器是 iOS 中提供的用来管理多个视图控制器的控制器,被它管理的视图控制器,必须要有层级关系(就是以来关系,即下一个视图的出现要依赖于前一个视图).多视图控制器的运行原理就是一个创建和销毁的过程

② 进入下一级界面,创建下一级界面的视图控制器, push 进入

返回上一级界面, pop 返回

③导航控制器以栈的形式管理多个单视图控制器,push 时视图控制器进栈, pop 时视图控制器出栈(空间被回收,销毁),屏幕上永远显示的是栈顶元素

④ 重要属性: viewControllers,永远获取的是当前栈中的所有元素.

⑤ 在新创建一个视图控制器进行跳转测试的时候,需要将新创建的视图控制器添加背景颜色,(为了防止出现卡顿现象)

⑥UINavigationController跳转实现:

创建导航视图控制器

UINavigationController *rootVC = [[UINavigationController alloc]initWithRootViewControl:first];

设置 window 的跟视图控制器

self.window.rootViewController = rootVC;

[rootVC release];

2. UINavigationController进行界面切换的时候,触发的事件

1视图将要出现的时候,一般会在这里做数据刷新

-(void)viewWillAppear: (BOOL)animated;

 2⃣ 视图将要消失

-(void)viewWillDisappear: (BOOL)animated;

3视图已经出现

-(void)viewDidAppear: (BOOL)animated;

4视图已经消失

-(void)viewDidDisappear: (BOOL)animated;

5当界面切换时,两个视图控制器,A与 B中视图的显示/消失的过程

从 Apush到 B(从前到后): A(viewWillDisappear:)->B(viewWillAppear)->A(viewDidDisappear:)->B(viewDidAppear:)

从 Bpop到 A(从后到前): B(viewWillDisappear:)->A(viewWillAppear:)->B(viewDidDisappear:)->A(viewDidAppear:)

当从后一个界面返回上一个界面时,会触发上一个界面的 viewWillAppear: 以及 viewDidAppear:,viewWillappear: 时机非常重要

6视图控制器之间的跳转

点击 Button 按钮的时候触发:

① 首先创建要跳转到界面的视图控制器

SencondViewController *secondVC = [SencondViewController alloc]init];

① 通过导航控制器进入下一个界面

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

self.navigationController 返回自身所在的多视图控制器(UINavigationController)

[secondVC release];

② pop的实现

得到多视图控制器,直接放回上一级页面

[self.navigationController popViewControllerAnimated:YES];

返回导航控制器的根视图控制器(返回第一个页面)

[self.navigationController popToRootViewControllerAnimated:YES];

③  返回到指定界面

[self.navigationController popToViewController:self.navigationController.viewControllers[1] animated:YES];

      viewControllers[1]返回当前多视图控制器中的单视图控制器的名称(单视图在进栈的时候被存放在一个数组中,所以可以按数组的下标跳转到对应的界面)

7⃣配置多视图控制器的公共属性(也就是导航栏中的公共属性,该属性适用于所有的界面)

① 设置导航条颜色

self.navigationController.navigationBar.barTintColor= [UIColor orangeColor];

② 关闭导航条的毛玻璃

self.navigationController.navigationBar.translucent = YES;

③ 隐藏导航条

self.navigationController.navigationBarHidden = NO;默认为 NO

④ 设置导航条内容的颜色

self.navigationController.navigationBar.tintColor = [UIColor magentaColor];

⑤  设置导航条的背景颜色

[self.navigationController.navigationBar setBackgroundImage:

[UIImage imageNamed:@”name”] forBarMetricsDefault];

9.  针对第一个界面单独定制导航条上的内容

1⃣配置导航条上显示的标题

self.navigationItem.title = @”FirstVC”;

2⃣配置导航条的标题视图

UISegmentedControl *segc = [UISegmentedControlalloc]initWithItems:

@[@”消息”,@”电话”];

[segc release];

3⃣设置一个左按钮,显示废纸篓按钮

1> 创建按钮

UIBarButtonItem *barButton = [[UIBarButtonItem alloc]

initWithBarButtonSystemItem:UIBarButtonSystemItemTrash:

self action:@selector(barButton:)];

2> 给 leftBarButtonItem赋值

self.navigationItem.leftBarButtonItem = barButton;

设置有按钮的方法:

UIBarButtonItem *barButton1 = [UIBarButtonItemalloc]initWithTitle:@”添加” style:

(UIBarButtonItemStyleDone) target:selfaction:@selector(rightBtn:);

self.navigationItem.rightBarButtonItem = barButton1;

3> 实现按钮的点击事件

10. UINavigationController 多视图控制器界面跳转传值情况:

属性传值的步骤:

1>  属性传值的第一步,定义属性

在下一个视图控制器中,定义一个属性.(需要显示信息界面定义一个接收数据的属性)

在 SecondViewController 中定义一个 text 属性@property

(nonatomic,retain)NSString *text;

2>  属性传值第二步, push 之前传入数据

在页面跳转之前,将传递的信息赋值给下一个视图控制器(即在第一步的时候创建的属性)

SecondViewController *second = [SecondViewControlleralloc]

Init];

second.text = self.textField.text; 将文本框的内容赋值给第一步定义的 text;

3>  属性传值第三步,取出数据,给控件赋值

在第二个视图控制器加载的时候,将获得的数据赋值给视图控制器.

 self.lable.text= self.text;

11.    代理传值

1>  代理传值第一步,定义一个协议(定义协议的方法)

@protocol SecondViewControllerDelegate<NSObject>

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

  @end

2> 代理传值第二步,定义代理属性(一般格式)

@property(nonation,assign)id<SecondViewControllerDelegate>delegate;

3>  代理传值第三步,在其他文件指定代理对象

secondVC.delegate = self;

4> 代理传值第四步,遵循代理协议

5> 代理传值第五步,实现协议中的方法

6> 代理传值第六步,让代理实现协议中的方法

//判断代理有没有实现协议中的方法

if([self.delegaterespondsToSelector:@selector(passValue:)]){

[self.delegate passValue:self.textFiled.text];

/*代理在执行方法时的内部实现

self.lable.text = text;

*/}

[self.navigationContorllerpopViewControllerAnimated:YES];

12.  单例传值

1> 单例传值第一步,定义一个单例类

2> 单例传值第二部,定义一个单例的方法(通常为类方法)

+ (Singlleton *)shareSinglleton;

3> 代理传值的第三步,定义一个单例属性,存储传输的数据

@property (nonatomic,copy)NSString *text;

4> 实现定义的类方法

static Singlleton *single = nil;

+(Singlleton *)shareSinglleton{

@synchronized (self){   //同步操作,保证在多线程中的安全

if(!single){

single = [[Singlleton alloc]init];

}

}

return single;

}

5> 单例传值第四步, push 之前将输入的数据存储到单例对象的属性text中.

[Singlleton shareSinglleton].text = self.textField.text;

6> 单例传值第五步,从单例对象中取出属性所存储的数据,给我们的需要跳转的页面赋值

self.lable.text = [Singlleton shareSinglleton].text;


#import "FirestViewController.h"
#import "SecndViewController.h"
@interface FirestViewController ()

@end

@implementation FirestViewController
/*
 当界面切换时,两个视图控制器, A与 B 中视图的显示/消失过程
 从 Apush 到 B(从前到后) : A(viewWillDisappear:) -> B(viewWillAppear:) ->A(viewDidDisappear:) ->B(viewDidAppear:)
 从 Bpop  到  A(从后到前): B(viewWillDisappear:)  -> A (viewWillAppear:)-> B(viewDidDisappear:) -> A(viewDidAppear:)
 当从后一个界面返回上一个界面时,会触发上一个界面的 viewWillAppear: 以及 viewDidAppear:
 viewWillappear:时机非常重要
 
 */
//  视图将要出现,一般会在这里做数据刷新
- (void)viewWillAppear:(BOOL)animated{
    //NSLog(@"%s",__FUNCTION__);
    //NSLog(@"%@",self.view.superview);
}
- (void)viewWillDisappear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
}
// 视图已出现
- (void)viewDidAppear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
}
- (void)viewDidDisappear:(BOOL)animated{
//NSLog(@"%s",__FUNCTION__);
    
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
    NSLog(@"%s",__FUNCTION__);
    [self layoutPushButton];
    [self configureCommonPropery];
    [self customNavigationBarConten];
}

#pragma mark -------配置公共的属性,该属性适用于所有的界面-----------
- (void)configureCommonPropery{

    // 1.设置导航条颜色
    self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
    // 2.关闭导航条的毛玻璃
    self.navigationController.navigationBar.translucent = YES;
    // 3.隐藏导航条
    self.navigationController.navigationBarHidden = NO;  // 默认 为 NO
    // 4.设置导航条内容的颜色
    self.navigationController.navigationBar.tintColor = [UIColor magentaColor];
    // 5.导航条的背景颜色
    //[self.navigationController.navigationBar  setBackgroundImage:[UIImage imageNamed:@"name"] forBarMetrics:UIBarMetricsDefault];
    
}

#pragma mark    ----------针对第一个界面单独定制导航条上的内容-------------------
- (void)customNavigationBarConten{

    //  1.配置导航条上显示的标题
    self.navigationItem.title = @"FirstVC";
    //  2.配置导航条的标题视图
    UISegmentedControl *segC= [[UISegmentedControl alloc]initWithItems:@[@"消息",@"电话"]];
    self.navigationItem.titleView = segC;
    [segC release];
    //  3.设置一个 左button,显示废纸篓按钮
    // 1>创建按钮
    UIBarButtonItem *barButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(barButton:)];
    
    
    // 2> 给 leftBarButtonItem 赋值
    self.navigationItem.leftBarButtonItem = barButton;
    // 4. 设置右按钮
    //UIBarButtonItem *right = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(rigthBtn:)];
    UIBarButtonItem *barButton1 = [[UIBarButtonItem alloc]initWithTitle:@"添加"  style:(UIBarButtonItemStyleDone) target:self action:@selector(rigthBtn:)];
    self.navigationItem.rightBarButtonItem = barButton1;
}
// 实现左按钮的点击方法
- (void)barButton:(UIBarButtonItem *)sender{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"是否删除联系人?" delegate: self cancelButtonTitle:@"确定" otherButtonTitles:@"取消", nil];
    [alert show];
}
- (void)rigthBtn:(UIBarButtonItem *)sender{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"是否添加联系人?" delegate: self cancelButtonTitle:@"确定" otherButtonTitles:@"取消", nil];
    [alert show];
}

// 进入下一个界面
- (void)layoutPushButton {
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(50, 150, 220, 40);
    [button setTitle:@"进入下一级" forState: UIControlStateNormal];
    button.backgroundColor = [UIColor whiteColor];
    [self.view addSubview: button];
    [button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
}
// 点击事件
- (void)btnClick:(UIButton *)sender{
    // 1.创建第二个视图控制器
    SecndViewController *secondVC = [[SecndViewController alloc]init];
    // 2.通过导航控制器进入下一个界面
    // 得到自身所在的多视图控制器(UINavigationController)
    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];
}
- (void)dealloc{
    NSLog(@"1被销毁了");
    [super dealloc];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值