【问题标题】:Switching View Controllers切换视图控制器
【发布时间】:2012-04-26 15:57:57
【问题描述】:

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

-(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];
}
    }

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

请帮忙?

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

【问题讨论】:

    标签: objective-c ios uiviewcontroller


    【解决方案1】:

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

    在 iOS5 中,Apple 提供了一种方法来通知容器视图控制器(这是一个普通的视图控制器)其包含的 VC 的更改,使用所谓的“视图控制器包含”。您可以看到一段取自 WWDC 2011 并在 iTunes 上发布的视频(仅限注册开发者)。 基本上,这种方法添加了一些方法,允许通知容器视图控制器其包含的 VC 结构中的更改。我不会在这里详细介绍并邀请观看 WWDC 视频并阅读 this stack overflow answerthis post。我认为后者正是您想要的。

    【讨论】:

    • 该视频名为“Implementing UIViewController Containment”,第 102 期,2011 年 6 月 15 日。您可以通过 iTunes Store 访问它。
    【解决方案2】:

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

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

    将 UIView 放入 UIViewController

    [[self view] addSubview:view1];
    

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

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

    【讨论】:

    • 我可以在 Interface Builder 中看到它吗?
    【解决方案3】:

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

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

    (我还没有看过关于父/子视图控制器的 WWDC 视频,但这是一个很好的起点。我刚开始使用新方法。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      相关资源
      最近更新 更多