我搜索了互联网和20多个关于全局变量的主题,我找不到我需要的那个。
答案 0 :(得分:3)
您可以执行建议,在AppDelegate中添加变量,然后从视图控制器中获取它,如下所示:
AppDelegateNeme *ap = (AppDelegateNeme *)[[UIApplication sharedApplication] delegate];
ap.yourVar = smth
正如您在上面的代码中所看到的,您正在访问UIApplication的共享实例,只需将其转换为您的AppDelegate类,您就可以访问“全局”变量。但我个人并不认为这是最好的解决方案。会发生的是你需要在每个UIViewController中包含你的app委托,并且你可能已经在你的AppDelegate中包含了UIViewController,这样你最终可能会看到递归包含或非常混乱的代码。
更清洁的方法是创建一个存储全局变量的类,只需添加一个文件,为类选择NSObject。然后你可以创建该类的单例对象,或者你可以只定义类变量和类方法(带+的那个)来存储和取出“全局变量”中的值。
通过这种方式,您的代码将是模式可读的,只要您不开始在该类中包含内容,就不会有任何包含问题。
示例:
//GlobalClass.h
@interface GlobalClass : NSObject
@property (nonatomic) BOOL someBool;
// example wit a singleton obj:
+ (GlobalClass *)globalClass;
// example with class methods
+(int)GetMyVar;
+(void)SetMyVar:(int)var;
//GlobalClass.m
static int MyVar;
@synthesize someBool;
static GlobalClass *globalClass = nil;
+ (GlobalClass *)globalClass
{
if (globalClass == NULL)
{
// Thread safe allocation and initialization -> singletone object
static dispatch_once_t pred;
dispatch_once(&pred, ^{ globalClass = [[GlobalClass alloc] init]; });
}
return globalClass;
}
+(int)GetMyVar
{
return MyVar;
}
+(void)SetMyVar:(int)var
{
MyVar = var;
}
所以从外面(来自你的viewcontroller): 要创建单例并设置我们的bool属性:
//set var:
[[GlobalClass globalClass] setSomeBool:YES];
// get
BOOL b = [[GlobalClass globalClass] someBool];
或者使用类方法(不需要创建单一的obj)
// set
[GlobalClass SetMyVar:5];
// get
int num = [GlobalClass GetMyVar];
希望这会有所帮助......
答案 1 :(得分:2)
在app delegate header
中extern NSString* const globalVariable1;
在app delegate m file
中NSString* const globalVariable1 = @"My Value";
您可以在任何视图控制器中访问此全局变量。
这只是字符串。
int const
表示整数。
只有BOOL
表示布尔值。
希望这有帮助
答案 2 :(得分:1)
对于swift,我使用了这种方法:
struct MyStyles {
static let ThemeColor = UIColor(red: 41/255, green: 156/255, blue: 253/255, alpha: 1.0)
static let ThemeSecondColor = UIColor.whiteColor()
static let ThemeGrayLineColor = UIColor(red: 128/255, green: 128/255, blue: 128/255, alpha: 1.0)
static let ThemeMyCommentsColor = UIColor(red: 219/255, green: 238/255, blue: 255/255, alpha: 1.0)
static let ThemeCommentedToMeColor = UIColor(red: 227/255, green: 232/255, blue: 235/255, alpha: 1.0)
static let ThemeFontName = "HelveticaNeue-Light"
static let ThemeFontNameBold = "Helvetica-Bold"
static let ScreenWidth = UIScreen.mainScreen().bounds.size.width
static let ScreenHeight = UIScreen.mainScreen().bounds.size.height
static let StatusBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height
static func largeButton(#title: String, action: String, target: UIViewController) -> UIButton {
let button = UIButton(frame: CGRect(x: 0, y: ScreenHeight*9/10, width: ScreenWidth, height: ScreenHeight/10))
button.setTitle(title, forState: UIControlState.Normal)
button.backgroundColor = ThemeSecondColor
button.tintColor = ThemeColor
button.titleLabel?.font = UIFont(name: ThemeFontName, size: 50)
button.setTitleColor(ThemeColor, forState: UIControlState.Normal)
button.addTarget(target, action: Selector(action), forControlEvents: UIControlEvents.TouchUpInside)
return button
}
}
我从其他类中这样访问它们:
var color = MyStyles.ThemeColor
答案 3 :(得分:0)
您应该在Application Delegate类中声明“全局”变量。
这样您就可以确保所有的viewsControllers等都能够访问它们。
对我而言,它可能是最优雅的解决方案,当您需要访问其中一个变量时,您可以获得对您的应用代表的引用。
答案 4 :(得分:0)
创建一个singleton课程。将所有全局变量添加为读/写属性。在应用启动时创建单例实例,通常在application:didFinishLaunchingWithOptions:
方法内。使用此单例实例,您现在可以在整个应用程序中共享信息。
如果您的应用在多线程环境中访问这些属性,您可能需要关于制作属性thread safe。
希望有所帮助!