2013-10-19 225 views
0

我设计了一个登录应用程序。我已经在sqlite数据库中输入了帐户数据。但是,当我用帐户用户名和密码登录时,我希望这些可以被所有视图控制器访问。因为我有不同的控制器会更新帐户的详细信息。需要实现细节.. 谢谢在Objective C中创建全局变量

+0

您的意思是应用程序可以访问实际的密码?这不是一个好主意。像其他人一样使用钥匙串。 – jcm

+0

使用DefaultUser ..它可能是最适合你:) – iPatel

回答

1

避免全局变量 ,而您可以使用Singleton类来存储应用程序范围的凭据信息。

但请记住,在应用程序中存储凭据的最佳方式是使用Apple Keychain,您可以在Apple网站上找到API参考。

1

至于有人说 - 避免全局变量,但如果你想他们肯定的 - 不喜欢它的C语言:

在一个文件中

中的所有其他文件

定义这个变量是指其与extern关键字

2

使用单:http://www.galloway.me.uk/tutorials/singleton-classes/

我有这样的一个项目(请注意我用iOS的钥匙串,而不是一个数据库,但是我在这里隐藏这些细节):

@interface User : NSObject 
@property (nonatomic, strong) NSString *username; 

+ (User *)currentUser; 

@end 

@implementation User 

+ (User *)currentUser 
{ 
    static User *currentUser = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     currentUser = [[User alloc] initFromKeychain]; 
    }); 
    return currentUser; 
} 
@end 

有办法在做单身(取决于你想如何偏执是关于某人是否可以创建类的非单一实例或没有)很多。这里的示例:What should my Objective-C singleton look like?

您也可以直接在任何需要的地方直接访问钥匙串。你也应该问自己为什么你的代码需要访问一个用户名/密码。听起来像是一个破碎的设计。

1

简单地说:不要这样做!

我建议将证书存储在钥匙串中。但不要使用Apple提供的示例代码。它不起作用。我在我的项目中使用SSKeychain

如果您不需要存储凭据,您应该像aleroot建议的那样仅使用一个实例的单例或类。

0

三个答案:

  • 不要这样做。
  • 如果您必须这样做,请使用Singleton。
  • 要非常方便地访问用户名和非机密(即密码)变量,请使用NSUserDefaults。
+0

感谢所有的快速建议。我实际上需要在控制器之间访问的用户名。所以一旦用户用他的用户名(和密码)登录,取决于用户名(从数据库中选择),用户将被赋予某些特权。如何去做这件事? – user2741735

+0

使用NSUserDefaults:https://developer.apple.com/library/mac/documentation/cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference。html NSUserDefault对象通过应用程序关闭和应用程序更新/升级持续存在。如果您的用户注销,请确保清除该对象。 – ArtSabintsev