2013-11-17 2 views
1

Я хочу показать представление. В чем разница между этими двумя ситуациями?В чем разница между нажатием viewcontroller и добавлением вида контроллера?

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] является excuted, но результаты разные, я не знаю, почему.

+0

UIView - это нечто иное, чем UIViewController. Эти две ситуации - совершенно разные вещи. – Astri

+0

привет, astri, я знаю, что они разные. Но похоже, что оба они могут показать диспетчерский вид в окне. – nice

+0

. Вы можете добавить столько просмотров, сколько хотите на вершине представления, даже представления, которые не покрывают весь экран , Например, кнопка UIView. Было бы неплохо посмотреть некоторые из видеороликов здесь: https://itunes.apple.com/gb/course/coding-together-developing/id593208016 – Astri

ответ

2

Разница между этими двумя подходами в том, что ситуация # 2:

  • addSubview подхода не будет держать сильную ссылку на новый контроллер dddd вида;

  • Подход addSubview также требует, чтобы вручную указывал frame для просмотра нового контроллера;

  • Даже если вы вручную держали сильную ссылку на dddd, вы не будете получать ключевые события в этой точке зрения контроллера, поскольку иерархия вида контроллера не будет соответствовать иерархиям вида (см требуется подписка на WWDC 2011 VIdeo Implementing UIViewController Containment, оплаченных разработчика , Чтобы получить больше информации); и

  • Вы не увидите никакой анимации, так как вы addSubview.

Если вы делаете addSubview шаблон, вы должны сделать соответствующие контейнеры вызовов (см Implementing a Container View Controller раздела UIViewController класс Reference или Creating Custom Container View Controllers в View Controller Руководства по программированию). Как минимум, вы бы:

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.

+0

Это решило мою проблему. Большое спасибо! – Lilo

0

Нажатие контроллера вида открывает новый экран и вводит в стек. Добавление контроллера просмотра остается в том же контроллере только в новом окне.

Так толкая контроллер представления = новый холст добавить вид контроллера = тот же холст с новым видом

1

Короче:
1) переход ViewController имеет встроенную поддержку анимации
2) переход ViewController в корректно обрабатывает view's lifecycle
3) ViewController обычно обрабатывает все пользовательские взаимодействия в своем представлении. Так что нажатие на контроллер просмотра - это просто хороший шаблон, который следует следовать, скажем: «Эй, система, теперь этот ViewController самый верхний, пусть он делает что-то», «А теперь этот», «И отныне этот».

С точки зрения отображения взглядов, с push и pop вы можете получить почти такое же поведение, как с addSubview:removeFromSuperview.

Смежные вопросы