我对iPhone开发相对较新,请原谅我希望这是一个简单的任务/问题。
我有一个带有标签栏的应用程序,其中有几个视图,每个视图都由一个MVC组控制。加载应用程序时,将显示标签栏的第一个mvc组。在第一个视图控制器的viewDidAppear方法中,我有一个模拟显示的登录屏幕,如下所示:
- (void ) viewWillAppear:(BOOL)animated
{
LoginViewController *loginvc = [[LoginViewController alloc] init];
loginvc.delegate = self;
if (*xxxxx*) {
[loginvc setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self presentModalViewController:loginvc animated:NO];
}
[loginvc release];
}
对于条件if语句,我希望调用一个方法来检查用户是否已登录。我暂时(仅用于测试目的)将此方法放在loginvc视图控制器中但是这不是一个长期的解决方案因为loginvc一旦被解除(它的模态视图)就会被解除锁定。
目前我的类设置如下,但不知道这是否正确,并且不知道在哪里实例化它(这应该在我的主app appate方法应用程序中:didFinishLaunchingWithOptions:?) ,并且不知道如何更改userIsLoggedIn变量:
LoginClass.h文件
#import <Foundation/Foundation.h>
@interface LoginClass : NSObject {
BOOL userIsLoggedIn;
}
-(BOOL)checkIfUserIsLoggedIn;
@end
LoginClass.m文件
#import "LoginClass.h"
@implementation LoginClass
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
userIsLoggedIn = NO;
}
return self;
}
-(BOOL)checkIfUserIsLoggedIn
{
return userIsLoggedIn;
}
@end
我的问题是我应该如何创建这个类的对象,该对象在应用程序存活的整个过程中都存在。这样,当应用程序启动时,会显示登录屏幕,但在成功登录后,'userIsLoggedIn'变量将设置为'YES',这样如果再次调用第一个mvc,则登录屏幕不再以模态方式显示
我希望我有道理并希望有人可以帮助我们修改代码。如果我接近这个错误,请让我知道替代策略(例如,我是否应该从第一个mvc的viewDidAppear调用模态显示?)。
提前致谢, 安迪
答案 0 :(得分:3)
App Delegate是您的Login类所在的位置。在您的应用运行的整个过程中,您的视图控制器和“生命”始终可以访问它。查看文档,了解如何从视图控制器访问App Delegate。
您的登录类也应如下所示:
#import <Foundation/Foundation.h>
@interface LoginClass : NSObject {
BOOL userIsLoggedIn;
}
@property (nonatomic) BOOL userIsLoggedIn;
-(BOOL)checkIfUserIsLoggedIn;
@end
// Implemenatation
#import "LoginClass.h"
@implementation LoginClass
@synthesize userIsLoggedIn;
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
userIsLoggedIn = NO;
}
return self;
}
-(BOOL)checkIfUserIsLoggedIn
{
return userIsLoggedIn;
}
@end
要设置登录状态,只需执行以下操作:
[[yourAppDelegateVar instanceOfLoginClass] setUserIsLoggedIn:YES];
或
[[yourAppDelegateVar instanceOfLoginClass] setUserIsLoggedIn:NO];
答案 1 :(得分:3)
您可以使用the Singleton pattern ,这完全适合您的问题。
当然,您可以按照下面的建议使用AppDelegate(因为UIApplication本身就是一个单例,因此AppDelegate - 您的UIApplication单例的委托对象 - 也只存在于一个实例中)但是它是更好的做法是保持AppDelegate仅用于其设计目的(即UIApplication的代理,即管理与应用程序事件相关的所有内容,例如转到后台或返回到前台,启动,接收推送通知等等保持代码清晰可读。
您最好为需要实施的每项服务使用另一个专用单例:这是更好的设计实践。
例如,实现一个LoginService
单例类(参见here in the Apple doc for implementation details)将保存-(BOOL)loginWithUsername:(NSString*)username password:(NSString*)password;
方法(检查您的登录/ pwd是否正常,可能与您的WebService进行通信), @property(readonly) BOOL loggedIn;
属性,如果需要可能是@property(readonly) NSString* currentUsername;
,依此类推。