Показывать экран входа в систему перед контроллером панели вкладок

#iphone #cocoa-touch #ios

#iPhone #cocoa-touch #iOS

Вопрос:

Я создаю приложение Twitter, и в AppDelegate -didFinishLaunchingWithOptions я использую следующий код для загрузки представления входа, если NSUserDefaults для этого объекта пусты:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

 NSString *test = [prefs objectForKey:@"username"];
if (test == @"(null)" || test == nil) {
    LoginScreenViewController *login = [[LoginScreenViewController alloc] initWithNibName:@"LoginScreenViewController" bundle:nil];
    [self.window addSubview:login.view];
    [self.window makeKeyAndVisible];

} else {
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];
}
  

И я могу загрузить представление входа в систему, но тогда как бы я его отклонил? Экран входа в систему должен отображаться до загрузки TabBarController, поэтому, когда контроллер входа в систему завершен, контроллер панели вкладок запускается так, как если бы у него не было никакого другого представления раньше. Заранее спасибо!

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

1. if (test==nil) должен быть достаточным тестом и test==@"(null)" является прямым сравнением указателей, которое будет ложным. Если вам нужно значение null, отличное от nil, используйте [NSNull null] для присваивания и сравнения.

2. Не храните учетные данные пользователя в NSUserDefaults, вам следует использовать службу keychain, если вы сохраняете учетные данные.

3. На GitHub доступна действительно хорошая оболочка сервиса Keychain с открытым исходным кодом, вот сообщение в блоге об этом. gorgando.com/blog/tag/sfhfkeychainutils Я бы рекомендовал использовать его, чтобы сократить время разработки.

Ответ №1:

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

Если пользователь не вошел в систему, вы могли бы показать свой LoginScreenViewController в качестве контроллера модального представления. Это будет располагаться над контроллером панели вкладок.

Что-то вроде

 [self.window addSubview:tabBarController.view];
[self.window makeKeyAndVisible];

NSString *test = [prefs objectForKey:@"username"];
if (test == @"(null)" || test == nil) {
    LoginScreenViewController *login = [[LoginScreenViewController alloc] initWithNibName:@"LoginScreenViewController" bundle:nil];
    [tabBarController presentModalViewController:login animated:YES];
}
  

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

1. Это работает, но TabBarController загружается перед просмотром входа в систему. Я думаю, что это можно было бы решить с помощью любого обратного вызова, чтобы узнать, было ли отклонено представление входа в систему, но я не знаю, как бы я вызвал свою функцию перезагрузки на FirstViewController, как я пытался [self.parentViewController updateStream:nil]; и [FirstViewController updateStream:nil]; (где updateStream — это IBAction), и оба дают мне SIGABRT

Ответ №2:

Я не уверен, решит ли это вашу проблему, но не используйте == для сравнения строк. Используйте compare: метод NSString класса.

 if ([myNSStringObject compare:anotherNSStringObject] == NSOrderedSame) {
   //proceed with processing based on resultant matched strings
}
else {
   //proceed with processing based on resultant non-matched strings
}
  

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

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

1. Почему даже [someString isEqualToString:anotherString]?? упрощает это еще больше

Ответ №3:

По завершении входа вызовите:

 [login.view removeFromSuperview];
[self.window addSubview:tabBarController.view];
  

В окне должно быть добавлено только одно UIView, принадлежащее UIViewController, но если вы удалите это представление, вы можете добавить другое.

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

1. Я получаю белый экран сразу после нажатия на login 🙁

Ответ №4:

вы можете представить loginview как всплывающее окно модели. это то, что я делаю.

       loginView = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];
 UINavigationController* nav = (UINavigationController*)[tabBarController.viewControllers objectAtIndex:0]; 
loginView.navC = nav; [nav presentModalViewController:loginView animated:YES];