在许多UIVIewControllers之间传递变量

时间:2010-10-21 06:04:17

标签: iphone objective-c xcode uiviewcontroller uinavigationcontroller

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

6 个答案:

答案 0 :(得分: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的所有文件中访问该变量。设置变量时,请注意释放并正确保留它。使用这种全局变量很容易产生内存泄漏。

答案 1 :(得分: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

仔细按照我的步骤 在给我的手指带来如此多的痛苦之后 我相信这肯定会帮助你......

过上轻松的生活,

答案 2 :(得分: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

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

答案 3 :(得分:1)

您可以使用所有类中提供的单例实例,它将处理您需要的所有信息。

Singleton in objective-C, Wikipedia

答案 4 :(得分:0)

我不会太快地绕过数据封装,这是Objective-C的一个很好的特性。

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

如果您的观点以结构化的方式进行到下一个方向的旁边,请考虑制作一个“数据”类,无论您正在制作什么,然后将其从父视图传递到子视图,直到您到达那里。 (请记住,“传递”并不是一项昂贵的操作,这些东西会保持不变,你会传递一个小指针)

如果你真的想要单例路径,可以考虑将它作为应用程序委托的属性(已经存在的单例)

请记住,只有“传入”数据的路径才能提供额外的优势,以后可能会想要多次收集该起始信息,并启动不同的可能的最后视图,并且只需传入一个不同的。如果你走全球路线,那么你必须开始重新编写之前访问它的地方。

答案 5 :(得分:0)

  

您可以将其用作单身人士,也可以将其保存在应用委托代理中并调用       [appdelegate getstring];