【问题标题】:what's the difference between pushing a viewcontroller and adding the controller'view?推送视图控制器和添加控制器视图有什么区别?
【发布时间】:2013-11-17 14:09:03
【问题描述】:

我要展示一个视图,这两种情况有什么区别?

UIViewController *con = [[dddd alloc]init];//this controller is used to show a pdf using a webView(using loadURL method)

//situation 1 which can show the pdf
[self.navigationcontroller pushviewcontroller:con animation:YES];

//situation 2 which can not show the pdf
[self.view addSubview:con.view];

在这两种情况下,[webView loadURL:url]都被执行了,但是结果不同,我不知道为什么。

【问题讨论】:

  • UIView 与 UIViewController 不同。这两种情况完全不同。
  • 嗨,astri,我知道它们是不同的。但似乎它们都可以在窗口中显示控制器的视图
  • 您可以在视图顶部添加任意数量的视图,甚至是不覆盖整个屏幕的视图。例如,按钮是 UIView。最好在这里观看一些视频:itunes.apple.com/gb/course/coding-together-developing/…
  • @nice 您可能还想考虑使用UIDocumentInteractionController,这是一种呈现 PDF 的简单方法。

标签: ios navigation viewcontroller addsubview


【解决方案1】:

这两种方法的区别在于情况#2:

  • addSubview 方法不会对新的 dddd 视图控制器保持强引用;

  • addSubview 方法还要求您为新控制器的视图手动指定frame

  • 即使您手动保持对 dddd 的强引用,您也不会在该视图控制器中收到关键事件,因为您的视图控制器层次结构与您的视图层次结构不一致(请参阅 WWDC 2011 视频 Implementing UIViewController Containment ,需要付费开发者订阅,了解更多信息);和

  • 你不会像addSubview那样看到任何动画。

如果您使用addSubview 模式,您应该进行相关的容器调用(参见UIViewController 类参考 中的Implementing a Container View Controller 部分或视图控制器编程指南的Creating Custom Container View Controllers )。至少,你会:

UIViewController *con = [[dddd alloc]init];//this controller is used to show a pdf using a webView(using loadURL method)

[self addChildViewController:con];
[self.view addSubview:con.view];
[con didMoveToParentViewController:self];

而且,当你想删除它时:

[con willMoveToParentViewController:nil];
[con.view removeFromSuperview];
[self removeChildViewController:con];

这将确保视图控制器层次结构与视图层次结构保持一致,并确保保留子视图控制器。但是,当您呈现这个新视图时,您必须手动执行任何您想要的动画。

通常只进行适当的pushViewControllerpresentViewController 调用会更容易,这不是问题。但在特殊情况下,这种自定义容器模式会很有用。


顺便说一句,如果您想显示 PDF,请考虑使用 UIDocumentInteractionController,例如,指定您的视图控制器符合 UIDocumentInteractionControllerDelegate,然后使用以下代码:

- (IBAction)didTouchUpInsidePDFButton:(id)sender
{
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];
    UIDocumentInteractionController *controller = [UIDocumentInteractionController interactionControllerWithURL:url];
    controller.delegate = self;
    [controller presentPreviewAnimated:YES];
}

- (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller
{
    return self;

    // or if you want to push to the PDF preview, and the current view controller 
    // already has navigation controller, you can:
    //
    // return self.navigationController;
}

使用UIDocumentInteractionController,您根本不需要使用带有UIWebView 的单独视图控制器。

【讨论】:

    【解决方案2】:

    简而言之:
    1) ViewController 的转场内置动画支持
    2) ViewController 的转换正确处理视图的生命周期
    3) ViewController 通常处理其视图中的所有用户交互。所以推送视图控制器是一个很好的模式,比如“嘿,系统,现在这个 ViewController 是最顶层的,让他做这些事情”、“现在这个”、“从现在开始这个”。

    在显示视图方面,使用 pushpop 您可以获得与 addSubview: removeFromSuperview 几乎相同的行为。

    【讨论】:

      【解决方案3】:

      推动视图控制器打开一个新屏幕并进入堆栈。添加视图控制器保留在同一个控制器中,只是一个新窗口。

      所以推视图控制器 = 新画布 添加视图控制器 = 具有新视图的相同画布

      【讨论】:

        猜你喜欢
        • 2015-04-12
        • 2016-10-22
        • 2010-12-11
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        相关资源
        最近更新 更多