UIViewController.presentModalViewController зависает на неопределенный срок

У меня есть три контроллера представления: 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
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем сообщении не хватает некоторых подробностей, однако...

Я предполагаю, что у вас есть такая настройка раскадровки/сегов:

Это «работает» — ну, оно не дает сбоя (сразу) — потому что каждая кнопка представляет новый экземпляр следующего контроллера представления.

Если вы прокрутите три «настоящих» сегмента пару раз, а затем перейдете в иерархию представления отладки, это будет выглядеть примерно так:

Когда вы пытаетесь сделать это с помощью кода, вы заявили:

«VC1, VC2 и VC3, экземпляры которых создаются при запуске приложения»

Итак, допустим, у вас есть _vc1, _vc2 и _vc3, и вы представляете _vc1.

_vc1 затем представляет _vc2, который представляет _vc3, который затем пытается представить _vc1. Но этот экземпляр _vc1 уже находится в иерархии представлений, представляя _vc2 представляя _vc3... и в итоге вы получаете (фактически) бесконечный цикл.

«Карусель подарков» — это немного необычный интерфейс... но если ваша цель именно такая, вам придется пойти другим путем.

Одним из вариантов было бы представить один контроллер представления, который создавал бы экземпляры и загружал 3 VC в качестве дочерних контроллеров представления.

Представление каждого ребенка будет наложено. Если вы хотите перейти от VC1 к VC2, вы можете смоделировать презентацию следующим образом:

  • выровнять верхнюю часть представления VC2 по нижней части «основного» представления
  • вывести вид VC2 на передний план
  • анимировать вид VC2 вверху

Если вам интересно, я разместил здесь краткий пример такого подхода: https://github.com/DonMag/PresentCarousel

Да, именно так была устроена моя Раскадровка. Спасибо за подробное объяснение, это тот ответ, который я искал.

wonder-mike 27.05.2024 22:05

Другие вопросы по теме