2010-12-13 86 views

回答

-2

您可以爲您的第一個視圖控制器存儲文本費爾德價值,只是在你的第二個視圖控制器創建第一個視圖控制器類的引用......然後你就可以訪問變量

5

通過創建一個創建全局變量一個ivar可以引用一個特定的類型,比如標籤或其他視圖控制器,你可以把所有不需要耦合的東西結合在一起。你可以做的是讓你的第一個標籤視圖控制器成爲你的第二個標籤視圖控制器的代表。所以在你的應用代理中做這樣的事情。

OptionsViewController *optionsViewController = // ... get this from the tab view 
FirsTabViewController *firstTabViewController = // ... same here 

[optionsViewController setDelegate:firsTabViewController]; 

,這意味着你需要在你的OptionsViewController伊娃:當你想要觸發這種改變發生在你的選擇瀏覽器,查看代理人是否可以應對任何事件

@property (assign) id delegate; 

然後,一個你已經命名的選擇器。例如:

- (void)someEventHappenedLikeTyping:(id)sender; 
{ 
if ([delegate respondsToSelector:@selector(setOptionsString:)] 
    [delegate performSelector:@selector(setOptionsString:) withObject:[label text]]; 
} 

請注意,您從未指定過任何特定的對象類型。你只需檢查委託(是否聲明爲id)是否可以響應該選擇器。如果可以的話,它會按照它所說的去做,否則就會保持沉默。

對於這個工作,你需要在你的FirstTabViewController的optionsString伊娃,所以它會在頭被聲明爲:

@property (copy) NSString *optionsString; 

,然後在.M @synthesize它。這會導致-setOptionsString成爲將在-someEventHappenedLikeTyping方法中調用的有效選擇器。無論如何,現在,如果你需要改變哪個視圖控制器引用哪個,你不必進入頭部並且改變引用的ivar的類型。您只需在作爲選項視圖控制器代表的視圖控制器中實現選擇器(順便提一句,這稱爲非正式協議)。

只是一些思考的食物。希望有所幫助。在我添加的代碼中可以做進一步的分離,但是對於這樣一個簡單的任務來說,這又可能是過度的。讓我知道你是否需要澄清或者想通過進一步解耦來理解我的意思。

此致敬禮

p.s.有時需要在兩個標籤欄視圖控制器之間共享數據,意味着您有設計缺陷。如果你想要存儲的偏好從你的選擇來看,你應該叫

[[NSUserDefaults standardUserDefaults] setObject:[label text] forKey:@"option1"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

然後你可以從後面NSUserDefaults的使用您的主選項卡拉;

NSString *option1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"option1"]; 

//使用選項1東西

參考通過How to access data from one view to another view?

相關問題