iOS应用中的动态全局变量

时间:2014-02-20 11:12:51

标签: ios swift

我搜索了互联网和20多个关于全局变量的主题,我找不到我需要的那个。

  • 将在iOS应用程序中使用它。
  • 我希望可以从所有视图访问该变量。
  • 我想要一些视图才能更改该变量。
  • 最好不要混淆segues。

5 个答案:

答案 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

希望有所帮助!