2011-03-06 87 views
0

我正在嘗試使模態視圖顯示我的應用程序的冠軍。 在模態視圖中有一個名爲champ的NSMutableString變量, 應該由主視圖中的returnChamp函數更新。 champ字符串在主視圖中正確設置, 但在模態視圖中,champ值顯示爲(null)。其實,它似乎甚至沒有進入returnChamp函數。 所以顯然是我的調用或實現returnChamp, 有什麼問題,但我有另一個功能,做了類似的工作很好。更新模態視圖變量的值

任何人都可以請幫我嗎?

-(void) mainView{ 
..... 
     champ = [[currentPlayers objectAtIndex:playerIndex] retain]; 
     NSLog(@"%@",champ); 
     modalWinner = [[winner alloc] init]; 
     modalWinner.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
     [self presentModalViewController:modalWinner animated:YES]; 

}

- (NSMutableString *) returnChamp{ 
NSLog(@"returnChamp"); 
return champ; 

}

//in modalWinner 
-(void) modalView{ 
.............. 


champName = [[NSMutableString alloc] init]; 
NSLog(@"%@", [(MainViewController *)self.parentViewController returnChamp]); 
champName = [(MainViewController *)self.parentViewController returnChamp]; 
UIImage *champImage = [UIImage imageNamed:champName]; 
} 

回答

1

self.parentViewController可能不是真正到你的對象的引用。出於某種原因,框架似乎總是堅持將UINavigationController設置爲self.parentViewController - 即使對於模態,並且如果還沒有一個,它將創建一個。這可能不會被注意到,因爲您將它投射到MainViewController類型。

您需要找到一種使您的原始對象可以與之通信的不同方式,或者在呈現之前將適當的值傳遞給新實例化的控制器。

例如,如果你添加一個champName屬性的模式類,你可以這樣做:

modalWinner = [[ModalWinnerViewController alloc] init];
modalWinner.champName = myValue; /* Set value before presenting controller */
[self presentModalViewController:modalWinner animated:YES];

有可能是更新該值的UI需要一些代碼。模態視圖控制器的viewWillAppear方法是一個很好的地方,因爲它在視圖呈現之前立即被框架調用。

請注意,此基於屬性的方法也可用於保留對您的預期父對象的引用。和see here爲解決類似問題的不同方法。

+0

謝謝你的回答。但有什麼其他方式可以從mainview更新champName? – CosmicRabbitMediaInc 2011-03-06 19:27:26

+0

有幾種可能的方法 - 可能最簡單的方法是在呈現控制器之前向獲勝者視圖控制器添加屬性(例如「分數」)並設置modalWinner.score的值。如果需要執行任何代碼來處理值的顯示,您可以將其置於viewWillAppear中。 – 2011-03-06 19:40:23

+0

謝謝你的回覆。我試過modalWinner.champName = champ;從主視圖,但它給了我「對象不能設置 - 只讀屬性或找不到setter」錯誤...如果我要在viewWillAppear的模態視圖中設置值,我將如何從主視圖訪問它? – CosmicRabbitMediaInc 2011-03-06 19:52:49