2012-04-13 4 views
27

Я скопировал рабочий класс viewcontroller из другого проекта в новый проект. Я не могу получить представление для загрузки в новом проекте. В старом проекте я использовал presentModalViewController. В новом я не могу получить представление для загрузки, используя либо presentModalViewController, либо presentViewControllerНе удалось получить presentViewController для работы

Я пытаюсь загрузить настоящее представление с моего главного контроллера.

Вот что мой основной интерфейс вид контроллер выглядит ...

// ViewController.h 
#import <UIKit/UIKit.h> 
#import "RequestDialogViewController.h" 

@interface ViewController : UIViewController <RequestDialogViewControllerDelegate> { 

} 

- (void)requestDialogViewDidDismiss:(RequestDialogViewController *)controller withResponse:(NSString*)response; 

Я использую presentModalViewController, как это ...

RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController" bundle:nil]; 
navigationController = [[UINavigationController alloc] initWithRootViewController:requestIPViewController]; 
[self presentModalViewController:navigationController animated:YES]; 

и presentViewController как это ...

RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController" bundle:nil];  
[self presentViewController:requestIPViewController animated:YES completion:nil]; 

Что мне недостает в новом проекте? Метод init запускается, но viewDidLoad не отображается, и ничего не отображается.

Благодаря

ответ

73

Если ViewController является контроллером корневого представления, он не может представлять собой контроллер модального представления из своего собственного viewDidLoad, потому что в этот момент он не имеет такой информации, как размер экрана.

Если другие контроллеры представлений уже отображены, это будет работать. Если контроллером корневого представления является UINavigationController, вы увидите, как изображение сдвигается с правой стороны, а модальное изображение соскальзывает снизу.

В любом случае, для вашего ViewController, скорее всего вы можете представить его после того, как оно стало видимым. Использование таймера для этого ненадежно; более старые и более медленные устройства имеют значительно более длительное время загрузки.

Для обеспечения большей надежности нанесите viewDidAppear: на номер ViewController. По-прежнему используйте свою систему таймера, чтобы добавить дополнительную задержку; достаточно доли секунды. Несмотря на то, что представление модератора просмотра моделей с viewDidAppear работало для меня в симуляторе iOS 5.1, Presenting a modal view controller when loading another ViewController говорит, что иногда этого не происходит.

+3

Вау, это было не очевидно для меня. Я провел некоторое время, пытаясь понять это. Благодарю. – rjgonzo

+0

Если это происходит при запуске приложения - пока не отображается мерцание представления представления контроллера представления до отображения представленного контроллера представления? Как это обойти? См. Http://stackoverflow.com/questions/14739461/how-do-you-transition-in-a-new-non-model-view-controller-without-using-uinavigat/14739540#14739540 для контекста. – Marplesoft

+0

Это все еще касается iOS 10 Xcode 8 Swift 2.3. Благодаря! – justColbs

0

Подари modalViewController:

На благо всех исходных программистов, введите его вместо копирования пасты.

myVC *viewController = [[myVC alloc]initWithNibName:@"myVC" bundle:nil]; 
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:viewController animated:YES]; 
[viewController release]; 

Похоже, вы пытаетесь представить контроллер нав как контроллер представления в первом образце, то вы использовали неправильный метод во втором.

+0

На самом деле вы правы в отношении presentModalViewController. Я скопировал это неправильно из своего рабочего кода. Тем не менее, я действительно хотел, чтобы текущий элемент управления представлением работал, поскольку presentModalViewController устарел. Я получил его работу ... См. Мой ответ ниже. – user278859

+2

Для справок в будущем не следует копировать/вставлять программы. –

4

У меня есть разрешение. Я пытался представить представление из представления, загрузив основной контроллер представления. Не знаю, почему он не работает, но вместо этого я теперь устанавливать таймер, который вызывает метод представить контроллер представления после основного зрения нагрузок и она работает отлично теперь, используя ...

[self presentViewController:requestIPViewController animated:YES completion:nil]; 

Благодаря тем который ответил.

+0

Этот метод доступен только в iOS 6 и за пределами –

+4

@NathanielSymer. Я не думаю, что это правильно. Документы говорят, что presentViewController: анимированный: завершение: это iOS5 и выше. См. Http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/presentViewController:aimated:completion: – Marplesoft

0

Я столкнулся с той же проблемой. Но моя ситуация - presentViewController вызывается после dismissViewControllerAnimated для другого ViewController.Мое решение состоит в том, чтобы переместить presentViewController в блок завершения dismissViewControllerAnimated.

+0

Это имеет смысл. потому что вы должны отклонить контроллер перед представлением другого. –

2

Как сказал @Dondragmer, если вы хотите представить свой viewController в представлении viewDidLoad в корневом представлении, он потерпит неудачу. Как только ваш viewController готов к этому, вы можете представить свой новый viewController. Таким образом, вы можете сделать это в

- (void)viewDidLayoutSubviews { 
    //present here 
} 
+1

^зависит от того, сколько раз вы хотите его представить :) Отрыв отладки отладчика показал, что это называется пару раз подряд. –

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