我想展示一个观点。这两种情况有什么区别?
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]都已被执行,但结果不同,我不知道原因。
答案 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];
这将确保视图控制器层次结构与视图层次结构一致,并确保保留子视图控制器。但是,在呈现此新视图时,您必须手动执行所需的任何动画。
通常,只需执行相应的pushViewController
或presentViewController
调用就更容易了,这不是问题。但在特殊情况下,这种自定义容器模式可能很有用。
顺便说一句,如果您想要显示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是最顶层的,让他做的事情”,“现在这个”,“从现在这个”。
在显示观看方面,使用push
和pop
,您可以获得与addSubview:
removeFromSuperview
几乎相同的行为。
答案 2 :(得分:0)
按下视图控制器打开一个新屏幕并输入堆栈。添加视图控制器只在一个新窗口中保留在同一个控制器中。
所以推动一个视图控制器=新画布 添加视图控制器=具有新视图的相同画布