`

ios5中UIViewController addChildViewController新方法的使用[转]

 
阅读更多

在ios5中,ViewController中新添加了下面几个方法:

addChildViewController: 
removeFromParentViewController 
transitionFromViewController:toViewController:duration:options:animations:completion: 
willMoveToParentViewController: 
didMoveToParentViewController:

下面详细介绍一下addChildViewController,一个ViewController可以添加多个子ViewController,但是这些子ViewControlle要想显示出来,需要把子controller的视图添加到父视图的相应位置r,可以通过transitionFromViewController:toViewController:duration:options:animations:completion:这个方法转换显示的子视图。同时加入相应的动画。下面以一个例子来说明,最后实现的效果:

image

点击其中的按钮如下:

 

imageimageimageimage

下面详细介绍一下上述效果的实现:

  1. 创建项目,changeViewController。
  2. 添加相应的viewController,MainViewController、FirstViewController、SecondViewController、ThirdViewController。如下图:

image

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了。

这时候点击按钮,就可以切换子视图了。

这样写的好处:

  • 多个UIViewController之间切换可以添加动画
  • 当内存警告的时候,可以把当前不是激活状态的ViewController内存释放。
  • 可以把代码更好分开

项目源代码:http://easymorse-iphone.googlecode.com/svn/trunk/changeViewController/

分享到:
评论

相关推荐

    iOS5 UIViewController 新特性

    在iOS5中,UIViewController引入了一系列的新特性和改进,极大地增强了开发者处理界面和控制视图的能力。以下是对这些新特性的详细说明: 1. **Storyboards**:iOS5引入了Storyboard的概念,这是一种全新的界面设计...

    UIViewcontoller的新方法测试_demo

    在这个名为"UIViewcontoller的新方法测试_demo"的项目中,我们将探讨这些新方法,并通过实际代码示例来理解它们的用法。 首先,我们要了解`UIViewController`的一个重要更新:`childViewControllers`属性。在iOS ...

    ios Swapping View

    如果不在Interface Builder中使用Container View,也可以直接在代码中创建和管理子控制器。 ```swift func swapToViewController(_ newController: UIViewController) { if let currentController = ...

    IOS应用源码——SFContainerViewController for iOS.rar

    这通常涉及到 `-addChildViewController:`、`-removeChildViewController:` 和 `-transitionFromViewController:toViewController:duration:options:animation:completion:` 等方法的使用。 2. **视图管理**:源码...

    ios-SkChildViewController.zip

    在这个类中,你需要重写`addChildViewController:`、`removeFromParentViewController:`等方法,以添加和移除子控制器。 2. 添加子控制器:在适当的时候,例如在初始化或根据用户操作,调用`addChildViewController...

    IOS应用源码——动态tab bar.zip

    同样,也可以通过`- (void)addChildViewController:(UIViewController *)childController`添加新的ViewController并更新Tab Bar。 3. **使用Notification或Delegate**:为了在适当的时间更新Tab Bar,可以监听特定...

    Guide-maste新手指引浮层

    - 对于iOS,可以使用UIWindow或者UIViewController的addChildViewController方法叠加视图,使用UserDefaults存储用户状态。 4. 用户反馈与优化: - 收集用户反馈:通过用户测试和数据分析,了解用户对新手引导的...

    多种view视图切换效果.zipIOS应用例子源码下载

    - **UIStoryboardSegue**: iOS中的UIStoryboardSegue类提供了在Storyboard之间或内部进行视图控制器(UIViewController)切换的途径。通过拖拽和配置UIStoryboardSegue,可以实现简单的模态或推入视图切换。 - **...

    详解iOS项目基本框架搭建

    在iOS中,实现标签式导航通常使用TabBar + NavigationController的组合。TabBar作为底部的导航栏,展示各个主要模块,而NavigationController则用于管理每个模块内部的页面堆栈。具体实现时,每个TabBarItem对应一个...

    隐式切换主控制器代码

    在iOS开发中,主控制器(通常指`UIViewController`或其子类)是应用程序的核心部分,它负责管理用户界面和业务逻辑。"隐式切换主控制器代码"是一个高级编程技巧,用于在运行时动态地更改应用的主视图控制器,而无需...

    抽屉效果,侧滑带弹回,

    而在iOS中,可以使用`UISwipeGestureRecognizer`配合`UIPanGestureRecognizer`来处理手势,以及`UIViewController`的`addChildViewController`和`view addSubview:`方法来添加和管理抽屉视图。在Web开发中,我们可以...

    ContainerViewController

    "ContainerViewController"是一个基于Objective-C开发的项目,它主要展示了如何在iOS应用中使用容器视图控制器(Container View Controller)这一核心概念。容器视图控制器是Apple iOS SDK中的一个强大特性,它允许...

    XLPageViewController:一个开放,高度可定制化的分页视图控制器

    在iOS应用设计中,分页视图控制器常常用于实现多页面滑动浏览的效果,例如在很多新闻应用、社交应用或者设置界面中都能看到这种设计。XLPageViewController的出现,使得开发者能够更加轻松地构建这样的功能,并根据...

    PageScrollTabbarContrller:左右滑动Controller来切换tabbar

    这通常通过addChildViewController和removeChildViewController等方法实现。 4. **布局与约束**:由于滑动tabbar需要在屏幕底部固定,所以项目的布局文件(可能是storyboard或xib)会包含关于tabbar位置和大小的...

Global site tag (gtag.js) - Google Analytics