Сложность с pushViewController, нажимающим два уровня одновременно

У меня есть список элементов в одном контроллере представления. Я могу выбрать элемент, и контроллер подробного представления нажимает, чтобы показать детали выбранного элемента. Затем я могу выбрать кнопку редактирования (на панели навигации), и контроллер представления редактирования нажимается, чтобы позволить мне редактировать детали элемента. Все это работает, включая отмену и отмену.

В первом контроллере представления списка у меня также есть кнопка добавления (на панели навигации), где я могу добавить новую запись. (Это использует основные данные, но я не думаю, что это имеет отношение к моему вопросу.) Я начал тестирование, создав пустую запись для элемента, и когда появляется контроллер подробного представления, все поля пусты. Затем я могу нажать кнопку редактирования и отредактировать детали, как если бы это была уже заполненная запись. Это также работает.

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

У меня проблемы с этим.

Я попробовал два нажатия в контроллере представления списка, например:

- (void) add {
    clientInfoTVC.clientMO = [self createNewClient];
    [self.navigationController pushViewController:clientInfoTVC animated:YES]; 
    [self.navigationController pushViewController:clientInfoTVC.clientEditTVC animated:YES]; 
}

где clientInfoTVC.clientEditTVC указывает на контроллер представления eidt. Эта ошибка SIGABRT и останавливается, когда я пытаюсь добавить.

Затем я попытался установить значение свойства флага в контроллере подробного представления, когда выбрано добавление, перед первым нажатием, а затем выполнить второе нажатие в viewWillAppear контроллера подробного представления. Это ошибки. Я попытался переместить второй толчок в viewDidAppear контроллера подробного представления с теми же результатами.

Я потерян на этом. Может ли кто-нибудь дать мне несколько идей, как передать один контроллер представления второму, чтобы я мог поддерживать стек навигации и возвращаться к среднему контроллеру представления?


@ljkyser попал в часть ответа. Но я также обнаружил, что простое помещение представления в стек не приводит к выполнению его функций init, viewWillAppear и viewDidLoad. Я предполагаю, что, поскольку все это происходит в основном потоке, то нажатие представления просто ставит в очередь этот контроллер представления в цикле выполнения. Нажатие второго контроллера представления удаляет первый из цикла выполнения и помещает второй контроллер представления в очередь цикла выполнения. Может быть, кто-то сможет это проверить и описать точнее, чем я только что.

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

- (void) add {    
    Client *clientNew = [[NSEntityDescription alloc]  init];
    clientNew = [self createNewClient];
    clientInfoTVC.clientMO = clientNew;
    clientEditTVC.clientMO = clientNew;
    [clientNew release];
    [self.navigationController pushViewController:clientInfoTVC animated:NO]; 
    [self.navigationController pushViewController:clientEditTVC animated:YES]; 
}

Подтверждая ответ, данный @ljkyser, я попробовал эти изменения, сохранив первую анимацию: ДА. При этом панель навигации выглядела правильно, но остальная часть представления была не синхронизирована. Установка анимированного: NO устранила эту проблему.


person Jim    schedule 27.04.2011    source источник


Ответы (1)


Попробуйте изменить свой код на это:

- (void) add {
    clientInfoTVC.clientMO = [self createNewClient];
    [self.navigationController pushViewController:clientInfoTVC animated:NO]; 
    [self.navigationController pushViewController:clientInfoTVC.clientEditTVC animated:YES];
}

Установка первого анимированного параметра pushViewController в NO.

Аналогично этому вопросу SO: Проблема с переносом нескольких контроллеров представления на контроллер навигации стек

Есть и другие варианты. При желании вы можете нажимать и выталкивать определенные контроллеры представления (ссылка на UINavigationController) или отредактируйте стек UINavigationController напрямую (см. здесь).

person ljkyser    schedule 27.04.2011
comment
благодаря. Ваш ответ полезен. Но я также обнаружил еще одну проблему, и я предоставил подробности в редактировании выше (под строкой). - person Jim; 27.04.2011