#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];