Как модально представить стандартный UIViewController

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

Вот код, который я использую:

- (void)viewDidAppear:(BOOL)animated {
    NSLog(@"view did appear within rootviewcontroller");
    WelcomeViewController *welcome = [[WelcomeViewController alloc] init];
    [self presentModalViewController:welcome animated:true];
    [welcome release];
}

Проблема в том, что я не установил WelcomeViewController's представление, поэтому loadView не запускается, что означает, что на экран не выводится контент.

Каждый пример, который я нахожу, включая Apple, использует либо .xib для инициализации ViewController, либо NavigationController, который добавляет RootViewController, либо оба. Насколько я понимаю, loadView вызывается автоматически для вас в обоих этих сценариях. http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html#//apple_ref/doc/uid/TP40007457-CH111-SW3

Где мне настроить мое WelcomeViewController's представление? Сразу после выделения / инициализации? Внутри WelcomeViewController's метода инициализации?

Спасибо!


person djibouti33    schedule 18.02.2011    source источник


Ответы (2)


Где мне настроить вид моего WelcomeViewController?

Переопределите метод loadView в своем подклассе. См. См. Руководство по программированию контроллера для iOS.

person Jim    schedule 18.02.2011
comment
Спасибо за ответ, но это не ответ на мой вопрос. Я уже переопределяю loadView, но он не вызывается. loadView никогда не следует вызывать напрямую, он вызывается только тогда, когда свойство представления запрашивается, но в настоящее время равно нулю. Итак, мой актуальный вопрос: где / как мне запросить свойство представления? - person djibouti33; 18.02.2011
comment
Вы этого не сделаете. Когда представлен контроллер представления, UIKit запрашивает представление. Если его еще нет, вызывается ваш loadView. - person Jim; 19.02.2011
comment
Блин ... Должно быть, я что-то напортачил и перепутал код во время тестирования разных решений. Если я просто представлю его модально и больше ничего не буду делать, я теперь вижу, как вызывается loadView. Итак, прямо там, в loadView, я бы выделил / инициализировал общий UIView и установил для него значение self.view, правильно? - person djibouti33; 19.02.2011
comment
Ага, верно. Вы можете использовать любое масштабируемое представление, но наиболее распространенным является общий UIView. - person Jim; 19.02.2011

Вот простой пример того, как это можно обойтись без использования NIB:

В вашем AppDelegate didFinishLaunchingWithOptions: вы создаете экземпляр своего настраиваемого контроллера представления и добавляете его как подпредставление окна (довольно стандартно).

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    RootViewController *vc = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    [self.window addSubview:vc.view];
    [self.window makeKeyAndVisible];
    return YES;
}

При создании экземпляра vc вы используете назначенный инициализатор, который будет вызываться в новом экземпляре контроллера представления. Вы не указываете никаких перьев, потому что вы будете выполнять свою индивидуальную инициализацию внутри метода:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [self.view setBackgroundColor:[UIColor orangeColor]];
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
        [label setBackgroundColor:[UIColor clearColor]];
        [label setNumberOfLines:2];
        [label setText:@"This is the vc view with an\norange background and a label"];
        [label setTextColor:[UIColor whiteColor]];
        [label setTextAlignment:UITextAlignmentCenter];
        [self.view addSubview:label];
        [label release];
    }
    return self;
}
person Rog    schedule 18.02.2011
comment
Извините за форматирование кода. Есть что-то с публикацией с iPad, из-за которой мои разрывы строк игнорируются ?? - person Rog; 18.02.2011
comment
Спасибо за ответ. Не уверен, ясно ли я сказал (я вернусь и отредактирую свой вопрос), но я делаю все программно, без .xib. Поэтому мне нужно знать, где установить VC.view, поскольку у меня нет загрузки пера или добавления свойства rootViewController в контроллеры навигации, чтобы сделать это автоматически. Если я устанавливаю представление сразу после выделения / инициализации, я могу получить всплывающее окно модального окна, но loadView не вызывается. - person djibouti33; 19.02.2011
comment
@ djibouti33 Код отредактирован на простом примере. Посмотрим, имеет ли это смысл сейчас. - person Rog; 19.02.2011
comment
спасибо, Родж. Я вставил ваш код в свой, и loadView от RootVC постоянно вызывается. Я действительно решил проблему с помощью предложения Джима. Я просто представляю WelcomeViewController, и loadView вызывается автоматически. Затем внутри loadView я создаю общий UIView и назначаю ему self.view. Это работает отлично, и loadView вызывается только один раз. Кроме того, поскольку я не использую .xibs, я могу просто вызвать init вместо вызова initWithNibName: bundle: с nil. Спасибо за вашу помощь! - person djibouti33; 19.02.2011