适用于整个应用'会话'的iPhone对象

时间:2011-09-07 10:21:57

标签: iphone ios ios4

我对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调用模态显示?)。

提前致谢, 安迪

2 个答案:

答案 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;,依此类推。