2013-11-21 4 views
0

У меня есть вид входа. Если логин успешно выполнен, я хочу свою программу, перейдите в главное окно.Программа перерывов в PerformSegueWithIdentifier для push segue

Я использовал modal segue, между именем входа и основным видом.

Однако после достижения основного вида, я хочу использовать нажимные перетекают и, к сожалению, я столкнулся следующее исключение:

Terminating app due to uncaught exception 'NSGenericException', reason: 
'Could not find a navigation controller for segue 'routeList'. 
Push segues can only be used when the source controller is managed by an 
instance of UINavigationController.' 

Вот те функции, которые я дал команду для «модального Segue» в " login controller ":

//LoginController.m 
- (IBAction)loginTapped:(id)sender { 
    [self performSegueWithIdentifier:@"login" sender:@{@"foo": @"bar"}]; 
} 

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if ([[segue identifier] isEqualToString:@"login"]) 
    { 
     MainController *vc = segue.destinationViewController; 
     vc.uuid = userUuid; 
    } 
} 

Вот функции, которые я использую для выполнения« push segue »в« основном контроллере ». Я хочу выполнить push-сегу здесь, и я столкнулся с исключением в этой части.

//MainController.m 
- (IBAction)actionGo:(id)sender { 
    [self performSegueWithIdentifier:@"routeList" sender:self]; 
} 

Фактически, у меня есть контроллер навигации до «входа в систему». Так почему же он не смог найти «навигационный контроллер»?

Если я использую modal segue, он работает. Так почему же он не работает для push segue?

Edit 1 - Мои раскадровки:

enter image description here

Edit 2 - Предлагается внедрить главный контроллер в навигационном контроллере (Нажмите на контроллер источника в Segue routeList и в меню редактора выберите Вставить в систему > Контроллер навигации). Теперь моя история доска приводится ниже, и я столкнулся с этой ошибкой в ​​настоящее время:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[UINavigationController setUuid:]: unrecognized selector sent to 
instance 0x17da9df0' 

Я передаю значение от контроллера входа к основному контроллеру. Когда я добавляю контроллер навигации, я не мог передать это значение. Как я могу передать это значение?

Раскадровка когда MainController встроен в контроллер навигации: enter image description here

РЕШЕНИЕ В МОИХ СЛОВ:

Благодаря людям, которые разделяют их ответы в этой теме :) Я решил проблему. В стеке контроллера навигации , если я ставлю модальный сегмент, каким-то образом ссылка сломана, а остальная часть просмотров не является частью навигационного контроллера. Итак, я сделал все сегменты как «стиль push». Тогда В MainController.m я извлекал кнопку назад следующим образом:

-(void)viewDidAppear:(BOOL)animated{ 
    [self.navigationItem setHidesBackButton:YES animated:NO]; 
} 
+0

Найти ответ здесь [ссылка] (http://stackoverflow.com/questions/15506324/ios-segue-terminating-app-due-to-uncaught-exception-nsgeneric-exception) – Greg

+0

Это не относится к меня, я добавляю снимок моей раскадровки. Как вы видите, я уже поместил свой первый указатель вида на контроллер навигационного представления. – ankakusu

+0

Спасибо, что помогли Грегу :) – ankakusu

ответ

1

Это не работает, потому что вы запуская routeList SEGUE от контроллера, который представлен модально и не содержится в навигационном контроллере.

Возможно, вы захотите поменять свою иерархию так, чтобы основной вид находился в контроллере nav, который является контроллером корневого окна окна, и экран входа в систему представлен модально (и отклоняется, когда логин завершен).


Начните с чего-то другого: удалите все модальные сегги и сделайте их толчком.Затем в главном контроллере представления введите viewDidAppear:, чтобы получить контроллер навигации и установить его контроллеры представлений только @[ self ] (что приведет к удалению контроллеров входа в систему). Это должно устранить вашу проблему.

+0

На самом деле, я изменил стиль storyBoard segue как 'push'. Почему он отклоняется после отображения экрана входа в систему? – ankakusu

+0

Изменено, что? Главная должна быть нажата, логин должен быть модальным. Вероятно, основной текст должен быть перенесен без анимации, прежде чем вход будет отклонен. – Wain

+0

В моем вопросе я добавил снимок моей раскадровки. Я выполняю push segue с кодом '[self performSegueWithIdentifier: @" routeList "отправитель: self];' как я также упомянул в своем вопросе. Как я могу нажать на нее с анимацией? – ankakusu

1

Пожалуйста, обратите внимание на следующие рекомендации, основанные на вашей ошибки:

Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'routeList'

Рекомендации

На самом деле, у меня есть навигационный контроллер перед "вид входа в систему". Так почему же он не смог найти «навигационный контроллер»?

Изображение раскадровки поможет оценить проблему. Вы можете проверить доступность контроллера навигации несколькими способами. Один из способов убедиться, что контроллер источника встроен в навигационный контроллер, - это щелкнуть по контроллеру источника списка routeList и в меню «Редактор» выбрать «Вставить»> «Навигационный контроллер»

Кстати, если я использую modal segue , оно работает. Почему он не работает для push segue?

Нажимные сегменты требуют контроллера навигации, тогда как в модальных сегментах не требуется контроллер навигации. Вот связанный вопрос, который лучше объяснит различия (stack overflow link).

UPDATE 1:

Вы упомянули, что вы хотите, чтобы передавать значения между контроллерами. На целевом VC создайте свойство для хранения UserID. На контроллере исходного кода вы хотите установить значение целевого свойства и передать данные в свой метод prepareForSegue. Вот ссылка на то, как это сделать с другого SO Q&A.

UPDATE 2

Вы упомянули, что ваши перетекает являются нажимные перетекает, но картина, показанная в этом вопросе не указывает на это ... Пожалуйста, обратите внимание на значки нажим перетекает, как указано в моем изображении ниже. Вы также захотите убедиться, что вы назовете оба ваших сходящихся сегмента. Я назвал свой маршрут push-seguesA и routeB.

converging segues

Я надеюсь, что это помогает.

+0

Я добавил снимок моей раскадровки. Я также попробовал ваше предложение и встроил главный контроллер в контроллер навигации. Теперь я сталкиваюсь с этим исключением: '*** Завершение приложения из-за неотображенного исключения 'NSInvalidArgumentException', reason: '- [UINavigationController setUuid:]: нераспознанный селектор, отправленный экземпляру 0x17da9df0'' После входа в систему я отправляю идентификатор пользователя этого пользователя к основному виду. Когда окно навигации добавляется между ними, я не мог передать эту информацию. Тогда я получаю это исключение. Что мне теперь делать? – ankakusu

+0

@ankakusu Сегмент между LoginVC и MainVC не выглядит как push-сегмент. Значит, ваш signupVC правильно перемещается, правильно? Подумайте о том, как настроить segue в MainVC на толчок и посмотреть, поможет ли это. Также см. Мое обновление для передачи значений. –

+0

Я также добавил вторую раскадровку, когда вставляю MainController в контроллер навигации. – ankakusu

Смежные вопросы