我在名为ViewController的视图控制器中设置一个字符串,并试图在其他地方访问它。这是代码:
ViewController.h
NSString *string;
...
@property (retain) NSString *string;
ViewController.m
@synthesize string;
...
-(void)viewDidLoad {
...
string = @"Test";
}
OtherViewController.m
#import "ViewController.h"
...
-(void)viewDidLoad {
ViewController *vc;
vc = [[ViewController alloc] init];
NSLog(@"String: %@", vc.string);
}
但是,日志显示为:String: (null)
。我做错了什么?感谢。
答案 0 :(得分:1)
viewDidLoad
的{{1}}仅在加载ViewController
时调用。如果需要,view
会延迟加载。当拨打view
时。
我不确定你想要达到的目标,但这对我来说似乎是一种代码味道。
由于@Fscheidl指出您正在创建新实例而不访问现有实例,因此这可能会增加您的问题。我仍然认为你的主要问题是你假设只是通过创建vc.view
来调用viewDidLoad
,而不是这种情况
答案 1 :(得分:0)
您通过调用ViewController
来创建[[ViewController alloc] init];
的新实例。此实例甚至没有设置string
。您必须访问ViewController
的完全实例。
如果您直接从OtherViewController
创建ViewController
的实例,则可以将以下内容添加到OtherViewController.h
:
#import "ViewController.h"
@property (nonatomic, retain) ViewController *previousViewController
创建OtherViewController
时,您可以设置:
//alloc and init instance of OtherViewController
myOtherViewController.previousViewController = self;
在viewDidLoad:
方法中,您可以按如下方式访问字符串:
NSLog(@"String: %@", previousViewController.string);
答案 2 :(得分:0)
编辑:它不一定需要是NSObject类,如果你愿意,你也可以在你的viewController类上执行此操作,只需确保也包括
-(id)init
标题上的
----编辑结束
如果您正在尝试创建一个可供另一个视图控制器访问的类,为什么不尝试NSObject而不是视图控制器(考虑到您只需要获取该字符串值)
例如,让我们调用viewController类“global”类所以在global.h,你提出
#import <Foundation/Foundation.h>
@interface GlobalVar : NSObject
@property (nonatomic, strong) NSString *myString;
-(id)init;
@end
然后,在global.m你提出
#import "GlobalVar.h"
@implementation GlobalVar
@synthesize myString;
-(id)init
{
self = [super init];
if(self)
{
myString = [[NSString alloc]initWithFormat:@"the String"];
}
return self;
}
@end
之后,每当你需要访问全局类中包含的“myString”对象时,你就可以提出
在标题处:
#import "GlobalVar.h"
...
...
@property (nonatomic, strong) GlobalVar *globalVar;
在实施文件中:
@synthesize globalVar;
...
...
self.globalVar = [[GlobalVar alloc]init];
NSString *theString = globalVar.myString;
NSLog(@"content of my string is : %@",theString);
你去;)