三种ViewController跳转的异同
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
MainVC *mainVC = [[MainVC alloc] init];
[self presentViewController:mainVC animated:YES completion:nil];
这种方式一般出现在需要使用者完成某件事情,如输入密码、增加资料等操作后,才能(回到跳转前的控制器)继续。例如系统的WIFI连接输入密码提示。默认动画是从下至上。
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
这种方式一般是使用者浏览资料,继而可以前进到下一个页面或回到上一个页面。默认动画是从右至左。
- (void)addChildViewController:(UIViewController *)childController
这个方法出现在iOS5以后,通过它即使不使用NavigationController也能够实现view hierarchy。有以下优点:
1.页面逻辑很清晰,相应的View对应相应的ViewController。
2.当某个子View没有显示时,将不会被Load,减少了内存的使用。
3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
#import "ViewController.h" #import "FirstVC.h" #import "SecondVC.h" #import "ThirdVC.h" @interface ViewController () { FirstVC *firstVC; SecondVC *secondVC; ThirdVC *thirdVC; } @property (weak, nonatomic) IBOutlet UIView *contentView; @property (strong, nonatomic) UIViewController *currentVC; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. firstVC = [[FirstVC alloc] init]; secondVC = [[SecondVC alloc] init]; thirdVC = [[ThirdVC alloc] init]; [self addChildViewController:firstVC]; [self addChildViewController:secondVC]; [self addChildViewController:thirdVC]; [self.contentView addSubview:thirdVC.view]; self.currentVC = thirdVC; } - (IBAction)onClick:(id)sender { if(self.currentVC==firstVC && [sender tag]==1) { return; } if(self.currentVC==secondVC && [sender tag]==2) { return; } if(self.currentVC==thirdVC && [sender tag]==3) { return; } UIViewController *oldVC = self.currentVC; switch ([sender tag]) { case 1: { [self transitionFromViewController:self.currentVC toViewController:firstVC duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{ } completion:^(BOOL finished) { if(finished) { self.currentVC = firstVC; } else { self.currentVC = oldVC; } }]; } break; case 2: { [self transitionFromViewController:self.currentVC toViewController:secondVC duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{ } completion:^(BOOL finished) { if(finished) { self.currentVC = secondVC; } else { self.currentVC = oldVC; } }]; } break; case 3: { [self transitionFromViewController:self.currentVC toViewController:thirdVC duration:1 options:UIViewAnimationOptionTransitionCurlUp animations:^{ } completion:^(BOOL finished) { if(finished) { self.currentVC = thirdVC; } else { self.currentVC = oldVC; } }]; } break; default: break; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程