установить свойство представления в UIViewController из NIB программно (не во время инициализации) - PullRequest
0 голосов
/ 14 февраля 2009

В начале моего приложения я инициализирую UIViewController с NIB.

В какой-то момент я удаляю вид с экрана, затем освобождаю его, чтобы он больше не занимал память. (На этом этапе я также сохраняю состояние представления в UIViewController)

Позже я хочу воссоздать вид и вернуть его на экран. Я тогда восстановлю его состояние. (Используя тот же UIViewController, а не новый, поскольку он сохранил состояние)

Мой вопрос: когда я воссоздаю вид, как мне это сделать из NIB, или это невозможно?

Для меня очевидные лекарства:

  1. Не сохранять состояние в контроллере UIView (где соглашение требует, чтобы я сохранял состояние?)

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

  3. Не загружайте мое представление из NIB, создавайте программно (кажется, противоречит использованию IB для всего)

Примечание: Я не использую UINavigationController, я сам занимаюсь обменом мнениями, поскольку их всего 2.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2009

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

Возможно, вы сможете заархивировать его, а затем превратить его обратно в объект, но это похоже на несоответствующее решение. IB не позволяет динамически создавать элементы управления во время выполнения, даже если они раньше существовали, но больше не делают. Нет ничего постыдного в том, чтобы оставить IB из цикла для этого. На самом деле это, вероятно, хорошая идея.


OR

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

self.otherController = [[OtherController alloc] initWithNibName:@"Other" bundle:nil];
[self.view addSubview:otherController.view];
0 голосов
/ 14 февраля 2009

Не создавайте контроллер представления и представление в одном и том же файле пера; или создайте контроллер в коде или поместите представление в отдельный файл пера. Если вы позже обнуляете свойство view вашего контроллера, контроллер должен воссоздать представление.

Но почему вы так беспокоитесь об этом? Уже есть механизм для автоматического освобождения просмотра, если у вас мало памяти: предупреждение о нехватке памяти. Он будет уничтожать и воссоздавать вид только в том случае, если это действительно необходимо, и он встроен в систему, поэтому вам не нужно ничего делать. Помните поговорку о преждевременной оптимизации?

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