Стратегия UINavigationController (iPhone) - PullRequest
1 голос
/ 03 марта 2010

Что-то меня озадачивает, после просмотра моего приложения с инструментами, это приложение на основе UINavigation, оно это заметило.

Каждый раз, когда происходит прикосновение к ячейке tableView, и я делаю это:

        GenericTableViewController *someViewController = [[Generic TableViewController alloc] init];    
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];

Затем я нажимаю кнопку «Назад» и смотрю в «Инструменты», чтобы увидеть, сколько существует живых экземпляров GenericTableViewController. Перед ответным касанием 1 и 0 после. Это здорово, хорошо управляет памятью с помощью UINavigationController.

Однако в других местах приложения я не использую кнопку «Назад» для выхода из вида, в некоторых viewController-ах при нажатии одной из моих пользовательских кнопок будет запускаться код, полностью аналогичный приведенному выше, но viewController, в котором я нажимал на пользовательский Кнопка, не будет выпущена.

Полагаю, я понимаю, почему навигационный контроллер выполняет оценочный вызов, что я, возможно, помещаю что-то в стек и что я вернусь позже, поэтому он сохраняет контроллер в своей памяти. Это должно означать, что нажатие кнопки «назад» использует [self.navigationController popViewController]. Хорошо.

Проблема теперь в том, что каждый раз, когда я посещаю представление, которое не осталось, используя кнопку «назад» на панели навигации, оно не будет выпущен. Распределение счетчиков в инструментах увеличивается с каждым разом, когда я посещаю вид, пока у меня не осталось 20 объектов.

Я попытался вставить [self.navigationController popViewController] в селектор для своих пользовательских кнопок. Это означает, что я вручную извлекаю видимый viewController, прежде чем помещать новый в стек. Но количество выделений не уменьшается? угадайте, что кнопка "назад" не использует эту технику в конце концов ...

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

Есть ли какой-то здравый способ сказать UINavigationController: если этот viewController находится в вашем стеке, пожалуйста, покажите его, если нет, создайте его экземпляр, нажмите на стек и отобразите его.

Проблема здесь, вероятно, заключается в том, что не вся моя навигация в NavigationController полностью линейна. Мне иногда придется выходить из стека пункт №. 2, чтобы сложить предмет №. 5, вернуться к 3 и т. Д.

Так есть ли способ сделать это, при этом UINavigationController по-прежнему должен освобождать мои viewControllers и не создавать один и тот же viewController несколько раз?

1 Ответ

3 голосов
/ 03 марта 2010

Вы можете попытаться получить доступ к свойству UINavigationController viewControllers , чтобы получить NSArray всех контроллеров представления, которые в настоящее время находятся в стеке навигации. Затем используйте containsObject: , чтобы проверить, находится ли контроллер представления в стеке.
Если это так, тогда используйте popToViewController: animated: , чтобы показать контроллер представления. Если его нет в стеке, просто используйте pushViewController: animated: . Если вам это не поможет, возможно setViewControllers: animated: - правильный метод.

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