初学者一般认为控制器显示都是全屏的
其实不然
如果我们想做出很复杂的应用 我们需要在一个控制器里面 可以切换不同的控制器
在这里 实现了三个控制器的随意点击切换
这个仅仅是原理 复杂的应用归根到底 就是这样实现的
我们应该声明 其他控制器为全局变量
因为如果我们声明的是局部变量嗲用之后会立即销毁
我们保存不了这个变量
各个控制器中的代理方法 和数据都没有管理者 点击会崩掉
所以这里要特别注意
#import "ViewController.h"
#import "QHTestViewController.h"
#import "QHOneViewController.h"
#import "QHTwoViewController.h"
#import "QHThreeViewController.h"
@interface ViewController ()
- (IBAction)vc1;
- (IBAction)vc2;
- (IBAction)vc3;
@property(nonatomic,strong)QHOneViewController *one;
@property(nonatomic,strong)QHTwoViewController *two;
@property(nonatomic,strong)QHThreeViewController *three;
@property(nonatomic,strong)QHTestViewController *test;
@end
@implementation ViewController
- (QHOneViewController *)one
{
if (_one == nil) {
self.one = [[QHOneViewController alloc]init];
self.one.view.frame = CGRectMake(30, 150, 300, 300);
}
return _one;
}
- (QHTwoViewController *)two
{
if (_two == nil) {
self.two = [[QHTwoViewController alloc]init];
self.two.view.frame = CGRectMake(30, 150, 300, 300);
}
return _two;
}
- (QHThreeViewController *)three
{
if (_three == nil) {
self.three = [[QHThreeViewController alloc]init];
self.three.view.frame = CGRectMake(30, 150, 300, 300);
}
return _three;
}
- (void)viewDidLoad {
[super viewDidLoad];
//控制器是局部变量 所以死了
// QHTestViewController *test = [[QHTestViewController alloc]init];
//
// test.view.frame = CGRectMake(100, 100, 200, 300);
// test.view.backgroundColor = [UIColor redColor];
// //tableView 添加到了self.view 中所以不会被销毁
// [self.view addSubview:test.view];
// self.test =test;
//如果发现:控制器的view还在,但是view 上面的数据不显示 ,极大可能是因为 控制器被提前销毁了
//解决方案 :强引用
#warning 但是没有数据
}
- (IBAction)vc1 {
[self.two.view removeFromSuperview];
[self.three.view removeFromSuperview];
[self.view addSubview:self.one.view];
}
- (IBAction)vc2 {
[self.three.view removeFromSuperview];
[self.one.view removeFromSuperview];
[self.view addSubview:self.two.view];
}
- (IBAction)vc3 {
[self.one.view removeFromSuperview];
[self.two.view removeFromSuperview];
[self.view addSubview:self.three.view];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end