2012-02-22 55 views
0

我在一個名爲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

而不是把它認爲沒有負載,嘗試把字符串「= @‘測試’在-init。 viewDidLoad只有在舞臺上實際調用視圖控制器時纔會觸發,所以除非自己的視圖被調用舞臺,否則您的字符串不會被初始化。 – 2012-02-22 01:26:12

回答

0

編輯:它不一定需要是一個NSObject類,如果你願意,你也可以這樣做對你的viewController類,只是一定要還包括

-(id)init 

你的頭

----編輯結束

,如果你想使一個類是另一個視圖控制器訪問,爲什麼不嘗試一下,而不是視圖控制器NSObject的(考慮到你只需要採取該字符串值)

例如,讓我們調用viewController類的「全局」類

那麼在全局。小時,你把

#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; 

在實現文件:

​​

你去那裏;)

1

只有在加載view時才調用viewDidLoadViewController。當需要時,view被延遲加載,例如,當致電vc.view時。

我不知道你在努力達到什麼目標,但這對我來說肯定是一種代碼味道。

由於@Fscheidl指出你正在創建一個新的實例,而不是訪問現有的實例,所以這可能會增加你的問題。我仍然相信你的主要問題是,你認爲viewDidLoad被剛剛通過創建viewController,這是不是這種情況

+0

只有一個實例才能訪問屬性。在分配'vc'時,他創建了一個全新的'vc' – fscheidl 2012-02-22 01:09:38

0

你做致電[[ViewController alloc] init];此情況下一直沒有string甚至成立創建的ViewController一個新的實例調用。您必須訪問確切ViewController的實例。

如果直接從ViewController創建OtherViewController實例,你可以添加以下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); 
相關問題