2015-01-20 2 views
0

Я работаю над приложением iOS 8, которое требует аутентификации на бэкэнд. Я хотел бы сделать приложение таким образом, что, если приложение получает ошибку HTTP 403, пользователю предоставляется экран входа в систему. После того, как контроллер экрана входа в систему успешно выполнит аутентификацию пользователя, приложение должно вернуться к предыдущему экрану (независимо от того, на каком экране он был).Навигация к предыдущей сцене на iOS 8

В Xcode 6 я вижу, что предпочтительный способ навигации между сценами - через segues. Таким образом, я с помощью перетекает перемещаться назад с экрана входа в систему, с помощью этого кода:

[self performSegueWithIdentifier:@"UnwindToNewsfeed" sender:self]; 

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

Я новичок в iOS8 и для программирования на iPhone в целом, так что может случиться так, что у меня нет понятий навигации на iOS 8 совершенно ясно, и я использую неправильный подход.

ответ

1

Unwind segues отличаются друг от друга в направлении вперед, и это упрощает поддержку функций, которые вы используете.

Перед созданием разматывающего сегмента вам нужно добавить метод к контроллеру представления, к которому вы хотите расслабиться. Например -

- (IBAction)unwindFromLogin:(UIStoryboardSegue*)sender { 
} 

Вы можете создать разматывания SEGUE по Ctrl-волоча между объектом в сцене (или объект UIViewController для вашей сцены, если вы хотите, чтобы вызвать раскрутку с performSegueWithIdentifier) и значок выхода на в нижней части экрана. Затем Interface Builder отобразит список найденных методов, которые соответствуют указанной выше сигнатуре (так что он отобразит unwindFromLogin:). Вы можете дать этому segue идентификатор, чтобы вы могли вызывать его с помощью performSegueWithIdentifier, как вы обычно это делали. Все идет нормально.

Теперь, для умных бит. Во время выполнения, когда вызывается развязка segue, iOS просматривает текущий стек контроллера представления, чтобы найти первый контроллер представлений, который реализует номинированный метод, поэтому, если вы реализуете тот же метод в каждом из ваших контроллеров просмотра, ваше окно входа в систему будет контроллер просмотра, из которого он пришел, и вам нужно всего лишь один сеанс размотки в вашей контрольной точке входа в систему.

У Apple есть хороший Tech Note, который описывает процесс размотки более подробно и как его можно настроить, реализуя дополнительные методы в вашем подклассе UIViewController, но реализация по умолчанию должна соответствовать вашим потребностям.

Если вы не хотите, чтобы создать SEGUE от каждого контроллера представления источника в контроллер представления Логина Вы можете представить его непосредственно, используя что-то вроде -

LoginViewController *loginVC=(LoginViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"loginVC"]; 
[self presentViewController:loginVC animated:YES completion:nil]; 

Вы все еще можете использовать разматывание SEGUE, чтобы вернуться

+0

Благодарим вас за всесторонние ответы. Что еще не хватает в головоломке, как мне реализовать навигацию с каждого экрана в сторону экрана входа? Должен ли я создавать segues в IB со всех сцен в сценарий входа в систему, или есть более простой, программный способ создания такого поведения в сценах? –

1

Я не думаю, что использование segues - это всегда лучший подход. В таком случае лучше использовать -popToViewController:animated:.

Это может быть полезно, если вы хотите расслабиться. Я бы рекомендовал создать настраиваемый контроллер представлений, который подклассы UIViewController. Этот контроллер просмотра реализует ваш метод -unwindXXX:.

@interface MYBaseViewController : UIViewController 
- (IBAction)unwindXXX:(UIStoryboardSegue *)sender; 
… 
@end 

Имейте все контроллеры представлений, которые могут быть отключены от контроллера входа в систему наследуют этот настраиваемый контроллер представлений.

@interface MYNewsFeedViewController : MYBaseViewController 
… 
@end 
0

Я считаю, что два ответа ниже, чтобы быть действительными, и я проголосовал за них обоих.

Однако после тестирования я нашел этот подход более простым и менее громоздким для моего сценария.

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

LoginViewController *loginView = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginView"]; 
[self presentViewController:loginView animated:YES completion:nil]; 

Тогда для того, чтобы обеспечить функциональность назад навигацию необходимый после успешного пользователя проверяет подлинность на экране входа в систему, экран Логин вызывает этот метод, который возвращает к отрывками сцены:

[self dismissViewControllerAnimated:YES completion:nil]; 

Как я новичок в IOS разработчика, я не уверен, если это следующая рекомендуемая практика, поэтому я как люди комментировать w hether это рекомендуемый подход или нет.

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