2013-06-04 40 views
1

我想知道是否有一种方法来声明项目范围变量,就像使用UINavigationController启动应用程序时获得的一样,并且可以从应用程序的任何位置调用该导航控制器,因为它已在应用程序Delegate中声明。在目标C中声明项目变量C

我想创建一个项目(全局)var,它允许我调用SVProgress hud或从我的应用程序中的任何地方解散它。我有这个问题,我加载UIViewController到导航堆栈上,启动SVProgress hud然后向我的数据库发出请求。如果我得到一个错误,我需要处理一些事情,其中​​一个是能够解散SVProgress hud。

这是我到目前为止的代码

AppDelegate.h

#import "SVProgressHUD.h" 

@interface MYAPPAppDelegate : UIResponder <UIApplicationDelegate> { 
//.. 
} 

@property (strong, nonatomic) SVProgressHUD *svprogressHud; 

AppDelegate.m

@synthesize svprogressHud; 

真的不知道这是否可能希望有人在那里将能帮助我。

这里是一个link到SVProgress混帐

+1

备注 - 假设您使用最新的编译器(Xcode的最后几个版本的默认值),您不需要'@synth esize'线。只需拥有@属性就足够了。没有伊娃,不需要合成。 – rmaddy

+1

男人我不得不经过并清理这么多东西哈哈谢谢你,虽然,我会读它。 – HurkNburkS

+0

可以将var放在AppDelegate中,或者将其设置为静态。或者你可以为它创建一个“单身人士”。 –

回答

2

一个您可以从您的视图控制器做的事情就是抓住应用程序的委托,并将其投放到您的委托的类型,像这样:

#import "MYAPPDelegate.h" 
MYAPPDelegate *ad = (MYAPPDelegate *)[[UIApplication sharedApplication] delegate]; 
[ad.svprogressHud displayOrWhatever]; 

不是真的干净,但应该完成工作。

+0

是否可以在NSObject类中做到这一点? – HurkNburkS

+0

上面的代码应该可以从您的项目编译的任何Objective-C类中工作(您需要'#import'您的应用程序委托头)。 –

+0

我问这个问题的原因,我可能没有足够清楚,但我希望能够声明SVProgress hud在视图控制器中显示,然后在NSObject类中显示,我希望能够解开它。 – HurkNburkS

1

只是扩展Roberts的答案,为了避免重复获取应用程序委托的代码,然后将其转换为MYAPPDelegate,我将在工程中使用实用函数创建一个头文件/类。

创建一个名为AppUtils.h

#import "MYAPPAppDelegate.h" 
#ifndef AppName_AppUtils_h 
#define AppName_AppUtils_h 

static inline MYAPPAppDelegate* AppDelegate() { 
    return (MYAPPDelegate *)[[UIApplication sharedApplication] delegate]; 
} 

#endif 

你在哪里都需要访问这些变量导入头AppUtils.h和使用辅助函数新的头。例如:

#import "AppUtils.h" 

... 

- (void)foo { 
    // use app delegate 
    UIViewController *rootVC = AppDelegate().rootViewController; 
} 
+0

或者你可以'#define'表达式。 –

+0

文体选择。我通常喜欢静态内联而不是#defines。您可以更容易地设置断点/添加日志记录等。虽然#define的确定。 –

+0

不知道这是否适用于我的问题。 SVProgressHUD是一个对象类,由于某种原因,如果我在我的AppDelegate中声明它,然后尝试从另一个类访问它,我无法访问SVProgressHUD类方法...我不是100%确定为什么。 – HurkNburkS

1

只需添加头文件名到您的预编译头(<projectname>_Prefix.pch)文件#ifdef __OBJC__

等作为内部:

#ifdef __OBJC__ 
    #import <UIKit/UIKit.h> 
    #import <Foundation/Foundation.h> 
    #import "SVProgressHUD.h" 
#endif 

然后它会给你访问所有文件的文件.....

+0

好,这是需求之一,但另一个是,如果我创建一个SVProgressHud的实例加载到一个UIViewController,然后我想能够卸载相同的SVProgressHud从说另一个视图的nsobject类...问题我现在有,是我创建svprogresshud多个实例,所以如果我加载它在一个viewcontroller我不得不回到相同的viewcontroller卸载它。 – HurkNburkS

+1

然后,只需放入两个方法,一个用于加载SVProgressHud,另一个用于卸载SVProgressHud。只要创建实例并在需要时调用这些方法.. – NULL

+0

好吧,试试吧。 – HurkNburkS