2012-06-22 3 views
0

У меня есть один UIViewController (DownloadManager), который загружает веб-страницу с UIWebView и отображает загруженный контент (скажем, файл pdf). Я хочу использовать его как компонент многократного использования.ViewController as Subview

У меня есть еще один UIViewController, указывающий на экран, который содержит 4 кнопки, каждая кнопка должна загружать и отображать один файл pdf с веб-страницы. Я хочу отобразить загруженный pdf в качестве встроенного subview на текущий экран. В принципе не хотят навигации.

Здесь я попытался использовать DownloadManager как subview и отобразить pdf как subview. Его работа прекрасна.

  1. Я прочитал как на экране один Вид контроллера. Но все-таки я могу использовать этот подход?

  2. Я должен отправить электронную почту с этого экрана. Как только я представляю MFMailComposeViewController, предыдущий диспетчер диспетчера загрузки исчезает. Технически, что здесь происходит?

Пожалуйста, найдите фрагмент кода ниже:

//************************************************ 
@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; 
} 

ответ

4

Это гораздо надежнее, чтобы отделить загрузки функциональность и дисплей в двух различных классов.

В идеале, вы должны иметь класс как "Downloader" или "Download Manager", который является подклассом NSObject. Этот класс должен выполнить загрузку и уведомить своего делегат, когда это будет сделано. Тогда у вас может быть столько UIViewController s, сколько вам нравится, чтобы воспользоваться вашим классом Downloader.

+0

Хорошо спасибо. Я новичок в программировании на iOS. Я почти на конечной стадии доставки приложений. Итак, как насчет второго случая. почему диспетчер загрузки отсутствует в MyViewController после представления почтового композитора? – Srivathsa

+0

Я думаю, это потому, что теоретически у вас должен быть только один контроллер вида, и он путается. Удивительно, что он работал в первую очередь. – Mundi

+0

Просмотр контроллера должен контролировать логику, чтобы отобразить представление. Выделенный диспетчер загрузки (в идеале singleton?) По определению является объектом на уровне данных (данных). –