实现控制器跳转的几种方式
1.可以通过UINavigationController来实现,它是一种类似“栈”的数据结构,控制器通过入栈和出栈实现跳转。
2.也可以通过UITabBarController来实现,它类似微信主界面下方的几个按钮,它可以实现几个界面之间的切换,把控制器实例化并添加即可。
3.或者直接在当前控制器下调用下一个控制器,实现跳转。
这次我们重点研究UINavigationController的使用。
UINavigationController的学习和使用
几个步骤:
- 实例化UINavigationController
- 把它作为当前window的根视图控制器。
- 实例化一个控制器作为UINavigationController的根控制器,也就是栈底控制器。
- 除此之外还需要用window的初始化操作。
创建它的代码:
这里的操作都是在delegate的回调中完成的,下一步就会进入第一个控制器的界面了。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
ViewController *viewController=[[ViewController alloc]init];
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
self.window.rootViewController = nav;
self.window.backgroundColor = [UIColor clearColor];
[self.window makeKeyAndVisible];
return YES;
}
跳转到下一个控制器:
[self.navigationController pushViewController:viewController2 animated:YES];
弹出当前控制器,回到上一个控制器
[self.navigationController popViewControllerAnimated:YES];
在这个过程中会发生什么呢?
压栈后控制器初始化,显示控制器内容。弹栈后控制器销毁。
- (void)dealloc
{
NSLog(@"---------DEALLOC2--------");
}
这里实现了dealloc回调方法,可以看到在返回的时候,打印了 ---------DEALLOC2--------
整理控制器跳转的逻辑
因为第一个控制器在成为UINavigationController的根控制器后完成加载,然后在其中有一个按钮,点击按钮,触发监听方法,调用:
- (IBAction)Action:(id)sender
{
NSLog(@"添加控制器2");
ViewController2 *viewController2 = [[ViewController2 alloc] init];
[self.navigationController pushViewController:viewController2 animated:YES];
}
进入了控制器2,然后在控制器2中点击按钮,回到控制器1。
- (IBAction)ActionBack:(id)sender
{
NSLog(@"弹出当前控制器2");
self.block(self.textView.text);
[self.navigationController popViewControllerAnimated:YES];
}
其中的self.navigationController管理了整个控制器的pop和push逻辑。
UIView的生命周期
这个过程中view做了些什么事情呢?
在我的demo中实现了实现了view的回调方法,写了相应输出语句,先展示这些代码,我们结合现象分析view的生命周期。
直接给出了view生命周期的全部方法了。
#import "View2.h"
@interface View2()
{
NSInteger count;
}
@end
@implementation View2
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self){
self.backgroundColor = [UIColor yellowColor];
NSLog(@"<-- 1 %s , count = %@-->