Подтвердить что ты не робот

Не удалось заставить presentViewController работать

Я скопировал рабочий класс viewcontroller из другого проекта в новый проект. Я не могу получить представление для загрузки в новом проекте. В старом проекте я использовал presentModalViewController. В новом я не могу получить представление для загрузки, используя либо presentModalViewController, либо 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 не отображается и ничего не отображается.

Спасибо

4b9b3361

Ответ 1

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

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

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

Для большей надежности реализуйте viewDidAppear: для ViewController. По-прежнему используйте свою систему таймера, чтобы добавить дополнительную задержку; достаточно доли секунды. Хотя представление модального контроллера представления изнутри viewDidAppear работало для меня в симуляторе iOS 5.1, Представление модального контроллера представлений при загрузке другого ViewController говорит, что иногда этого не происходит.

Ответ 2

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

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

Спасибо тем, кто ответил.

Ответ 3

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

- (void)viewDidLayoutSubviews {
    //present here
}

Ответ 4

Представить modalViewController:

Для всех начинающих программистов введите его вместо копии.

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

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

Ответ 5

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