我正在使用Xcode 5.1.1中的iOS简单应用程序。 我是Xcode和Objective-C的新手,所以我有一点问题。 这就是我所拥有的:
我的应用程序的想法非常简单 - 当用户第一次启动应用程序时,他会看到授权表单。当他输入他的登录名和密码并按登录时,我的应用程序向服务器发出请求,如果一切正常 - 登录和密码正确 - 应用程序保存用户登录:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:self.txtUsername.text forKey:@"SavedUserName"];
[defaults synchronize];
并打开视图,“这没关系!”。
[self performSegueWithIdentifier:@"login_success" sender:self];
授权工作很棒,用户登录保存操作系统。 但现在,当用户再次启动应用程序时,我需要打开“没关系”的视图,如果他已经授权:
- (void)viewDidLoad
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *authLogin = [defaults objectForKey:@"SavedUserName"];
if(![authLogin isEqualToString:@""]){
//I think here application must load view with "It's OK!", but how to do this?
//I tried to use here this - [self performSegueWithIdentifier:@"login_success" sender:self]; but it doesn't works.
}
}
请帮助我,如何解决我的问题? 附:我试着在谷歌和StackOverflow上找到我的问题的答案,但我发现并尝试使用的所有内容都没有帮助我。
答案 0 :(得分:0)
保留一个标志,或在NSUserDefaults中存储bool值。通过这种方式,您可以跟踪用户是否已获得授权,您可以显示第二个视图,否则您可以加载登录表单。
答案 1 :(得分:0)
我的应用程序还处理一些授权流程(PIN注册)。我使用两个故事板。一个用于注册/登录进度(Login.storyboard),另一个用于连接到服务。
以下代码正在申请中:didFinishLaunchingWithOptions:在一些初始化之后:
// Set rootview (Check if user is registred)
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
if ([ccmpService isRegistered]) {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
self.window.rootViewController = [storyboard instantiateInitialViewController];
if (launchOptions) {
NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
[self handleRemoteNotifications:remoteNotif];
}
} else {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
self.window.rootViewController = [storyboard instantiateInitialViewController];
}
[self.window makeKeyAndVisible];
return YES;
当我想更改故事板(登录/登出)时,我会调用类似的东西(也在App Delegate中声明:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *sourcetVC = self.window.rootViewController;
UIViewController *destVC = [storyboard instantiateInitialViewController];
[UIView transitionFromView: sourcetVC.view
toView: destVC.view
duration: 0.5
options: UIViewAnimationOptionTransitionFlipFromRight
completion: ^(BOOL finished) {
self.window.rootViewController = destVC;
}];
答案 2 :(得分:0)
而不是:
- (void)viewDidLoad
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *authLogin = [defaults objectForKey:@"SavedUserName"];
if(![authLogin isEqualToString:@""]){
...
}
}
我会说:
- (void)viewWillAppear
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *authLogin = [defaults objectForKey:@"SavedUserName"];
if(![authLogin isEqualToString:@""]){
// programmatically invoke a push segue to the next view controller
[self performSegueWithIdentifier:"pushToMyVC" sender:self];
}
}
请务必在Interface Builder中为segue提供故事板ID。对于其他选项,check out this thread.
请不要在此引用我,但我相信每次要显示视图时都会调用viewWillAppear。因此,如果您来回浏览此视图,则需要确保用户已登录。
答案 3 :(得分:0)
只需将第二个VC(不是登录VC)设置为初始场景,然后使用委托。像这样:
在您的LoginVC中:
@protocol LoginViewControllerDelegate
-(void)finishedLoggingInUser:(NSString *)userName;
@end
@interface LoginViewController : UIViewController {
__unsafe_unretained id <LoginViewControllerDelegate> _delegate;
}
@property (nonatomic, assign) id <LoginViewControllerDelegate> delegate;
然后在LoginVC的实现中,在登录后触发委托方法:
[_delegate finishedLoadingUserInfo:@"MyUsername"];
然后在初始VC中,将自己声明为LoginViewController的委托:
#import "LoginViewController.h"
@interface MyInitialViewController : UIViewController <LoginViewControllerDelegate>
在实现中实现委托方法:
#pragma mark - LoginViewController Delegate Method
-(void)finishedLoggingInUser:(NSString *)userName {
// Do something with the user info
self.loggedInUserName = userName;
[self dismissViewControllerAnimated:YES completion:nil];
}