У меня есть список элементов в одном контроллере представления. Я могу выбрать элемент, и контроллер подробного представления нажимает, чтобы показать детали выбранного элемента. Затем я могу выбрать кнопку редактирования (на панели навигации), и контроллер представления редактирования нажимается, чтобы позволить мне редактировать детали элемента. Все это работает, включая отмену и отмену.
В первом контроллере представления списка у меня также есть кнопка добавления (на панели навигации), где я могу добавить новую запись. (Это использует основные данные, но я не думаю, что это имеет отношение к моему вопросу.) Я начал тестирование, создав пустую запись для элемента, и когда появляется контроллер подробного представления, все поля пусты. Затем я могу нажать кнопку редактирования и отредактировать детали, как если бы это была уже заполненная запись. Это также работает.
То, что я пытался сделать, это выбрать кнопку добавления и нажать на контроллер подробного представления, а затем сразу же на контроллер редактирования представления. Причина, по которой я хочу сделать это, заключается в том, что когда я открываю контроллер представления редактирования, отображается контроллер подробного представления. (Затем я могу вернуться к контроллеру представления списка или снова нажать на контроллер представления редактирования.)
У меня проблемы с этим.
Я попробовал два нажатия в контроллере представления списка, например:
- (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 устранила эту проблему.