ViewController 作为子视图
Posted
技术标签:
【中文标题】ViewController 作为子视图【英文标题】:ViewController as Subview 【发布时间】:2012-06-22 08:33:25 【问题描述】:我有一个UIViewController
(DownloadManager),它用UIWebView
下载一个网页并显示下载的内容(比如一个 pdf 文件)。我想把它用作可重用的组件。
我有另一个 UIViewController
指向一个包含 4 个按钮的屏幕,每个按钮应该从网页下载并显示一个 pdf 文件。我想将下载的 pdf 作为嵌入式子视图显示到当前屏幕。基本上不想导航。
这里我尝试使用 DownloadManager 作为子视图并将 pdf 显示为子视图。它工作正常。
我阅读为每屏幕一个视图控制器。但是我仍然可以使用这种方法吗?
我必须从此屏幕发送电子邮件反馈。一旦我展示 MFMailComposeViewController 之前的下载管理器子视图就会消失 从技术上讲,这里发生了什么?
请在下面找到代码sn-p:
//************************************************
@implement MyViewController
- (void) initWebView
downloadMgr = [[DownLoadViewController alloc] initWithNibName:@"DownLoadViewController" bundle:nil];
downloadMgr.view.frame = CGRectMake(140, 20, 300, 200);
downloadMgr.WebView.frame = CGRectMake(140, 20, 300, 200);
downloadMgr.view.backgroundColor = [UIColor whiteColor];
downloadMgr.WebView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:downloadMgr.view];
[self.view addSubview:downloadMgr.WebView];
----
----
- (IBAction)onHomeClick:(UIButton *)sender
switch (sender.tag)
case 101:
[self stopWebViewResources];
if (!downloadMgr)
[self initWebView];
downloadMgr.NavigationURL = [[NSURL alloc] initWithString:@"https://xxx.yyyyyy.com/sites/pex/iPadFiles/abc.pdf"];
downloadMgr.title = @"ABC";
[downloadMgr LoadURL];
break;
case 120:
//Send feedback via email
if ([MFMailComposeViewController canSendMail])
MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init];
mail.mailComposeDelegate = self;
----
----
mail.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentModalViewController:mail animated:YES];
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
[self dismissModalViewControllerAnimated:YES];
@end
//*****************************************************************
@interface DownLoadViewController : UIViewController <MyWebViewDelegate>
NSURL* NavigationURL;
IBOutlet myWebView* WebView;
IBOutlet UIActivityIndicatorView* ProgressView;
NSString* DownloadedFileName;
【问题讨论】:
【参考方案1】:将下载功能和显示分成两个不同的类会更加健壮。
理想情况下,您应该有一个像“Downloader”或“Download Manager”这样的类,它是NSObject
的子类。此类应进行下载并在完成后通知其委托。然后,您可以拥有任意数量的 UIViewController
s,以充分利用您的 Downloader 类。
【讨论】:
好的,谢谢。我是 ios 编程的新手。我几乎处于应用交付的最后阶段。那么第二种情况如何。为什么在提交邮件编写器后 MyViewController 中缺少下载管理器? 我猜这是因为理论上你应该只有一个视图控制器并且它会混淆。令人惊讶的是,它一开始就奏效了。 视图控制器应该控制逻辑来显示视图。根据定义,专用的下载管理器(理想情况下是单例?)是(数据)模型层中的一个对象。 Download Manager 是一个有成员的类:web 视图、ActivityIndicator 视图等作为成员。不明白如何使它从 NSObject 派生。它也有一个 nib 文件。在原始问题中添加下载管理器类接口。 没错:你误解了视图控制器的概念。它应该管理数据和视图之间的关系。另一方面,下载管理器应该负责获取数据,而不是管理视图。阅读encapsulation。以上是关于ViewController 作为子视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 UINavigationController 的情况下为 detailViewController 视图设置动画?
如何将collectionview作为子视图添加到viewcontroller
在添加/删除 ViewController 作为子视图 Swift 后,ParentView 属性设置为 nil
将viewcontroller的视图添加为子视图后UIButton点击事件崩溃
在 iOS 8 中将 ViewController 的 View 作为子视图添加到 UIPageViewController 会在显示/隐藏时产生奇怪的 UINavigationBar