Не удалось заставить 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 не отображается и ничего не отображается.
Спасибо
Ответы
Ответ 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
.