Как реализовать автоматический переход на страницу с подробным описанием, если пользователь уже занимался этим ранее (или исправить мой код для этого, который имеет недостаток дизайна) - PullRequest
3 голосов
/ 05 июня 2011

Любой совет, как решить эту проблему, которая у меня есть, или, возможно, лучший дизайн реализации?

Требование

  • Необходим способ для приложения вначать, чтобы перевести пользователя на предыдущую страницу сведений, если это было то, чем он занимался до выхода из приложения в своем последнем сеансе
  • Если они были на главном экране приложения, то при перезапуске они могутостаться здесь
  • Предполагается, что я работаю с UINavigationController, а главный экран и подробный экран построены на UITableViewController

Моя концепция реализации

  • Поставьте галочку в "viewdidLoad", чтобы увидеть, были ли они на подробном экране, а затем, если это так, перейдите к этому (см. Код ниже)

Issue

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

Мой анализ

  • Из того, что я вижу, когда я нахожусь на странице сведений (assignmentsListController) и вызываю предупреждение памяти в симуляторе, я вижу:

    (a) на самом деле вызывается главная страница "viewDidLoad", котораяКонцепция не ожидала, поэтому, пока я нажал кнопку НАЗАД из подробного представления (UINavigationController), чтобы перейти к основному представлению (RootViewController), фактически мой код выполняется, и он пытается отбросить пользователя обратно на страницу сведений снова

    (b) Я отмечаю в своих журналах после этого момента, что [AppointmentListController viewDidLoad], кажется, вызывается до вызова предыдущего метода ApplocmentListController dealloc (т.е., как я был в контроллере A, вернулся к контроллеру B, нобыл отброшен назад к A - и начальная сделка для первой части не началась до поздна ...)

  • Так что я думаю, это obvioнам моя идея не слишком велика

Вопрос

Есть предложения о том, как лучше реализовать мое требование?(как проверить, в какой метод их положить)

Код

- (void)viewDidLoad {
    [super viewDidLoad];

    // My Implementation of the Requirements which seems flawed in the case there is memory warning triggered 
    if ( previousSelectedScreen >= 0 ) {

        // Setup New Controller
        AppointmentListController *appointmentListController = [[AppointmentListController alloc] initWithNibName:@"AppointmentListController" bundle:nil];
        appointmentListController.screenToShow = previousSelectedScreen;

        // Push new view onto stack
        [[self navigationController] pushViewController:appointmentListController animated:NO];
        [appointmentListController release]; 
    } 

}

1 Ответ

2 голосов
/ 05 июня 2011

Вот что я бы посоветовал: вместо того, чтобы иметь эту логику в вашем контроллере представления, а в делегате вашего приложения. Создавая свой стек навигации перед его отображением, мы надеемся избежать некоторых странных вещей, которые могут случиться с навигационными панелями и т. Д. Чтобы избавиться от предупреждений о памяти, вам может понадобиться посмотреть, как ваше приложение распределяет память: это не обязательно делать с этим.

В любом случае - в вашем делегате приложения вы можете выполнить проверку, чтобы увидеть, был ли пользователь на странице сведений, когда он выходил. Если это так, вы можете создать массив, содержащий стек навигации (т. Е. Главный экран -> Страница сведений). Затем вы можете передать это в контроллер навигации, используя метод setViewControllers. Как только это будет сделано, вы можете отобразить свое окно и завершить запуск приложения.

...