UINavigationController

UINavigationController导航控制器

一个导航控制器主要用来构建分层应用层序的主要工具,它在管理以及换入和换出多个内容视图十分方便。UINavigationController是作为栈来实现的,这让它非常适合处理分层数据。
导航控制器维护一个视图控制器栈,任何类型的视图控制器都可以放入栈中吗,在设计导航控制器的时候,我们需要指定用户看到的第一个视图,该视图是最底层的视图,其控制器称为根视图控制器(root view Controller)或者根控制器、当用户选择查看下一个视图的时候,栈中将加入一个新的视图控制器,它所控制的视图将展现给用户。我们把这些新的视图控制器成为子控制器。

导航控制器的使用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加代码
` self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor=[UIColor whiteColor];
[self.window makeKeyAndVisible];

AViewController *a=[AViewController new];

UINavigationController *na=[[UINavigationController alloc]initWithRootViewController:a];
self.window.rootViewController=na;
return YES;`

这段代码就是将window赋值,可视化。然后实例化一个AViewController对象a。然后将a视图控制器作为UINavigationController实例化对象na的根视图控制器,最后将na作为self.window的根视图控制器。这样我们就可以进入程序之后进入到一个导航控制器里面,导航控制器的根视图由a来展示。

在导航控制器中不同的视图进行赋值

有些时候我们需要一些值,这个时候就需要进行视图之间的复制了,在这里我们讲其中的一个方式:属性赋值
在刚才的AViewController视图控制器中,我们在viewDidLoad方法中添加代码
`
[super viewDidLoad];
self.view.backgroundColor=[UIColor cyanColor];
CGFloat width=[UIScreen mainScreen].bounds.size.width;
CGFloat height=[UIScreen mainScreen].bounds.size.height;

UIButton *button=[UIButton buttonWithType:UIButtonTypeSystem];
[button addTarget:self action:@selector(Action:) forControlEvents:UIControlEventTouchUpInside];

[button setTitle:@"推送" forState:0];
[self.view addSubview:button];

button.frame=CGRectMake((width-60)/2, (height-60)/2, 60, 60);

label=[[UILabel alloc]init];
label.text=@"瑞文";
label.textColor=[UIColor blackColor];
[self.view addSubview:label];

label.frame=CGRectMake(170, 280, 150, 60);`

这个label需要声明为全局变量;
这段代码主要工作就是添加一个Button和为一个label添加属性。
Button中的方法如下

-(void)Action:(UIButton *)sender{
BViewController *b=[BViewController new];
b.string=label.text;
b.delegate = self;
[self.navigationController pushViewController:b animated:YES];
}
-(void)transString:(NSString *)string{
label.text = string;
}

这个方法实例化了一个视图控制器BViewController,而且,在BViewController里面含有一个属性string,这样就可以将a中的label.text的内容传入b中。b就可以获得a中的值。
BViewController中的delegate是一会讲到的代理传值方法,在这里先不管。
[self.navigationController pushViewController:b animated:YES];这段语句的意思就是通过这个导航控制器调用方法去加入一个视图控制器(也就是刚刚实例化的b)animated是指是否需要动画。完成这段语句之后我们就可以将一个视图推入这个视图控制器的栈中。

在这个视图控制器的最后还有一个方法来获取从别的视图中传入的值

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

很简单,只要在别的视图中调用这个方法,将值赋予参数就可以完成传值

在BViewController的viewDidLoad方法中,我们将a传入的label.text的值赋予给b中的属性,然后实例化一个label,将string的值赋给label.text,这样就完成了一个简单的属性传值。
`
self.view.backgroundColor=[UIColor greenColor];

UILabel *label=[[UILabel alloc]init];
label.text=self.string;
label.textColor=[UIColor blackColor];
[self.view addSubview:label];

label.frame=CGRectMake(170, 280, 150, 60);
`

对于视图之间的赋值我们还可以使用代理赋值,也就是声明一个BViewControllerDelegate方法,和实现这个代理。我们可以在BViewController.h的方法中实现
`
@protocol bViewControllerDelegate

-(void)transString:(NSString *)string;
@end

@interface BViewController : UIViewController
@property (weak,nonatomic)NSString *string;
@property (assign,nonatomic)iddelegate;
@end

我们需要一个值回调给a,所以我们在b中实现的代理,并且给b一个UITextField文本,将文本内的内容回调给a。通过一个UIButton来回到a。
具体代码实现

UITextField *tf = [UITextField new];
tf.tag = 100;
tf.placeholder = @”输入要传给A页面的值”;
tf.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:tf];
tf.frame = CGRectMake(70, 70, 220, 60);
tf.borderStyle = UITextBorderStyleRoundedRect;

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button addTarget:self action:@selector(popAction:) forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"返回" forState:UIControlStateNormal];
[button setBackgroundColor:[UIColor blackColor]];
button.frame = CGRectMake(70, 140, 220, 60);
[self.view addSubview:button];


对应的popAction:方法实现

-(void)popAction:(UIButton *)sender{
UITextField tf = (UITextField )[self.view viewWithTag:100];
if (self.delegate && [self.delegate conformsToProtocol:@protocol(bViewControllerDelegate)]) {
[self.delegate transString:tf.text];
}
[self.navigationController popViewControllerAnimated:YES];
}
`
我们一步步来看,首先通过tag属性拿回UITextField,然后检查该delegate属性是否有值和该对象是否实现了BViewControllerDelegate协议,如果都实现了的话,就进行值回调。最后一句表示通过该导航控制器回到上一个控制器中。
这样就可以在AViewController将BViewController的值拿到。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值