切换视图控制器

时间:2012-04-14 16:21:05

标签: objective-c ios uiviewcontroller

我试图搜索这个网站和整个互联网,但我还没有找到一种方法让我在多个视图控制器之间切换,同时在它们之间共享数据。 我尝试使用以下代码(第一种方法调用另一种方法然后切换视图):

-(IBAction) choosePhoto:(id)sender {
[self startMediaBrowserFromViewController: self
                            usingDelegate: self];
if(firstViewController.view.superview == nil)
{
    [secondViewController viewWillAppear:YES];
    [firstViewController viewWillDisappear:YES];

    [firstViewController.view removeFromSuperview];
    [self.view insertSubview:self.secondViewController.view atIndex:0];

    [firstViewController viewDidDisappear:YES];
    [secondViewController viewDidAppear:YES];
}

//3. now add animation
[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
//blue view will appear by flipping from right
if (secondViewController.view.superview == nil)
{
    [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight 
                           forView:self.view cache:YES];

    [secondViewController viewWillAppear:YES];
    [firstViewController viewWillDisappear:YES];

    [firstViewController.view removeFromSuperview];
    [self.view insertSubview:self.secondViewController.view atIndex:0];

    [firstViewController viewDidDisappear:YES];
    [secondViewController viewDidAppear:YES];
}
[UIView commitAnimations];
    }

- (IBAction)switchViews:(id)sender {
if(self.secondViewController.view.superview == nil)
{
    [firstViewController.view removeFromSuperview];
    [self.view insertSubview:secondViewController.view atIndex:0];
}
    }

这是一个很好的动画,但不会切换视图控制器。

请帮忙吗?

编辑: 另外在第一个视图控制器中放置另一个视图以及如何切换视图将会很有帮助。

3 个答案:

答案 0 :(得分:3)

在您的代码中,您正在切换视图而不是实际查看控制器。这意味着从视图控制器内部消息传递的角度来看(例如:视图加载/卸载,视图出现/消失,自动旋转),没有任何变化,原始的“当前”视图控制器仍将位于顶部。 现在在iOS中,这通常使用容器视图控制器来管理,容器视图控制器是“管理”一组子视图控制器并负责内部消息传递和转换的视图控制器。最常见的情况是UINavigationController和UITabBarController,你可以在iPad上看到UISplitViewController和PageViewControllers。

使用iOS5 Apple提供了一种方法,通过所谓的“View Controller Containment”向容器视图控制器(普通视图控制器)通知其包含的VC的更改。有一个视频来自WWDC 2011并在iTunes上发布(仅限注册开发人员),你可以看到。 基本上,这种方法添加了一些方法,允许通知容器视图控制器其包含的VC结构的变化。我不会在此处详细介绍并邀请您查看WWDC视频并阅读this stack overflow answerthis post。我认为后者正是你所寻找的。

答案 1 :(得分:1)

正如另一张海报所说,你不应该像你一样交换或混合视图控制器的内容视图。如果你想这样做,你需要在iOS 5中使用新的父子视图控制器支持。

如果你在iOS 5中使用新的父视图控制器支持,那么有一个非常酷,非常强大的方法叫做transitionFromViewController:toViewController:duration:options:animations:completion:它可以为你完成大部分繁重的工作。这很容易使用。

(我没有在父/子视图控制器上观看WWDC视频,但它是一个很好的起点。我刚开始使用新方法。)

答案 2 :(得分:0)

您应该使用UINavigationController在UIViewController之间切换。

[[self navigationController] pushViewController:firstViewController animated:YES];

将UIView放在UIViewController中

[[self view] addSubview:view1];

我会使用UIView.hidden来切换视图

view1.hidden = YES;
view2.hidden = NO;