Почему эта программа для iPhone не вызывает -loadView? - PullRequest
3 голосов
/ 13 марта 2009

Я пытаюсь проработать основы программирования на iPhone, и у меня есть хорошее общее представление о том, как работает Interface Builder, поэтому я решил попробовать свои силы в программных представлениях. Я просмотрел руководство Apple по ViewController и искал везде, и я не могу найти решение своей проблемы. Это наводит меня на мысль, что это очень простое решение, но я просто бьюсь головой о стену. По сути, все, что я пытаюсь сделать, это создать представление, которое получает главное окно как подпредставление. Я знаю, что если self.view не определен, то должен вызываться метод loadView, и там все должно быть настроено. Вот текущее состояние моего кода:

Делегат:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    StartMenuViewController *aViewController = [[StartMenuViewController alloc] init];
    self.myViewController = aViewController;
    [aViewController release];

    UIView *controllersView = [myViewController view];

    window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    [window setBackgroundColor:[UIColor redColor]];

    [window addSubview:controllersView];
    [window makeKeyAndVisible];
}

Контроллер вида:

- (id)init {
    if (self = [super init]) {
        self.title = @"Start Menu";
    }
    return self;
}

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    UIView *startView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    [startView setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];
    [startView setBackgroundColor:[UIColor greenColor]];
    self.view = startView;
    [startView release];
}

Заранее спасибо за помощь!

Ответы [ 5 ]

9 голосов
/ 13 марта 2009

Вы уверены, что наследуете от UIViewController и не перекрываете реализацию представления - (UIView *)?

РЕДАКТИРОВАТЬ: Больше информации:

UIViewController имеет специальную реализацию сообщения «- (UIView *) view», поэтому при его вызове вызывается метод loadView, если переменная-член view не установлена. Таким образом, если вы предоставите реализацию «- (id) view» в своем подклассе (или свойство с именем view), это прервет автоматический вызов «- loadView».

1 голос
/ 11 декабря 2013

viewDidLoad, только если представление разархивировано из пера, метод вызывается после установки представления.

loadView вызывается только в том случае, если для свойства представления нет. использовать при создании представлений программно. по умолчанию: создать объект UIView без подпредставлений.

  • (void) loadView { UIView * view = [[UIView alloc] initWithFrame: [UIScreen В начало] .applicationFrame]; [view setBackgroundColor: _color]; self.view = вид; [посмотреть релиз]; }

    Реализуя метод loadView, вы подключаетесь к поведению управления памятью по умолчанию. Если памяти мало, контроллер представления может получить сообщение didReceiveMemoryWarning. Реализация по умолчанию проверяет, используется ли представление. Если его представление не находится в иерархии представления, и контроллер представления реализует метод loadView, его представление освобождается. Позже, когда требуется представление, вызывается метод loadView. снова, чтобы создать вид.

1 голос
/ 03 сентября 2009

Просто для того, чтобы задокументировать случай «loadView не вызывается»:

Я написал 2 UITableViewController (ов) для обработки подробных данных для главного ViewController. Поскольку дьявол был в # 2, я сделал простой UITableViewController для # 1 и сослался на него в XIB для «главного» ViewController.

Когда я закончил с # 2, я мог просто скопировать код в # 1, удалить сложный код и продолжить жизнь.

Но, к моему ужасу и нескольким дням работы, независимо от того, что я делал, viewLoad не вызывали для моего простого # 1 UITableViewController.

Сегодня я наконец понял, что ссылаюсь на UITableViewController в XIB на главную программу ViewController. - и, конечно, loadView никогда не вызывался.

Просто чтобы помочь другому придурку, совершившему ту же ошибку ...

С наилучшими пожеланиями, Charles

0 голосов
/ 13 марта 2009

Если я не читаю это неправильно, вы не ассоциировали никакое представление со свойством view контроллера, как это

myViewController.view = controllersView;

Итак, что касается Какао, то представление, которое вы устанавливаете в окне, не имеет контроллера для вызова loadView. loadView - это контроллер View, а не view, метод. Представление, которое вы назначаете окну, не связано ни с одним контроллером представления. Таким образом, метод loadView контроллера представления никогда не вызывается. Возьми? Представление, которое вы пытаетесь отобразить, не имеет связанного с ним контроллера представления.

Когда вы используете конструктор интерфейса для создания представлений, вы можете связать объект UIView, который вы создали в IB, со свойством представления в контроллере в IB, который автоматически создается средой

Но если в IB не сделано, вы должны установить его

0 голосов
/ 13 марта 2009

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

Если вы создадите новый проект в XCode, вы сможете выбрать один из множества предопределенных шаблонов iPhone, которые поставляются со всеми настройками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...