推动视图控制器和添加控制器视图有什么区别?

时间:2013-11-17 14:09:04

标签: ios navigation viewcontroller addsubview

我想展示一个观点。这两种情况有什么区别?

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]都已被执行,但结果不同,我不知道原因。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

  • addSubview将不会看到任何动画。

如果执行addSubview模式,则应执行关联的容器调用(请参阅 UIViewController类参考中的Implementing UIViewController Containment部分或<{3}} < em> View Controller Programming Guide )。至少,你会:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

按下视图控制器打开一个新屏幕并输入堆栈。添加视图控制器只在一个新窗口中保留在同一个控制器中。

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