2012-12-16 74 views
0

我有一個viewController,它有一個按鈕,當點擊該按鈕時,它會動態地創建對另一個viewController類的引用,並且在該過程中也爲該設置設置參數viewController。我對循環做這個裏面如下:如何訪問一個動態傳遞給iOS中的子viewController的參數?

-(void) clickOnButton:(id)sender { 


    for (PersonObject *checkPerson in [DataModel sharedInstance].personList) { 

     if (((UIControl*)sender).tag == checkPerson.personID) { 

      ParentViewController *parentView = [[NSClassFromString(checkPerson.childViewController) alloc] init]; 
      parentView.personName = checkPerson.name; 
      NSLog(parentView.personName); 
      [self.navigationController pushViewController:parentView animated:YES]; 


     } 

    } 

} 

在時生成的的viewController和該用戶發送到,我有下面的代碼在我viewDidLoad方法:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    NSLog(@"Hello %@", personName); 
    UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, 150, 35)]; 
    [title setCenter:CGPointMake(self.view.frame.size.width/2, 27)]; 
    [title setBackgroundColor:[UIColor clearColor]]; 
    [title setTextAlignment:NSTextAlignmentCenter]; 
    [title setFont:[UIFont boldSystemFontOfSize:15]]; 
    [title setText:personName]; 
    [self.view addSubview:title]; 

} 

當我運行我的代碼,第一個viewController爲我提供了personName參數的NSLog的正確輸出,但是,第二個viewController語句中的方法viewDidLoad中的NSLog()顯示我的personName值爲零,並且沒有任何顯示爲我的viewController的標題。

參數personName的類型爲NSString,並且在父級viewController類以及子viewController類(有幾個viewController類擴展了這一個父級)中都可以找到。我如何動態創建子viewController對象,並讓它捕獲使用父級viewController發送給它的正確參數值?

+0

它被宣佈爲(非原子,保留) – syedfa

+0

作爲旁白(與你的問題無關),我注意到你宣佈你的財產爲'retain'。如果你使用ARC,你應該用'strong'替換'retain'。如果你沒有使用ARC,那麼你的代碼可能有泄漏,因爲當你''''''''''''''''ParentViewController''時,你應該也可以'autorelease'。 – Rob

回答

1

一個常見的錯誤是在視圖控制器的接口,你轉變有哪些等的接口:

@interface MyViewController : UIViewController 
{ 
    NSString *personName; 
} 
@property (nonatomic, retain) NSString *personName 
@end 

,然後實現,要麼沒有明確合成personName或一個有一個@synthesize聲明,如:

@implementation MyViewController 

@synthesize personName = _personName; 

// the rest of the implementation 

@end 

注意,如果你沒有一個明確的聲明@synthesize聲明,它會自動合成personName像上述聲明。

這個相當無害的碼位是有問題的,因爲你會實例變量,一個叫personName,另一個,這是爲你合成的,這就是所謂_personName結束。

你真正應該做的是消除顯式聲明伊娃,因此@interface會是什麼樣子:

@interface MyViewController : UIViewController 
@property (nonatomic, retain) NSString *personName 
@end 

,然後要麼完全忽略@synthesize陳述或者有一個看起來像:

@synthesize personName = _personName; 

然後,您的代碼可以通過其訪問器引用屬性,例如

NSLog(@"Hello %@", self.personName); 

或者你可以使用實例變量(伊娃):

NSLog(@"Hello %@", _personName); 

(順便說一句,這是一般建議使用的訪問者(如self.personName)時setting properties唯一一次你真的。必須使用伊娃(例如_personName)在initializer methods and dealloc。)

但是,底線,不要明確定義一個實例變量,讓編譯器爲你合成它,消除這類問題。建議綜合ivar與領先的下劃線,以最大限度地減少意外使用ivar時,如果你真的打算使用屬性的訪問器方法。

有關更多信息,請參見高級內存管理編程指南中的Practical Memory Management

+0

感謝Rob的回覆。你確實幫我找到了解決方案。由於該參數已在Parent類中聲明,因此我不需要在子類中再次聲明。在註釋掉子類中參數的聲明後,該值成功通過。再次感謝您的幫助,以及上面關於使用strong vs retain的評論。 – syedfa

相關問題