-(void)viewDidLoad多次创建视图对象
场景
外部创建
vc,并在对vc属性赋值时(vc.dataSource = @[]),在vc内部
dataSource属性的set方法中调用了懒加载控件tableView,这时候,会进入到tableView的懒加载方法中,并创建tableView1如果在
tableView 1被创建完成之前,引用了vc.view,(比如:
_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];)如果这个时候,
vc.view == nil;则会调用vc的viewDidLoad方法,创建vc的view如果在
ViewDidLoad方法中,调用了self.tableView,那么就又会进入tableView的懒加载方法中,再次创建一个tableView2如果 然后 在
viewDidLoad中 进行了[self.view addSubview: self.tableView]这时候添加的应该是tableView2运行完
vc的viewDidLoad方法后,会继续回到tableView1的懒加载中,进行创建tableView1,这时
vc的懒加载属性tableView应该为tableView1,而在vc.view视图上的tableView应该为tableView2
代码示例
-
外部创建vc
UIViewController *vc = [UIViewController new] vc.dataSource = @[]; -
vc内部
- (void)setDataSource:(NSArray<NSString *> *)dataSource { _dataSource = dataSource; [self.tableView reloadData]; } - (UITableView *)tableView{ if (!_tableView) { _tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; //register cell ... } return _tableView; }
解决
1. 在tableView懒加载内部不要使用self.view





网友评论