StoryBoard中通过连线跳转的控制器在使用时应注意的事项

控制器A通过连线可以跳转至控制器B,假如控制器B有一个属性name,此时在A跳转到B之前给控制器B赋值:

控制器A的实现文件:

#import "ViewControllerA.h"
#import "ViewControllerB.h"
@interface ViewControllerA ()

@end

@implementation ViewControllerA

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

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

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    ViewControllerB *vcB=[[ViewControllerB alloc]init];
    vcB.name=@"vcB";
}
@end


控制器B的实现文件:

#import "ViewControllerB.h"

@interface ViewControllerB ()

@end

@implementation ViewControllerB

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"name:%@",self.name);
    // Do any additional setup after loading the view.
}

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

打印结果为:

2017-04-02 18:40:41.461 StoryBoard中控制器跳转注意事项[86405:9255908] name:(null)

说明给控制器B的name属性赋值不成功,这是为什么呢?问题就出在这一句代码ViewControllerB *vcB=[[ViewControllerBalloc]init],来看看下面这一张图吧。



在控制器A跳转B时,系统为自动为你创建一个控制器B的实例对象,它的name属性为空。我们又在跳转之前使用ViewControllerB *vcB=[[ViewControllerB alloc]init]创建了一个控制器B的实例对象,这个vcB对象并不是之前那个对象,这两个对象毫无关系,所以给vcB的属性赋值是没用的。

应该改成这样:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    ViewControllerB *vcB=segue.destinationViewController;
    vcB.name=@"vcB";
}

此时segue的目标控制器对象才是跳转时创建的控制器对象B.

打印结果:

2017-04-02 19:08:56.852 StoryBoard中控制器跳转注意事项[86845:9273295] name:vcB

ps:使用代码块逆向传值时,需要给控制器的代码块属性赋值,此时要注意到这种情况。当然也可以不使用StoryBoard,而直接使用xib或者纯代码进行跳转就可以避免这种情况的出现。

ViewControllerB *vcB=[[ViewControllerB alloc]initWithNibName:@"ViewControllerB" bundle:[NSBundle mainBundle]];
vcB.name=@“vcB”;
[self.navigationController pushViewController:vcB animated:YES];




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值