ios4还是3,以前基于在vviewcontroller上的切换,基本上就2中方式,导航控制器上的push,或者普通控制器上modal,现在终于多了一个这种玩意儿了。在ios5中,ViewController中新添加了下面几个方法:
addChildViewController:
removeFromParentViewController
transitionFromViewController:toViewController:duration:options:animations:completion:
willMoveToParentViewController:
didMoveToParentViewController:
下面详细介绍一下addChildViewController,一个ViewController可以添加多个子ViewController,但是这些子ViewControlle要想显示出来,需要把子controller的视图添加到父视图的相应位置r,可以通过transitionFromViewController:toViewController:duration:options:animations:completion:这个方法转换显示的子视图。同时加入相应的动画。下面以一个例子来说明这几个新方法:
下面详细介绍一下上述效果的实现:
- 创建项目,changeViewController。
- 添加相应的viewController,MainViewController、FirstViewController、SecondViewController、ThirdViewController。
3.把MainViewController添加到window中。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
MainViewController *mainViewController=[[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
self.window.rootViewController=mainViewController;
[self.window makeKeyAndVisible];
return YES;
}
4.在MainViewController中添加三个按钮,并且连接onClickbutton方法。
5.在MainViewController中添加三个子controller
#pragma mark – View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
FirstViewController *firstViewController=[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
[self addChildViewController:firstViewController];
SecondViewController *secondViewController=[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self addChildViewController:secondViewController];
ThirdViewController *thirdViewController=[[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil];
[self addChildViewController:thirdViewController];
[contentView addSubview:thirdViewController.view];
currentViewController=thirdViewController;
}
其中要把其中的一个子controller的view添加到根视图中,这样才能显示出相应的视图。
6.点击按钮,切换视图。
-(IBAction)onClickbutton:(id)sender
{
FirstViewController *firstViewController=[self.childViewControllers objectAtIndex:0];
ThirdViewController *thirdViewController=[self.childViewControllers objectAtIndex:2];
SecondViewController *secondViewController=[self.childViewControllers objectAtIndex:1];
if ((currentViewController==firstViewController&&[sender tag]==1)||(currentViewController==secondViewController&&[sender tag]==2) ||(currentViewController==thirdViewController&&[sender tag]==3) ) {
return;
}
UIViewController *oldViewController=currentViewController;
switch ([sender tag]) {
case 1:
{
NSLog(@"留言及回复");
[self transitionFromViewController:currentViewController toViewController:firstViewController duration:4 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
} completion:^(BOOL finished) {
if (finished) {
currentViewController=firstViewController;
}else{
currentViewController=oldViewController;
}
}];
}
break;
case 2:
{
NSLog(@"生日提醒");
[self transitionFromViewController:currentViewController toViewController:secondViewController duration:1 options:UIViewAnimationOptionTransitionFlipFromTop animations:^{
} completion:^(BOOL finished) {
if (finished) {
currentViewController=secondViewController;
}else{
currentViewController=oldViewController;
}
}];
}
break;
case 3:
{
NSLog(@"好友申请");
[self transitionFromViewController:currentViewController toViewController:thirdViewController duration:1 options:UIViewAnimationOptionTransitionFlipFromBottom animations:^{
} completion:^(BOOL finished) {
if (finished) {
currentViewController=thirdViewController;
}else{
currentViewController=oldViewController;
}
}];
}
break;
default:
break;
}
}
其中我把按钮设置成不同的tag了。
这时候点击按钮,就可以切换子视图了。
可以看到,这些view在没有使用时,是不会被load的,并且当有Memory Warning时,当前没有显示的view自动被unload掉了。
这样写的好处:
- 多个UIViewController之间切换可以添加动画
- 当内存警告的时候,可以把当前不是激活状态的ViewController内存释放。所以新的方法确实能有效地节省内存,也能方便地处理内存不足时的资源回收
- 可以把代码更好分开
thx google!
相关推荐
在iOS5中,UIViewController引入了一系列的新特性和改进,极大地增强了开发者处理界面和控制视图的能力。以下是对这些新特性的详细说明: 1. **Storyboards**:iOS5引入了Storyboard的概念,这是一种全新的界面设计...
在这个名为"UIViewcontoller的新方法测试_demo"的项目中,我们将探讨这些新方法,并通过实际代码示例来理解它们的用法。 首先,我们要了解`UIViewController`的一个重要更新:`childViewControllers`属性。在iOS ...
在iOS开发中,Swapping View通常指的是在应用中动态替换视图控制器或视图的过程,以便为用户提供不同的界面或功能。这种技术在实现导航、页面切换或者内容更新时非常常见。下面将详细介绍如何在iOS中实现Swapping ...
这通常涉及到 `-addChildViewController:`、`-removeChildViewController:` 和 `-transitionFromViewController:toViewController:duration:options:animation:completion:` 等方法的使用。 2. **视图管理**:源码...
在这个类中,你需要重写`addChildViewController:`、`removeFromParentViewController:`等方法,以添加和移除子控制器。 2. 添加子控制器:在适当的时候,例如在初始化或根据用户操作,调用`addChildViewController...
同样,也可以通过`- (void)addChildViewController:(UIViewController *)childController`添加新的ViewController并更新Tab Bar。 3. **使用Notification或Delegate**:为了在适当的时间更新Tab Bar,可以监听特定...
- **UIStoryboardSegue**: iOS中的UIStoryboardSegue类提供了在Storyboard之间或内部进行视图控制器(UIViewController)切换的途径。通过拖拽和配置UIStoryboardSegue,可以实现简单的模态或推入视图切换。 - **...
在iOS项目开发中,构建一个稳定且高效的基本框架至关重要,它为后续的功能开发和维护提供了坚实的基础。本文将深入探讨iOS项目基本框架搭建,特别是导航架构设计,以及如何使用TabBar + NavigationController来构建...
- 对于iOS,可以使用UIWindow或者UIViewController的addChildViewController方法叠加视图,使用UserDefaults存储用户状态。 4. 用户反馈与优化: - 收集用户反馈:通过用户测试和数据分析,了解用户对新手引导的...
在iOS开发中,主控制器(通常指`UIViewController`或其子类)是应用程序的核心部分,它负责管理用户界面和业务逻辑。"隐式切换主控制器代码"是一个高级编程技巧,用于在运行时动态地更改应用的主视图控制器,而无需...
而在iOS中,可以使用`UISwipeGestureRecognizer`配合`UIPanGestureRecognizer`来处理手势,以及`UIViewController`的`addChildViewController`和`view addSubview:`方法来添加和管理抽屉视图。在Web开发中,我们可以...
在iOS应用设计中,分页视图控制器常常用于实现多页面滑动浏览的效果,例如在很多新闻应用、社交应用或者设置界面中都能看到这种设计。XLPageViewController的出现,使得开发者能够更加轻松地构建这样的功能,并根据...
这通常通过addChildViewController和removeChildViewController等方法实现。 4. **布局与约束**:由于滑动tabbar需要在屏幕底部固定,所以项目的布局文件(可能是storyboard或xib)会包含关于tabbar位置和大小的...
容器视图控制器是Apple iOS SDK中的一个强大特性,它允许开发者在一个单一的UIViewController实例中组合、管理多个子视图控制器,从而实现复杂的界面布局和交互。 在iOS应用开发中,Container View Controller经常...