我对使用app委托使变量能够在我的应用程序中的任何位置设置和使用的概念格外感到困惑。这是我的代码:
appdelegate.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”函数来实际更改它。
答案 0 :(得分:11)
嗯,如果您要存储用户名,为什么不直接使用NSUserDefaults?
// set the username
[[NSUserDefaults standardUserDefaults] setValue:@"johnsmith" forKey:@"username"];
[[NSUserDefaults standardUserDefaults] synchronize];
// retrieve the user name
NSString *username = [[NSUserDefaults standardUserDefaults] valueForKey:@"username"];
答案 1 :(得分:6)
你缺少一组[],这些实际上是两个陈述中的一个。首先在appDelegate上调用globalUsername方法,然后结果发送消息appendString(缺少参数)
所以这应该是这样的:
[[appDelegate globalUsername] appendString:@"foobar"];
但对于游戏,你不应该像这样滥用应用代表。相反,我建议如果你想要一个存储游戏状态的全球场所,你应该考虑使用Singleton,就像我在这里描述的那样:http://www.cocoanetics.com/2009/05/the-death-of-global-variables/
PS:你可能不想在那里使用可变字符串,原因有几个。最好让属性/ ivar成为普通的NSString,然后设置它。我没有看到为什么你想要将字符附加到用户名的任何理由。即使NSStrings是不可变的,你也可以简单地用其他的替换它们。
[[appDelegate setGlobalUsername:@"foobar"];
或具有相同效果:
appDelegate.globalUsername = @"foobar";
答案 2 :(得分:4)
如果它是NSMutableString,那么你在'Delegate'类中有alloc - init。
因为如果它是Mutable Object,那么你必须分配&amp;初始化。
首先, 在Delegate.m类
中globalUserName = [[NSMutableString alloc] init];
然后,
在ViewController中,您可以使用
appDelegate.globalUsername appendString ....(What you want)
感谢。
答案 3 :(得分: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中,您可以使用:
引用* globalUsernameself.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负责设置委托,我们现在可以使用Forum的委托变量引用AppDelegate中的数据。
最后,为了从Forum.m访问globalUsername,我们可以使用self.delegate.globalUsername。所以要附加到Forum.m的字符串,我们可以使用:
[self.delegate.globalUsername appendString:myNewString];
其中“myNewString”是您要添加到globalUsername的字符串。
希望这有帮助。
答案 4 :(得分:0)
我想你忘记alloc
了。在alloc
方法中只需application did finish launching
一次。
答案 5 :(得分:0)
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
NSMutableString *globalUsername;
}
这不会创建全局变量。事实上,它是AppDelegate Class的受保护成员。
从所有课程中你都无法访问它。你需要创建另一个AppDelegate实例,然后你会明智地认为是ivar。
术语全局表示您将通过所有类中的应用程序获得相同的值。而且你不需要每次都分配+ init。
对于全局变量,您需要创建一个静态变量。共享类/ Singleton类将适合您。