您的位置:首页 > 产品设计 > UI/UE

UIView 两个视图控制器管理的根view为父子视图

2014-01-08 11:21 239 查看
考虑这样的一个场景.视图控制器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];

}


添加蓝色的一行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: