8

在我的iPhone应用程序中,有一个设置助手帮助用户输入大量数据。它基本上是一个有很多UIViewController的UINavigationController。现在,在某个时刻,我想访问用户在他看到的第一个UIViewController中输入的变量。我可以在每个UIViewController与setter方法之间传递变量,但我想有一种更简单的方法。在许多UIVIwwlers之间传递一个变量

回答

7

如果需要,可以用C风格声明全局变量或类变量。如果你想在同一变量在几个UIViewController中的你的子类可供选择,你会宣布它作为你的第一个控制器的.h文件中的外部变量,例如:

#import <UIKit/UIKit.h> 

extern NSString *myGlobalString; 

@interface MyFirstViewController : UIViewController { 
... 

你然后在没有extern的.m文件中重新声明它。

#import "MyFirstViewController.h" 

NSString *myGlobalString; 

@implementation MyFirstViewController 

你不应该重新声明它在其他的.m或.h文件,但你可以在导入MyFirstViewController.h所有文件访问变量。设置变量时,请注意释放并妥善保存。用这种全局变量创建内存泄漏很容易。

+0

我不需要存储指向原始MyFirstViewController的指针来访问它吗? – fabian789 2010-10-21 06:29:19

+0

不,你不必存储任何指向对象的指针来访问这种类型的变量,但是你只能得到它的一个实例,并且它在所有对象之间共享。 – user362178 2010-10-21 06:32:10

+0

好的,谢谢!我一回家就会试试这个。 – fabian789 2010-10-21 06:49:04

3

雅,有很多来处理这一个简单的方法.....

你可以把全局变量

在你Delegate.h文件中声明你的变量:

@interface Smoke_ApplicationAppDelegate : NSObject <UIApplicationDelegate> { 

    UIWindow *window; 
    UINavigationController *navigationController; 
    NSString *messageString; //This would be your String Variable 

} 

@property(nonatomic,retain)NSString *messageString; 

其次在Delegate.m文件

@implementation Smoke_ApplicationAppDelegate 

@synthesize window; 
@synthesize navigationController; 
@synthesize messageString; // Synthesize it over here.. 

做到这一点。现在,你可以在所有使用这个字符串变量/任何你想要的类..

要使用这个全局变量。

只需导入您委派文件 使得它的OBJ ....

#import "DelegateFile.h" 

@implementation About 

DelegateFile *appDel; 
在你class.m

现在

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    appDel=[[UIApplication sharedApplication]delegate]; 

} 

现在,你可以通过这个任何地方访问它在你的类对象:

appDel.messageString

只要按照我的步骤仔细 给这么多的痛苦,我的手指, 之后,我相信这肯定会帮助你.....

有一个安逸的生活,

+0

谢谢,听起来不错。 – fabian789 2010-10-21 13:46:55

3

一个简单而重复使用而用可扩展的方式来解决这个问题就是使用单例。例如,声明一个名为SetupConfig的新类。

你SetupConfig.h那么应该如下所示:

@interface SetupConfig : NSObject { 
    NSString *_myString; 
} 

@property (retain) NSString *myString; 

+ (id)sharedSetupConfig; 

@end 

以及相应的SetupConfig.m:

#import "SetupConfig.h" 

SetupConfig *g_sharedSetupConfig = nil; 

@implementation SetupConfig 

@synthesize myString = _myString; 

+ (id)sharedSetupConfig { 
    if (!g_sharedSetupConfig) { 
     g_sharedSetupConfig = [[SetupConfig alloc] init]; 
    } 
} 

@end 

现在,你想从访问myString的视图控制器实现:

@import "MyViewController.h" 
@import "SetupConfig.h" 

@implementation MyViewController 

- (void)methodDoingSomethingWithSingletonString 
{ 
    NSString *myString = [[SetupConfig sharedSetupConfig] myString]; 
} 

@end 

单身方法比usi有许多优点一个全局C变量。首先,您不必一遍又一遍地重新声明全局变量。更重要的是,你的“全局”变量被封装在一个类中。综合属性获取器/设置器是将实际变量从代码的其余部分抽象出来的一种好方法。最后,这个实现可以很容易地集成到单元测试中。

0

我不会太快回避Objective-C这样一个很好的功能的数据封装。

如果你正在收集的东西,你会认为是“设置”考虑使用NSUserDefaults。

如果你的观点以结构化的方式进行到下一个方式,考虑制作一个“数据”类,不管你在做什么,然后将它从父视图传递到子视图直到你到达那里。 (请记住,“通过”不是一个昂贵的操作,东西保持,你通过一个小指针)

如果你真的想单身路线,考虑使它成为应用程序委托的属性(一个已经存在单身人士)

请记住,只有“传入”数据的路线带来了额外的优势,以后可能需要多次收集该起始信息,并启动不同的可能的最后一个视图,而且这只是微不足道的通过一个不同的。如果你走遍全球的路线,那么你就必须开始重新写你以前访问过的任何地方。

0

你可以使用它作为单例,或者你可以保留它在应用程序委托和调用像 [appdelegate getstring];