【问题标题】:Objective C - Global variables for every View ControllerObjective C - 每个视图控制器的全局变量
【发布时间】:2014-08-28 23:50:18
【问题描述】:

我正在通过编写我的第一个应用程序来学习 Objective C 和 Xcode。 首先,用户必须登录。然后他可以做几件事,比如加入群组或更改他的数据(用户名、电子邮件、...)。

登录已完成,并且工作正常。 问题:

是否可以设置一个我可以从每个视图控制器访问的变量?

我在 segues 中尝试过,但我认为很难在每个视图控制器中定义它。

我正在寻找一个全局变量,我可以从应用程序的任何地方访问它,这可能吗? 或者有没有其他方法可以解决这个问题?

感谢您的帮助! 伊曼纽尔

【问题讨论】:

    标签: ios objective-c xcode viewcontroller


    【解决方案1】:

    我个人建议您使用单例模式。
    我不建议将所有内容都放到 AppDelegate 中,这个类不是为此而生的。

    相反,您可以做的是创建一个专用类(名称如“ApplicationState”,或任何适合您的名称),并将您需要的属性放在其头文件中,并将您的单例管理代码放在 .m (以及标题中的原型)

    如果你需要单例管理代码,这里是:

    + (ApplicationState*)sharedInstance
    {
        static ApplicationState* sharedInstance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sharedInstance = [[self alloc] init];
        });
        return sharedInstance;
    }
    

    那么,如果你在标题中有:

    @property (nonatomic, strong) NSObject* object;
    
    + (ApplicationState*)sharedInstance;
    

    您将能够通过包含 ApplicationState 头文件从任何地方获取此变量,并调用:

    [[ApplicationState sharedInstance] object];
    

    【讨论】:

    • 我应该为“ApplicationState”类选择什么子类?谢谢
    • NSObject 就好了。
    • 谢谢!以及如何设置变量? [[ApplicationState sharedInstance] userMail];
    • 你可以这样做:[[ApplicationState sharedInstance] setUserMail:@"YOUR USER MAIL"];
    • 谢谢你!你帮了我很多!
    【解决方案2】:

    如果简单的话,你可以使用NSUserdefault

    保存:

    [[NSUserDefaults standardUserDefaults]setObject:username forKey:@"userName"];
    [[NSUserDefaults standardUserDefaults] synchronize];    
     NSLog(@"username saved = %@", username);
    

    阅读:

    NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:@"userName"];
    NSLog(@"username retrieved = %@", username);
    

    【讨论】:

    • 我必须在哪里声明字符串(在您的示例中为“用户名”)?
    • 由你决定,它可以是局部变量,也可以是 @kuliay 示例中的属性 @property (nonatomic, strong) NSString *userName;
    • 我必须在所有其他类中访问它,所以本地不会很好....当我在 appdelegate 中声明它时,我是否必须在每个新类中创建一个新对象的 appdelegate (所以变量是空的,还是不是??)?感谢您的帮助!
    • 所以让它成为一个属性
    【解决方案3】:

    您也可以使用 AppDelegate。

    在您的 AppDelegate.h 中定义一个属性,

    @property (nonatomic, strong) NSString *userName;
    

    然后在您的视图控制器中,导入 AppDelegate.h 后,

    AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSLog(@"%@", appDel.userName);
    

    【讨论】:

      【解决方案4】:

      您可以将它们放在 plist 中,也可以创建 Objective-C 类,在其中初始化您的变量并在 .pch 文件中导入标头,然后这个带有数据的类将在每个 ViewController 中可用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多