UIView 两个视图控制器管理的根view为父子视图
2014-01-08 11:21
239 查看
考虑这样的一个场景.视图控制器vc1管理一个button.button 按下后弹出一个下拉框【uitableview】。
下拉框当然可以用vc1管理。但是,因为下拉框点击后还要做其他操作,而且其他操作并不影响vc1管理的视图。
这个时候有必要在设计一个vc2来管理这个下拉框。让业务逻辑在不同的视图控制器来处理。
那么为了让下拉框在vc1管理的视图上显示。自然而然可以考虑
[vc1.view addSubView vc2.view];但是这种实现会有一个很容易忽视的bug
代码实现如下
homeViewController没有引用dropDownViewController,导致dropDownViewController一初始化后,就消失了。这样的话。因为dropDownViewController管理的view被homeViewController的view 所引用。虽然dropDownViewController管理的视图虽然可以继续存在。但是[self.view removeFromSuperview];中已经没有self了。
解决方案是为homeViewController添加一个属性
@property(strong, nonamtomic) DropDownViewController *dropDownViewController;
然后再button的action方法中
添加蓝色的一行。
下拉框当然可以用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]; }
添加蓝色的一行。
相关文章推荐
- 一个视图控制器里面有两个PickerView
- 实现视图控制器一次 dismissViewController 两个视图控制器
- iOS presentViewController两个视图控制器的时候返回根视图
- UITabBarController作为根视图控制器的时候出现的问题,popToRootViewController的时候出现两个TabBar
- 视图控制器中的资源管理 Resource Management in View Controllers [苹果官方文档的翻译]
- ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
- iOS开发:第一个iOS程序分析——AppDelegate.h文件和视图View、视图控制器ViewController
- UIView如何管理它的子视图
- 分割视图控制器(UISplitViewController)
- iOS UI初级-视图控制器UIViewController
- UIView操作:插入添加置顶,判断一个视图是否为子视图view
- Spring MVC-控制器(Controller)-可参数化视图控制器(Parameterizable View Controller )示例(转载实践)
- IOS界面UI设计7之UIWindown、多种方式创建视图控制器、View
- 分割视图控制器(UISplitViewController)
- iOS属性传值(视图控制器viewController的执行顺序的理解和懒人加载的理解)
- 使用容器控制器控制另外两个控制器的view交换
- iOS开发 - UIViewController控制器管理
- 视图控制器管理
- Custom Container View Controller(自定义容器视图控制器)
- 实例讲解iOS中的UIPageViewController翻页视图控制器