Можете ли вы поменять файл NIB на UIViewController, который уже находится на экране? - PullRequest
0 голосов
/ 07 января 2010

Например:

  1. Создайте новый UIVC, используя initWithNibName, используя "nib-v1"
  2. Покажите это, например, используя [(UINavigationController) nav pushViewController: myVC]
  3. Измените NIB, который использует myVC, на "nib-v2"

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

Например, большинство ваших страниц являются текстовыми, но на некоторых из них также есть изображение (вспомните о программе чтения RSS, где некоторые записи RSS имеют текст + изображение, а некоторые - только текст).

Я имел дело с этим ранее, имея один NIB-файл со вторым, невидимым, именованным экземпляром UIView, который я наложил поверх первого и включал / выключал в зависимости от контекста, используя «скрытый» флаг.

Но это явно не так и тратит память.

Однако я не вижу очевидного способа «перезагрузить» представление из файла NIB. Я предполагаю, что хочу как-то воспроизвести магию, которую делает initWithNibName?

Я подозреваю, что это возможно, но я уверен, что если вы сделаете это "неправильным образом", приложение просто ужасно рухнет.

Ответы [ 5 ]

7 голосов
/ 15 сентября 2011

Вы всегда можете выполнить

[[NSBundle mainBundle] loadNibNamed:@"FileName" owner:viewController options:nil]];

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

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

4 голосов
/ 15 сентября 2011

Вам следует проверить класс UINib, чтобы увидеть, выполняет ли он то, что вы хотите. Это позволит вам загрузить файл пера и сохранить его в памяти.

Но просто для уточнения: Вы хотите изменить сам файл nib ? Или вы хотите изменить содержимое файла пера, когда он был загружен в память?

Вдобавок ко всему, первый будет довольно трудным (вы не можете изменить исходный файл, поскольку он является частью пакета приложения ... возможно, вы скопируете его в папку «Документы» и напишите свой собственный кодер / декодер). ?) Второе легче, но я не уверен, в чем причина? Почему бы просто не изменить viewController / view после его загрузки (например, в awakeFromNib) и, если вы хотите, чтобы эти изменения сохранялись, сохранить эти изменения в файле впоследствии.

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

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

Я согласен с Робом, но если вы действительно хотите возиться со сменой пера (что плохо, так как может легко привести к висящим указателям и т. П.), Вы можете загрузить представление из нового пера с помощью NSBundle ' s - (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options метод и сделайте вид, меняя местами.

Вы должны использовать разные контроллеры представления для разных типов контента. Если они отличаются незначительно, вы все равно можете рассмотреть возможность создания одного базового класса и создания подклассов различных вариантов.

0 голосов
/ 04 апреля 2012

Я искал ответ на ту же проблему и в итоге решил ее так:

UIViewController* ctrler = [[UIViewController alloc] initWithNibName:@"NewControllerNIB" bundle:nil];

// Replace previous controller with the new one
UINavigationController* nav = self.navigationController;
[nav popViewControllerAnimated:NO];
[nav pushViewController:ctrler animated:NO];

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

0 голосов
/ 07 января 2010

Вы не должны изменять, какой файл NIB использует UIViewController. Присоединение NIB к UIViewController должно быть одноразовым событием. Скрытые виды в порядке; они, конечно, не совсем не правы. Вы также можете программно добавить элементы представления после загрузки. Если вы делаете это много, вы можете полностью пропустить NIB и программно построить представление в -loadView. Все это хорошо, но не переключайте NIB после инициализации. Я даже не рекомендую иметь несколько NIB, которые вы выбираете для данного класса UIViewController; это просто слишком запутанно. Обычно каждый NIB должен отображаться в выделенный класс UIViewController с очень похожим (или идентичным) именем.

В соответствующей заметке я рекомендую переместить имя NIB в UIViewController, как описано в более ранней публикации .

...