Просто для изучения некоторых аспектов xCode я создаю простое приложение с 2 функциональными контроллерами. Каждый из них содержит кнопку, которая может быть нажата для переключения на другую. Я не использую segues. Я использую указатели, извлеченные из делегата приложения.просмотр контроллеров: презентация, увольнение
визуальная иллюстрация (нажмите для более высокого разрешения):
Когда приложение загружает контроллер вида корня представляет вид 1. При нажатии кнопки «переключатель для просмотра 2,» следующий код вызывает вид-появляться :
- (IBAction)buttonPressed:(id)sender
{
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[self presentViewController:appDelegate.view2 animated:YES completion:nil];
}
Пока что так хорошо.
Но при нажатии кнопки «переключатель для просмотра 1» на второй взгляд, это тот же самый код (вместо «view2» с «view1») дает следующее сообщение об ошибке:
Применение пытались представить модально активный контроллер.
Итак, подведем итог (где -> = подарки), мы имеем корень -> view1 -> view2 -x-> view1
Я не забочусь о сохранении истории о том, кто представляет кого. Я просто хочу, чтобы кнопки отображали верхний (видимый) ранее отображаемый контроллер представлений, сохраняя состояние его представлений.
Было бы неплохо знать следующее:
Есть обходной путь, который позволил бы мне достичь намеченного поведения, используя presentViewController? Например, корень -> вид2 -> вид1
Какие другие методы были бы более практичными для достижения желаемого поведения? Он/они должны использовать делегат приложения, потому что в моем реальном приложении это неизбежно.
Я нарушаю правила, пытаясь установить контроллер сверху, не интегрируя его в какую-то более крупную архитектуру? Например, это поведение, которое, как предполагается, должно обрабатывать навигаторы и нажатие/выскакивание? Если да, можете ли вы объяснить, почему xCode не хочет, чтобы я это делал? Почему я не могу просто отобразить любой контроллер вида, который я хочу, без необходимости иметь какое-либо отношение к другим контроллерам представлений? (Может быть, потому что это может привести к злоупотреблению делегатом приложения?)
Что это означает «представить» контроллер вида? Какие функциональные ограничения или возможности он влечет за собой создание указателей между презентацией и презентатором? Какова важность того, чтобы оставить контроллер представления «активным»?
Если вместо этого сделать кнопку в представлении1, отправьте сообщение
presentViewController
в корневой вид (который, я надеюсь, просто изменит цепочку представлений от root -> view1 до root -> view2, оставив view1 все еще существующим в памяти, но не часть этой цепочки), я получаю другую ошибку: «Попытайтесь представить, чья точка зрения не в иерархии окон!» Что это значит? Я не могу найти объяснение иерархии окон.
Хорошо, я знаю, что я много прошу здесь, но любое количество просвещения будет принята с благодарностью!
Спасибо, спасибо. Понял. Примеры кода и явные ссылки на имена свойств/методов настолько полезны. – mkc842
Однако есть сбой - что-то о попытке отображения viewControllers в слишком быстрой последовательности. Нажатие «для просмотра 2» запускает анимацию, но остается на вид 1. Сообщение об увольнении дает следующее: «Неуравновешенные вызовы для перехода на начало/конец перехода для». Сообщение презентации дает следующее: «Предупреждение: попытайтесь представить в во время презентации!" –
mkc842
@ mkc842 - Мое решение должно (отлично) работать как с анимацией, так и с анимацией. Попробуйте запустить с анимацией, установленной в НЕТ, посмотрите, какое сообщение вы получите. Проверьте код, чтобы убедиться, что ничего не запускается, когда вы нажимаете кнопки «Просмотреть ...». Пройдите код в отладчике, чтобы увидеть, где именно происходит ошибка. Если вы все еще застряли, отправляйте точное сообщение об ошибке здесь. – foundry