关于属性传值为空的问题

先来看下面这段代码:

_collectionView.didClickCellAtItemIndexPathBlock=^(Video *video) {
        DetailViewController *detailVC=[[DetailViewController alloc]init];
        //一定要记得设置控制器的背景颜色,否则会造成push卡顿的假象
        detailVC.view.backgroundColor=[UIColor whiteColor];
        detailVC.video=video;
        [weakSelf.navigationController pushViewController:detailVC animated:YES ];
    };

这样进行属性传值,在DetailViewController控制器的-(void)viewDidLoad方法里面打印video属性的值为nil(因为我们通常在该方法中使用传过来的属性值)。罪魁祸首就在这句代码:detailVC.view.backgroundColor=[UIColorwhiteColor],
因为这句代码一执行,-(void)viewDidLoad方法提前调用,此时video属性还未被赋值,所有video属性的值为nil

解决方案一:属性传值的代码写在init之后,目的就是在调用-(void)viewDidLoad方法之前给属性赋值
 _collectionView.didClickCellAtItemIndexPathBlock=^(Video *video) {
       DetailViewController *detailVC=[[DetailViewController alloc]init];
        detailVC.video=video;
        //一定要记得设置控制器的背景颜色,否则会造成push卡顿的假象
        detailVC.view.backgroundColor=[UIColor whiteColor];
        [weakSelf.navigationController pushViewController:detailVC animated:YES ];
    };

解决方案二:在-(void)viewWillAppear里面使用传过来的属性值(慎用)
#import "DetailViewController.h"
#import "PlayVideoView.h"
#import "Video.h"

@interface DetailViewController ()
@property (nonatomic,strong) PlayVideoView *playView;
@end

@implementation DetailViewController


-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:YES];
    self.playView.video=self.video;
}
ps:只能在这里面传数据,不能在这里面添加子视图,否则的话每次加载控制器都会重复添加子视图。因为 - ( void )viewDidLoad只会加载一次 ,而-(void)viewWillAppear这个方法只要控制器出现就会加载

解决方案三:既然根本原因是提前调用了-(void)viewDidLoad方法,那么就不让它提前调用,采用此方案的好处就是后面可以照常在
-(void)viewDidLoad方法里面获取传过来的属性值
_collectionView.didClickCellAtItemIndexPathBlock=^(Video *video) {
        DetailViewController *detailVC=[[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
        detailVC.video=video;
        [weakSelf.navigationController pushViewController:detailVC animated:YES ];
    };

ps:其实所有解决方案都是基于调用顺序的原理,目的都是保证在使用属性之前成功给属性赋值。
pps:一定要尽量避免这种情况出现,能不提前设置控制器的背景颜色就不要提前设置,比如说可以在控制器的-loadview方法设置它的背景颜色。




猜你喜欢

转载自blog.csdn.net/chokshen/article/details/72860929