文章目录
- toolbar(工具栏)
- 子控制器间数据的传递
- 概念定义
- 顺传
- 逆传
- 例子
toolbar(工具栏)
navigtionbar是显示在最上面的,但是toolbar是显示在屏幕的最下面的,默认情况下,toolbar是不显示的,并不是所有的应用都需要toolbar,新闻类的app比较常用。
导航控制器中toolBar是只读属性,没办法对他进行直接的定制,只有在初始化navigationController的时候,去指定一个自定义的toolbar.
toolbar上的按钮是UIBarbutton类型的。
第一个页面不显示toolbar,第二个页面显示toolbar,因为是一个navigationController,所以要在第一个页面的viewWillAppear里,把toolbar隐藏。
代码:https://github.com/ShaeZhuJiu/navigationbar-toolbar.git
子控制器间数据的传递
如何在navigationController和控制的子控制器之间进行数据的传递。实际开发中使用很频繁。
概念定义
在导航控制器管理的子控制器之间传递数据时,有如下概念需要了解。
源控制器:调用pushViewController方法的控制器。
目标控制器:调用pushViewController方法后,展示出来的新控制器。
顺传:源控制器向目标控制器传递数据
逆传:目标控制器向源控制器传递数据。
顺传
顺传数据的核心思路时在目标控制器中,新增一个属性,在pushViewController:方法之前,把源控制器中的数据传递给改属性,常步骤:
逆传
当目标控制器需要向源控制器传递数据时,可以使用代理(一对一)或者通知(一对多),以代理为例,delegate协议。
例子
顺传:源控制器在初始化目标控制器和跳转之间传值,目标控制器在viewDidLoad中更新。
逆传:目标控制器中声明代理,和传参,源控制器中设置定义代理方法。
//
// RootViewController.m
// 1NaviVC
//
// Created byon 2019/6/25.
// Copyright © 2019 Shae. All rights reserved.
//
#import "RootViewController.h"
#import "DetailViewController.h"
@interface RootViewController ()<DetailViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UITextField *rootTextField;
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title=@"RootVC";
}
- (IBAction)changeVC:(UIButton *)sender {
//初始化目标控制器
UIStoryboard *storyBoard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
DetailViewController *detailVC=[storyBoard instantiateViewControllerWithIdentifier:@"DetailViewController"];
//传值
detailVC.text=self.rootTextField.text;
//设置代理
detailVC.delegate=self;
//执行跳转
[self.navigationController pushViewController:detailVC animated:YES];
}
- (void)detailViewController:(DetailViewController *)detailViewController returnRootVcWithNewString:(NSString *)string{
self.rootTextField.text=string;
}
@end
//
// DetailViewController.m
// 1NaviVC
//
// Created by on 2019/6/25.
// Copyright © 2019 Shae. All rights reserved.
//
#import "DetailViewController.h"
@interface DetailViewController ()
@property (weak, nonatomic) IBOutlet UITextField *DetailFIeld;
@end
@implementation DetailViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 更新textField
self.DetailFIeld.text=self.text;
}
- (IBAction)returnRootVc:(UIButton *)sender {
//通知代理工作
if([self.delegate respondsToSelector:@selector(detailViewController:returnRootVcWithNewString:)]){
[self.delegate detailViewController:self returnRootVcWithNewString:self.DetailFIeld.text];
}
[self.navigationController popViewControllerAnimated:YES];
}
@end
代码:https://github.com/ShaeZhuJiu/navigationController-.git