4

我对使用应用程序委托使变量能够在我的应用程序中的任何位置设置和使用的概念感到非常困惑。这是我的代码:

应用代理.h

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    NSMutableString *globalUsername;
}
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) NSMutableString *globalUsername;

appdelegate.m

@synthesize globalUsername;

和另一个视图场景(称为“Forum.h”,我试图在其中设置值)

AppDelegate *appDelegate = (MyAppDelegate *)[[[UIApplication sharedApplication] delegate]];
[appDelegate globalUsername appendString;

最后一行当然是不完整的,但是 xcode 会自动获取 globalUsername 变量,我只是无法调用“appendString”函数来实际更改它。

4

6 回答 6

11

呃,如果你想存储用户名,为什么不直接使用 NSUserDefaults 呢?

// set the username
[[NSUserDefaults standardUserDefaults] setValue:@"johnsmith" forKey:@"username"];
[[NSUserDefaults standardUserDefaults] synchronize];

// retrieve the user name
NSString *username = [[NSUserDefaults standardUserDefaults] valueForKey:@"username"];
于 2013-01-12T15:27:48.390 回答
6

您缺少一组 [],它们实际上是两个语句合二为一。首先在 appDelegate 上调用 globalUsername 方法,然后发送消息 appendString(缺少参数)

所以这应该看起来像这样:

[[appDelegate globalUsername] appendString:@"foobar"];

但是对于一个游戏,你不应该像这样滥用应用委托。相反,我建议如果你想要一个全球性的地方来存储游戏状态,你应该考虑拥有一个单例,就像我在这里描述的那样:http: //www.cocoanetics.com/2009/05/the-death-of-global-variables /

PS:由于几个原因,您可能不想在那里使用可变字符串。最好让属性/ivar 成为一个普通的 NSString,然后设置它。我看不出有什么好的理由要在用户名上附加字符。即使 NSString 是不可变的,您也可以简单地将它们替换为其他字符串。

[[appDelegate setGlobalUsername:@"foobar"];

或具有相同效果:

appDelegate.globalUsername = @"foobar";
于 2013-01-12T07:27:36.963 回答
4

如果它是 NSMutableString,那么你在 'Delegate' 类中有 alloc - init。

因为如果它是可变对象,那么你必须分配和初始化。

首先,在 Delegate.m 类中

globalUserName = [[NSMutableString alloc] init];

然后,

在 ViewController 中,您可以使用,

appDelegate.globalUsername appendString ....(What you want)

谢谢。

于 2013-01-12T07:26:03.147 回答
2

我认为您已经混淆了委托与其视图控制器之间的关系。AppDelegate 在您启动应用程序时创建。您无需在 Forum.h 中创建 AppDelegate,而是在 AppDelegate 中创建 ViewController、Forum。大括号中的 *globalUserName 也是不必要的。

所以 AppDelegate.h 会这样写:

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) NSMutableString *globalUsername;
@property (nonatomic, retain) Forum *forum;

此外,在当前版本的 Xcode 和 Objective-C 中,也不需要综合。它会自动设置和初始化。在 AppDelegate.m 中,您可以使用以下命令引用 *globalUsername:

self.globalUsername

您的 AppDelegate.m 还应在 applicationDidLaunch 中包含以下内容:

[[self.forum alloc] init];  //Allocate and initialize the forum ViewController
self.forum.delegate = self; //Set the forum ViewController's delegate variable to be the AppDelegate itself

但是 Forum ViewController 目前没有一个名为 delegate 的变量,所以我们必须创建它。所以在 Forum.h 你应该添加:

@property (nonatomic) id delegate;

所以现在在 Forum.m 中,由于 AppDelegate.m 负责设置委托,我们现在可以使用论坛的委托变量引用 AppDelegate 中的数据。

所以最后,为了从 Forum.m 访问 globalUsername,我们可以使用 self.delegate.globalUsername。因此,要附加到来自 Forum.m 的字符串,我们可以使用:

[self.delegate.globalUsername appendString:myNewString];

其中“myNewString”是要添加到 globalUsername 的字符串。

希望这可以帮助。

于 2013-01-12T09:34:22.517 回答
0

@interface AppDelegate : UIResponder <UIApplicationDelegate> { NSMutableString *globalUsername; }

这不会创建全局变量。事实上,它是 AppDelegate 类的受保护成员。

从您无法访问的所有课程中。您需要创建 AppDelegate 的另一个实例,然后您将明智地使用该 ivar。

全局一词是指您在所有类中的应用程序中都将具有相同的价值。而且您不需要每次都分配+初始化。

对于全局变量,您需要创建一个静态变量。共享课程/单身课程将为您工作。

于 2013-01-12T07:29:28.247 回答
0

我想你忘记了alloc。只需allocapplication did finish launching方法中使用一次。

于 2013-01-12T07:26:14.297 回答