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的子类。此类应进行下载并在完成后通知其委托。然后,您可以拥有任意数量的 UIViewControllers,以充分利用您的 Downloader 类。

【讨论】:

好的,谢谢。我是 ios 编程的新手。我几乎处于应用交付的最后阶段。那么第二种情况如何。为什么在提交邮件编写器后 MyViewController 中缺少下载管理器? 我猜这是因为理论上你应该只有一个视图控制器并且它会混淆。令人惊讶的是,它一开始就奏效了。 视图控制器应该控制逻辑来显示视图。根据定义,专用的下载管理器(理想情况下是单例?)是(数据)模型层中的一个对象。 Download Manager 是一个有成员的类:web 视图、ActivityIndi​​cator 视图等作为成员。不明白如何使它从 NSObject 派生。它也有一个 nib 文件。在原始问题中添加下载管理器类接口。 没错:你误解了视图控制器的概念。它应该管理数据和视图之间的关系。另一方面,下载管理器应该负责获取数据,而不是管理视图。阅读encapsulation。

以上是关于ViewController 作为子视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 UINavigationController 的情况下为 detailViewController 视图设置动画?

如何将collectionview作为子视图添加到viewcontroller

在添加/删除 ViewController 作为子视图 Swift 后,ParentView 属性设置为 nil

将viewcontroller的视图添加为子视图后UIButton点击事件崩溃

在 iOS 8 中将 ViewController 的 View 作为子视图添加到 UIPageViewController 会在显示/隐藏时产生奇怪的 UINavigationBar

在 ios 中添加视图控制器作为子视图