У меня есть три контроллера представления: VC1, VC2 и VC3, экземпляры которых создаются при запуске приложения. Я хочу представить их модально в цикле, вот так:
VC1 -> VC2 -> VC3 -> VC1
На каждом контроллере представления я представляю следующий контроллер представления следующим образом:
[self presentModalViewController:nextViewController animated:TRUE];
Проблема в том, что когда я выполняю эту строку из VC3 для повторного представления первого контроллера представления VC1, приложение зависает и полностью перестает отвечать на запросы. Как только эта строка будет выполнена, я увижу, как загрузка процессора Xcode подскочила с 0% до 99%, а объем памяти — с 20 МБ до 1 ГБ. Я не могу даже приостановить выполнение с помощью отладчика, могу только выйти из процесса. В консоли ошибок тоже нет.
В моем проекте больше ничего нет, это всего лишь три контроллера представления, каждый из которых имеет кнопку для представления следующего контроллера представления в цикле.
Этот процесс навигации не поддерживается системой или я делаю что-то неправильно?
Я попробовал сделать то же самое, используя переходы в раскадровке, и это отлично сработало. Но мне нужно понять, почему это не работает с помощью UIViewController.presentModalViewController.
По сути, это код для каждого контроллера представления:
#import "VC2.h"
@implementation VC2
- (IBAction)onNextButtonClicked:(id)sender {
[self presentModalViewController:_nextViewController animated:TRUE];
}
@end





В вашем сообщении не хватает некоторых подробностей, однако...
Я предполагаю, что у вас есть такая настройка раскадровки/сегов:
Это «работает» — ну, оно не дает сбоя (сразу) — потому что каждая кнопка представляет новый экземпляр следующего контроллера представления.
Если вы прокрутите три «настоящих» сегмента пару раз, а затем перейдете в иерархию представления отладки, это будет выглядеть примерно так:
Когда вы пытаетесь сделать это с помощью кода, вы заявили:
«VC1, VC2 и VC3, экземпляры которых создаются при запуске приложения»
Итак, допустим, у вас есть _vc1, _vc2 и _vc3, и вы представляете _vc1.
_vc1 затем представляет _vc2, который представляет _vc3, который затем пытается представить _vc1. Но этот экземпляр _vc1 уже находится в иерархии представлений, представляя _vc2 представляя _vc3... и в итоге вы получаете (фактически) бесконечный цикл.
«Карусель подарков» — это немного необычный интерфейс... но если ваша цель именно такая, вам придется пойти другим путем.
Одним из вариантов было бы представить один контроллер представления, который создавал бы экземпляры и загружал 3 VC в качестве дочерних контроллеров представления.
Представление каждого ребенка будет наложено. Если вы хотите перейти от VC1 к VC2, вы можете смоделировать презентацию следующим образом:
Если вам интересно, я разместил здесь краткий пример такого подхода: https://github.com/DonMag/PresentCarousel
Да, именно так была устроена моя Раскадровка. Спасибо за подробное объяснение, это тот ответ, который я искал.