self.view = aViewController.view vs [aViewController loadView] - - PullRequest
1 голос
/ 09 января 2010

Я пытаюсь понять поведение контроллеров представления при переключении с одного на другое (отображение разных представлений)

Часть из операторов addSubiew, которая, кажется, работает, я не могу найти объяснения тому, что происходит с двумя операторами:

self.view = someViewController.view; [someViewController loadView];

На самом деле я получил случай, когда кажется, что работает только первый (отображается представление, определенное в someViewController), а в другом случае - только второй.

Точнее, от корневого viewController.view до другого ViewController.view (уже istantiated) Я должен использовать первый, чтобы вернуться мне нужно использовать второй. Я не могу понять, в чем может быть разница в текущей ситуации, которая позволяет тому или иному утверждению работать.

Спасибо

Ответы [ 2 ]

3 голосов
/ 09 января 2010

Очень трудно даже понять твой вопрос. Но я попытаюсь ответить на него:

iPhone OS использует стек представлений и отображает первое для пользователей. Вы либо добавляете (удаляете), либо добавляете (добавляете) представления в этот стек.

Код, который вы указали, несколько "неясен". Лучшей практикой для получения контроля является добавление подвидов в ваше окно или любое другое представление

т.е. [window addSubview:viewController.view];

Не переопределяйте текущий вид, используя self.view = someViewController.view; Вместо этого инициализируйте ваш новый ViewController и добавьте его представление в подпредставление вашего текущего представления.

Есть вопросы? Просто прокомментируйте.

2 голосов
/ 09 января 2010

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

В этих двух утверждениях есть пара неправильных вещей:

self.view = someViewController.view;

Согласно документам UIViewController.view:

"Каждый объект контроллера представления является единственным владельцем своего представления. Вы не должны ассоциировать один и тот же объект представления с несколькими объектами контроллера представления." -Apple Docs

Как только эта строка кода будет выполнена, представление будет иметь 2 разных контроллера, что плохо.

Следующая строка:

[someViewController loadView];

Это плохо, потому что вы никогда не должны явно вызывать loadView.

Из документов UIViewController.loadView:

«Вы никогда не должны вызывать этот метод напрямую.»

Из документов UIViewController.view:

"Если вы обращаетесь к этому свойству и его значение в настоящее время равно nil, контроллер представления автоматически вызывает метод loadView и возвращает полученное представление."

Потратьте некоторое время на руководства и руководства ViewController, такие как «Руководство по программированию View Controller для iPhone OS». Они хорошие документы и могут многому научить.

...