Проблемы с Push Segue

#ios #objective-c #cocoa-touch

#iOS #objective-c #cocoa-touch

Вопрос:

У меня возникла проблема, из-за которой появляется сообщение «‘Не удалось найти навигационный контроллер для segue ‘SignUpSegue’. Push-переходы могут использоваться только тогда, когда исходный контроллер управляется экземпляром UINavigationController «.

Я новичок в разработке iOS, но я провел исследование по этому вопросу, и одним из распространенных является встраивание в навигационный контроллер, что я и делаю.У меня есть контроллер начального просмотра, страница входа в систему, встроенная в навигационный контроллер, а также кнопка, которая переходит на страницу регистрации, которая нажимается. Когда пользователь входит в систему, я тестирую это, выходя из системы, и моя цель — вернуться на страницу входа. Я модально представляю страницу входа, когда пользователь выходит из системы, и страница входа отображается идеально. Я могу снова войти в систему, но если я случайно нажму «Зарегистрироваться», он обидится и отобразит ошибку. Обратите внимание, что страница регистрации работает нормально, поэтому мне любопытно, что она выдает сигнал тревоги после модального представления после выхода из системы. Все переходы озаглавлены правильно и подключены. Есть переход, соединяющий страницу входа и страницу регистрации, и переход, соединяющий страницу выхода со страницей входа.

Побочный вопрос, когда я модально представляю страницу входа в систему после выхода из системы, должен ли мой destinationviewcontroller быть видом входа в систему или контроллером навигации, в который он встроен. Я очень ценю любую помощь, и если потребуется дополнительная информация, я с радостью ее добавлю.

Вот соответствующий код для страницы входа в систему, LoginViewController

 // In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
if([segue.identifier isEqualToString:@"SignInSegue"]){
    HomeTab *logIn=[segue destinationViewController];
}
if([segue.identifier isEqualToString:@"SignUpSegue"]){
    SignUpView *signUp=[segue destinationViewController];
}
}


- (IBAction)logInUser:(id)sender {
NSLog(@"Log In Attempted");
if([self fieldsEmpty]){
    UIAlertView *signIn=[[UIAlertView alloc]initWithTitle:@"Empty Field(s)" message:@"Please make sure all fields are filled out" delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil];
    [signIn show];
}

else{
    [PFUser logInWithUsernameInBackground:UserName.text password:Password.text block:^(PFUser *user, NSError *error)
     {
         /*Successful sign in, go to home page*/
         if(!error){
             [self performSegueWithIdentifier:@"SignInSegue" sender:sender];
         }
         else{
             UIAlertView *signIn=[[UIAlertView alloc]initWithTitle:@"Fail" message:@"Your username and password failed to match.nPlease try again" delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil];
             [signIn show];
         }
     }];
}
}

- (IBAction)signUpUser:(id)sender {
[self performSegueWithIdentifier:@"SignUpSegue" sender:sender];
}
  

И вот соответствующий код при выходе из системы на другом контроллере просмотра (Settings.m)

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
if([segue.identifier isEqualToString:@"logOutSegue"]){
    LogInViewController *logIn=[segue destinationViewController];
}

}


- (IBAction)logOutCurrentUser:(id)sender {
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Are You Sure?" message:@"If you would like to log out press continue, if not press cancel" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:@"Cancel", nil];
[alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(buttonIndex==0){
    [PFUser logOut];
    [self performSegueWithIdentifier:@"logOutSegue" sender:self];
}
if(buttonIndex==1){
    return;
}
}
  

Комментарии:

1. Если вы выполняете push-переход со страницы входа на страницу регистрации, вам следует вернуться к входу с помощью popViewControllerAnimated: , а не путем представления контроллера входа. Всплывающее окно отменяет нажатие, а отклонение отменяет презентацию; эти вещи сочетаются в парах. Кроме того, никогда не возвращайтесь к контроллеру с помощью segue, если только вы не используете unwind segue; другие segues всегда создают экземпляры новых контроллеров, так что вы на самом деле не возвращаетесь назад, вы просто создаете новый экземпляр.

2. Для вашей первой ошибки, если вы используете раскадровки, вам нужно будет установить идентификатор перехода на панели свойств.

3. Так что мне понадобится unwind segue для выхода из системы. На моей странице входа в систему модально представлен домашний пользовательский интерфейс, где есть опция выхода из системы