先来看下面这段代码:
_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 ];
};
pps:一定要尽量避免这种情况出现,能不提前设置控制器的背景颜色就不要提前设置,比如说可以在控制器的-loadview方法设置它的背景颜色。