Xcode: просмотр входа в систему в приложенииDidBecomeActive

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

Поэтому я должен выполнить этот процесс в методе applicationDidBecomeActive :

 - (void)applicationDidBecomeActive:(UIApplication *)application { if ( ... ) { // if the user needs to login PasswordViewController *passwordView = [[PasswordViewController alloc] init]; UIViewController *myView = self.window.rootViewController; [myView presentModalViewController:passwordView animated:NO]; } } 

В какой-то степени это работает – я могу вызвать метод в viewDidAppear который отображает представление предупреждения, позволяющее пользователю войти в систему. Однако это нежелательно, и я хотел бы иметь текстовое поле входа и другие элементы ui. Если я не вызываю свой метод входа в систему, ничего не происходит, и экран остается черным, даже если я помещу ярлык и другие элементы в представлении.

Кто-нибудь знает, как это решить? Мой код доступа встраивается в контроллер навигации, но отключается от основной раскадровки.

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

Во-первых, мое представление пароля встроено в контроллер навигации (Editor -> Embed In), и это связано с главным контроллером панели вкладок с использованием модального сегмента с идентификатором, в моем случае «loginModal».

В методе applicationDidBecomeActive добавьте что-то вроде этого:

 [self performSelector:@selector(requestPasscode) withObject:nil afterDelay:0.2f]; 

Затем добавьте эту функцию в делегат приложения

 -(void)requestPasscode{ if ( /* If the user needs to login */ ) { [self.window.rootViewController performSegueWithIdentifier:@"loginModal" sender:self]; } } 

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

ПРИМЕЧАНИЕ . Вышеуказанная строка не будет работать, если корень вашего приложения встроен в контроллер навигации.

Есть, однако, две ошибки;

  1. Если пользователь ранее просматривал модальное представление, когда они отклоняли приложение
  2. Если пользователь отклонил приложение в режиме просмотра паролей.

Оба из них приводят к сбою приложения, поэтому следующая строка идет в методе applicationWillResignActive .

 [self.window.rootViewController dismissViewControllerAnimated:NO completion:nil]; 

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

Вы должны запустить диспетчер просмотра PasswordViewController PasswordViewController из xib или если вы храните пользовательский интерфейс в Storyboard, вы должны использовать Segue для представления этого контроллера.

Я не могу сказать о других частях, но эта часть мне кажется очень странной.

Мой код доступа встраивается в контроллер навигации, но отключается от основной раскадровки.

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

Если мы идем по пути, нет никакой разницы в загрузке PasswordViewController в applicationDidBecomeActive или на вашем первом контроллере представления на Storyboards, потому что вы вызываете текущий контроллер представления из первого загруженного контроллера представления. Таким образом, вы можете сделать это в своем первом контроллере. Кроме того, вы можете сохранить скрытый вид внутри вашего первого диспетчера представлений и показать это представление, если пользователю нужно войти в систему.

Я протестировал его. Поэтому сначала ваш контроллер загружается, а затем вы получаете метод applicationDidBecomeActive . Так что лучше поместить свой код внутрь -(void)viewDidAppear:animated метод вашего первого диспетчера представлений.

С наилучшими пожеланиями, Данил

Interesting Posts

Наблюдение UITextField.editing с помощью RxSwift

oauth_signature не соответствует ожидаемому значению oAuth Tumblr Request_Token URL

UINavigationBar скрывается в statusBar

viewDidLoad, вызываемый перед завершением подготовкиForSegue

смените подставку с пользовательским изображением и текстом

Как отключить увольнение ViewController при удалении слева направо?

iOS показывает полный экран UIImage с масштабированием (щепоткой и двойным нажатием)

NSURLConnection sendSynchronousRequest / sendAsynchronousRequest завершается после приложения, убитого iOS

watchOS2 как установить значок настроек компаньона

добавьте UIImageView, который охватывает панель навигации

Как отладить и разрешить сбой в AFNetworking

Получить массив значений свойств из массива объектов

UIKeyCommand с модификатором не будет распознаваться при первом вызове

«Произошла ошибка SSL и невозможно создать безопасное соединение с сервером».

Можно ли назвать release в объекте Objective C?

Давайте будем гением компьютера.