iPhone [self executeseguewithidentifier... ] не показывает новый контроллер представления
Я прошел весь стекопоток и весь Google, и я не могу понять это. Вот мой сценарий:
У меня есть "главный экран" моего приложения, где пользователь сначала принимает решение о том, что он собирается делать. Приложение работает с базой данных CoreData, которая создается путем "импорта" XML-файлов. Пользователь может выбрать открытие XML-файла, прикрепленного к электронному письму, в моем приложении, которое автоматически вызывает мой главный экран, чтобы показать и запустить импорт файла.
Я могу получить это далеко без каких-либо проблем. В моей раскадровке у меня есть экран под названием ParseSegue от моего главного экрана до контроллера представления, который будет обрабатывать синтаксический анализ и предоставлять пользователю некоторую информацию о состоянии.
Когда основной экран вызывается через приложение электронной почты, главный экран автоматически вызывает
[self performSegueWithIdentifier:@"ParseSegue" sender:self];
Затем я проверяю это имя segue в prepareForSegue, и это правильное имя. Здесь я назначаю URL файла контроллеру синтаксического анализатора, чтобы он мог анализировать правильный файл.
Проблема в том, что на самом деле этого никогда не происходит. Вызывается метод prepareForSegue, можно проверить имя "ParseSegue" и он действителен, но сам переход просто не происходит. Если я добавлю кнопку на главный экран и скажу ей выполнить переход в раскадровке, она будет работать нормально. Но программный вызов, кажется, ничего не делает.
1 ответ
Оказывается, я искал не в том месте целиком. Моя проблема заключалась в том, что в моем appDelegate, где приложение реагирует на входящий URL-адрес, я непреднамеренно создавал новый экземпляр моей раскадровки и контроллера основного представления. Это отличалось от того, который уже был активен и может или не может быть на экране.
Контроллер, который я создавал, никогда не показывался. Я заметил это только потому, что журнал:
NSLog(@"Source: %@", [segue.sourceViewController description]);
покажет разные адреса памяти для моего теста (нажатие кнопки) и теста импорта. Это заставило меня поверить, что я на самом деле работал с двумя различными экземплярами раскадровки и контроллера основного вида приложения. Спасибо Полу за предложение регистрации места назначения и контроллеров источника.