UIView 两个视图控制器管理的根view为父子视图
考虑这样的一个场景.视图控制器vc1管理一个button.button 按下后弹出一个下拉框【uitableview】。
下拉框当然可以用vc1管理。但是,因为下拉框点击后还要做其他操作,而且其他操作并不影响vc1管理的视图。
这个时候有必要在设计一个vc2来管理这个下拉框。让业务逻辑在不同的视图控制器来处理。
那么为了让下拉框在vc1管理的视图上显示。自然而然可以考虑
[vc1.view addSubView vc2.view];但是这种实现会有一个很容易忽视的bug
代码实现如下
@interface HomeViewController () @property (strong, nonatomic) UIButton *OKButton; @end @implementation - (void)viewDidLoad { self.OKButton=.....; ..... [self.OKButton addTarget:self action:@selector(showDropDownView:) forControlEvents:UIControlEventTouchUpInside]; } - (void)showDropDownView:(id)sender { DropDownViewController *dropDownViewController = [[DropDownViewController alloc] init]; [self.view addSubView dropDownViewController.view]; } @end
@interface DropDownViewController () @property (strong, nonatomic) UITableView *tableView; @end @implementation - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor clearColor]; self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(214, 43, 106, 130) style:UITableViewStylePlain]; self.tableView.backgroundColor = [UIColor blackColor]; self.tableView.delegate = self; self.tableView.dataSource = self; self.tableView.bounces = NO; self.dataSource = @[@"消息",@"好友",@"问题",@"信息",@"关于",@"退出"]; [self.view addSubview:self.tableView]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { switch (indexPath.row) { case 5: [self.view removeFromSuperview]; break; default: break; } } @end
homeViewController没有引用dropDownViewController,导致dropDownViewController一初始化后,就消失了。这样的话。因为dropDownViewController管理的view被homeViewController的view 所引用。虽然dropDownViewController管理的视图虽然可以继续存在。但是[self.view removeFromSuperview];中已经没有self了。
解决方案是为homeViewController添加一个属性
@property(strong, nonamtomic) DropDownViewController *dropDownViewController;
然后再button的action方法中
- (void)showDropDownView:(id)sender { DropDownViewController *dropDownViewController = [[DropDownViewController alloc] init]; self.dropDownViewController = dropDownViewController; [self.view addSubView dropDownViewController.view]; }
添加蓝色的一行。
浙公网安备 33010602011771号