iphone, понимание контроллера представления, presentModalViewController - PullRequest
0 голосов
/ 19 ноября 2010


Спасибо за вашу помощь, как обычно, я ищу дополнительную информацию ...

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

View Controller загружается из View A с использованием presentModalViewController - и загружает View B оттуда - также отлично работает, но у меня есть некоторые неприятные вопросы ...

View A содержит таблицу, которая детализируется до ViewB, и я могу вернуться к просмотру A usig dismissModalViewController, но, вернувшись в представление A, я не могу получить доступ к таблице в представлении A.

Что происходит с элементами управления / переменными в представлении A при нажатии на представление B?вызывается dealloc, когда вызывается View B?Если я хочу получить доступ к элементам управления / переменным, когда View B закрывается и View A возвращается в поле зрения, что мне нужно сделать?

Есть ли какая-нибудь статья, которая может рассказать об этом?Любая помощь высоко ценится

Для повторного выполнения

  • View Controller запускает страницу из View x
  • View X загружает - View A с таблицей в представлениес использованием presentModalViewController
  • таблица освобождается в dealloc представления View A
  • Представление B загружается нормально, работает нормально - отклонение контроллеров представления B возвращает к Представлению A
  • На этом этапе яхотел бы перезагрузить таблицу в представлении А, как только она вернется на экран

Я почти уверен, что есть много других коллег, которые находятся в такой ситуации

Вотмой код, в битах и ​​кусочках

startPage - (это домашняя страница приложения) с кнопкой «Пуск», содержит

 View Controller -> View

. При нажатии кнопки «Пуск» загружается контроллер представления с именем ViewA(View Controller -> View) со следующим кодом

UIViewController *viewA= [[viewA alloc] initWithNibName:@"viewA" bundle:nil];
viewA.modalTransitionStyle=UIModalTransitionStyleCoverVertical;
[naviControl presentModalViewController:viewA animated:YES];    
[viewA release];   

При выборе строки таблицы в ViewA, другой ViewController ViewB (View Controller -> View) вызывается с следующим кодом

UIViewController *viewB= [[viewB alloc] initWithNibName:@"viewB" bundle:nil];
viewB=UIModalTransitionStyleCoverVertical;
[self viewB animated:YES];

ViewB закрывается, а VIewA отображается с кодом

[self dismissModalViewControllerAnimated:YES];

В этот момент, при использовании некоторых NSLogs, когда ViewB закрывается, для ViewA вызывается только viewWillAppear, а не viewDidLoad и если iпопробуйте перезагрузить данные в таблице в ViewA, приложение аварийно завершает работу с EXC_BAD_ACCESS

Спасибо Veeru

Ответы [ 2 ]

0 голосов
/ 22 ноября 2010

Прежде всего, пожалуйста, исправьте следующее утверждение:

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

до

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

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

  1. когда вы выделяете контроллер представления, в памяти запускается экземпляр с сохраняемым счетчиком 1,
  2. когда вы нажимаете или представляете этот контроллер вида на экране, тогда его счетчик сохранения становится равным 2, поскольку теперь другой экземпляр, либо контроллер навигации, либо контроллер представления, использует ваш экземпляр,
  3. затем вы отпускаете его, это заставляет снова сохранять счетчик экземпляра вашего контроллера представления до 1, то есть уменьшается на 1 (вы должны знать, что когда счетчик сохранения станет равным 0, только он будет освобожден из памяти).
  4. затем вы вызвали другой контроллер представления поверх этого текущего контроллера представления, который заставляет его работать в фоновом режиме, и поскольку вы не сохранили экземпляр явно, он освобождается вашим навигационным контроллером или контроллером представления, в который вы добавили, поэтому его счетчик хранения становится равным 0, следовательно, освобождается из памяти.
  5. поэтому, когда вы пытаетесь перезагрузить просмотр таблицы, он дает вам EXC_BAD_ACCESS, когда вы пытаетесь использовать экземпляр, который уже освобожден.

Решение:

  1. Если вы пытаетесь использовать несколько экранов навигации в своем приложении, вам следует использовать только метод pushViewController UINavigationController, который хранит экземпляры viewcontroller до тех пор, пока вы не освободите их явно.

  2. Также будьте осторожны с использованием локальных экземпляров или экземпляров объектов и их счетчика сохранности, отслеживайте выделение и освобождайте, т.е. сохраняйте счетчик, он не должен быть 0, если вы не хотите их.

Надеюсь, это поможет ...

0 голосов
/ 19 ноября 2010

Когда вы представляете ViewController (VC) B как модальный из VC A, он не должен освобождать ни одну из переменных VC A (если, возможно, не отправлено предупреждение памяти). Если вы хотите перезагрузить данные таблицы, которые находятся в VC A, при отклонении B, тогда вы можете использовать [UITableView reloadData]. Вы должны вызывать это из метода viewDidAppear, так как он будет вызываться каждый раз, когда представление возвращается на экран. Надеюсь, это поможет!

ps .. замените UITableView на соответствующую таблицу для перезагрузки.

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