2012-02-01 217 views
0

我有一個調用AddQuoteViewController的RootViewController,並且在RootViewController中設置了一個變量「subject_id」,該變量沒有顯示在AddQuoteViewController中,我需要幫助理解原因以及如何解決它。如何將對象從一個ViewController傳遞到另一個ViewController

Subject *sub = [self.tableDataSource objectAtIndex:indexPath.row]; 

    self.subject_id = sub.subject_id; 

    [self addQuote_Clicked: sub]; 

...

- (void) addQuote_Clicked:(id)sender { 

    if(aqvController == nil) 
     aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil]; 

    if(addNavigationController == nil) 
     addNavigationController = [[UINavigationController alloc] initWithRootViewController:aqvController]; 

    [self.navigationController presentModalViewController:addNavigationController animated:YES]; 
} 

然後在我的AddQuoteViewController我試圖訪問這個變量是這樣的:

RootViewController *rv = [RootViewController alloc] ; 

NSLog(@"rv.Subject_id = %d", rv.subject_id); 

但什麼也沒得到。必須有一個簡單的方法來做到這一點。

+0

[如何從一個ViewController訪問對象到另一個ViewController]的可能重複(http://stackoverflow.com/questions/704524/how-to-access-objects-from-one-viewcontroller-to-another-viewcontroller )。這是一個*非常常見的問題,所以如果這裏鏈接的不是你正在尋找的東西,繼續尋找 - 這個主題有很多變化可用。 – Caleb 2012-02-01 22:49:13

+0

謝謝Caleb,但我確實花了一些時間尋找,並沒有找到我在其他帖子中獲得的明確方向。 – jroyce 2012-02-01 22:52:39

回答

1

有這樣做的各種方式,但一個簡單的答案 - 您可以在AddQuoteViewController設置爲屬性的RootViewController的參考

在AddQuoteViewController.h

RootViewController *rvc 

...

@property (nonatomic,assign) RootViewController *rvc; 

andrespondin g在你的實現類中進行合成和發佈。 (AddQuoteViewController.m)

然後,當你創建你的RootViewController的裏面你AddQuoteViewController,還設置該屬性:

- (void) addQuote_Clicked:(id)sender { 

    if(aqvController == nil) 
     aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil]; 
    aqvController.rvc = self; 
... etc. 

然後你就可以通過這個屬性來訪問您的AddQuoteViewController裏面的根視圖控制器的任何屬性:

NSLog(@"rv.Subject_id = %d", self.rv.subject_id); 

作爲一個側面說明有你在你的問題正在做幾件事情,是有點不尋常,就像試圖通過分配一個新的,並且還創造了新的導航共同去的對象的引用並且將其呈現爲模式視圖控制器,通常您可以執行一個或另一個(並且不需要創建新的導航控制器)。即您可以創建視圖控制器並以模態方式呈現它,或者您將創建一個視圖控制器並將其推送到當前的導航控制器堆棧中。

+1

這不會成爲循環引用嗎?這可能會給內存管理增加一些複雜性,但如果這裏使用的是ARC,我還不太瞭解ARC。 – 2012-02-01 22:42:52

+0

感謝這個方向。我知道我的代碼有點瘋狂 - 那是因爲我在字面上找到了自己的腳並在這個過程中摸索着。 – jroyce 2012-02-01 22:48:26

+0

Jefferson先生 - 好點 - 因爲aqvc是rootvc的成員,所以當它釋放它時仍然會被aqvc保留。所以爲了避免這個問題,最好讓aqvc中的屬性成爲assign屬性而不是保留在這種情況下。我編輯了這篇文章。 – gamozzii 2012-02-02 00:40:54

1

不能像這樣在視圖控制器中訪問變量。 看看創建一個可以全局訪問的單例類。 我認爲有一個例外是你可以在AppDelegate中訪問它們,但不建議擁有全局變量。

+0

從技術上講,單身人士可以工作,但這對於OP的問題幾乎肯定是一個糟糕的設計選擇。單身人士可能會有自己的位置,但如果他們被濫用,他們會很快破壞您的應用程序的設計。我會稱這種情況爲濫用:) – 2012-02-01 23:53:56

2

首先,您的第三塊代碼存在錯誤。這:

RootViewController *rv = [RootViewController alloc] ; 

應該是這樣的:

RootViewController *rv = [[RootViewController alloc]init]; 

但嚴格來說,這不是你爲什麼沒有看到你的實例變量。

如果我理解正確,前兩個代碼塊在RootViewController,他們實例化一個AddQuoteViewController並呈現它。然後,從您的第三個代碼塊(AddQuoteViewController)中,您想要訪問RootViewController的成員變量(subject_id)。

AddQuoteViewController中實例化一個RootViewController是行不通的,因爲你要創建一個不同實例的RootViewController的方法。你所追求的是你剛剛來自的實例的價值。

也許做到這一點最簡單的方法是在AddQuoteViewController創建相應的屬性,並將其設置在創建時:

- (void) addQuote_Clicked:(id)sender { 

if(aqvController == nil) 
    aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil]; 

if(addNavigationController == nil) 
    addNavigationController = [[UINavigationController alloc] initWithRootViewController:aqvController]; 

aqvController.subject_id = self.subject_id; 

[self.navigationController presentModalViewController:addNavigationController animated:YES]; 
} 

你需要在AddQuoteViewController創建subject_id屬性,您做了同樣的方式RootViewController

+0

謝謝你的提示。我認爲我的AddQuoteViewController必須已經設置了subject_id變量才能使上述功能正常工作? – jroyce 2012-02-01 22:50:25

+0

是的。你已經完成了它,當你可以在你的第一個代碼塊中說'self.subject_id'和'sub.subject_id'。 'subject_id'將被聲明爲'@ property'聲明,就像gamozzii的答案所示。 – 2012-02-01 23:07:30

相關問題