在我的iPhone应用程序中,有一个设置助手,可以帮助用户输入大量数据。它基本上是一个UINavigationController,里面有很多UIViewControllers。现在,在某个时刻,我想访问用户在他看到的第一个UIViewController中输入的变量。我可以使用setter方法在每个UIViewController之间传递变量,但我想有一种更简单的方法。
答案 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)
您可以使用所有类中提供的单例实例,它将处理您需要的所有信息。
答案 4 :(得分:0)
我不会太快地绕过数据封装,这是Objective-C的一个很好的特性。
如果你正在收集一些你认为是“设置”的东西,请考虑使用NSUserDefaults。
如果您的观点以结构化的方式进行到下一个方向的旁边,请考虑制作一个“数据”类,无论您正在制作什么,然后将其从父视图传递到子视图,直到您到达那里。 (请记住,“传递”并不是一项昂贵的操作,这些东西会保持不变,你会传递一个小指针)
如果你真的想要单例路径,可以考虑将它作为应用程序委托的属性(已经存在的单例)
请记住,只有“传入”数据的路径才能提供额外的优势,以后可能会想要多次收集该起始信息,并启动不同的可能的最后视图,并且只需传入一个不同的。如果你走全球路线,那么你必须开始重新编写之前访问它的地方。
答案 5 :(得分:0)
您可以将其用作单身人士,也可以将其保存在应用委托代理中并调用 [appdelegate getstring];