我想显示一个视图。这两种情况有什么区别?
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]都被执行,但结果不同,我不知道为什么。
这两种方法之间的区别在于情况 #2 :
-
addSubview
方法不会保留对新dddd
视图控制器的强引用; -
addSubview
方法还要求您手动指定新控制器视图的frame
; -
即使您手动保留了对
dddd
的强引用,您也不会在该视图控制器中收到关键事件,因为您的视图控制器层次结构将与视图层次结构不一致(有关更多信息,请参阅 WWDC 2011 视频实现 UIViewController 包含,需要付费开发人员订阅);和 -
addSubview
时,您不会看到任何动画。
如果执行addSubview
模式,则应执行关联的容器调用(请参阅 UIViewController 类参考中的实现容器视图控制器部分或视图控制器编程指南的创建自定义容器视图控制器)。至少,您将:
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)视图控制器的过渡具有内置动画支持
2) 视图控制器的转换正确处理视图的生命周期
3)ViewController通常处理其视图中的所有用户交互。因此,推送视图控制器只是遵循的良好模式,例如"嘿,系统,现在这个视图控制器是最重要的,让他做这些事情","现在这个","从现在开始这个"。
在显示视图方面,使用push
和pop
,您可以获得与addSubview:
removeFromSuperview
几乎相同的行为。
推送视图控制器会打开一个新屏幕并进入堆栈。添加视图控制器保留在同一控制器中只是一个新窗口。
所以推送视图控制器=新画布添加视图控制器 = 具有新视图的相同画布