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];

}

添加蓝色的一行。

 

posted on 2014-01-08 11:21  mix1009  阅读(267)  评论(0)    收藏  举报

导航