2011-11-15 110 views
3

我有一個RootViewController和一個DetailViewController,我試圖將一個NSMutableArray從rootView傳遞給detailView。我創建了DetailViewController內RootViewController的的對象,並訪問它像下面iPhone編程 - 在視圖控制器之間傳遞NSMutableArray

RootViewController *root = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 

detailViewArray = [root.rootViewArray copy]; 

注:這兩個數組在h文件中聲明;合成,然後分配和初始化array = [[NSMutableArray alloc] init];

問題:我也不太清楚爲什麼它仍然無法正常工作。我曾在互聯網上嘗試過很多解決方案,但對我而言並不合適。根數組的屬性是非原子,保留這是不是有什麼問題?我是否需要將其更改爲某種方式,或者我所遵循的方法是不正確的..請如果有人能幫忙!

回答

3

如果您在DetailViewController內部分配/ init RootViewController,您正在創建RootViewController的另一個實例。您沒有獲得rootViewController的同一實例(包含數據)。

這就是說,即使將viewController的引用傳遞給另一個viewController,然後戳到它的數據也是不好的。它在視圖之間創建緊密耦合。

相反,如果您需要獲取數據,請考慮使用委託在視圖之間進行通信。

What exactly does delegate do in xcode ios project?

教程:

http://www.theappcodeblog.com/2011/04/15/passing-data-between-views-tutorial-using-a-protocol-delegate-in-your-iphone-app/

另一個選擇是創建一個共享模型(上模型視圖控制器模式讀向上)。這是在該模式的典型通過獲取模型的單一實例創建模型和共享數據:

MyModel *model = [MyModel sharedInstance]; 

然後,每個視圖可以設置並從模型的相同(單)實例讀取數據。

要選擇哪個?如果許多視圖共享相同的數據,則該模型更好。一個委託是適合夫婦觀點與每個通過回調溝通。

+0

即使有另一種方式來傳遞數組。 MyViewController mvc = [[MYViewController alloc] initWithNibName:@「MYViewController」bundle:[NSBundle mainBundler]]; [mvc getDataArray:]; – Mrunal

+0

@mrunal - 這正是蘋果推薦代表的原因。擁有一個視圖直接在另一個視圖上設置數據會創建視圖的緊密耦合。 – bryanmac

0

即使有另一種方式來傳遞數組。

MyViewController mvc = [[MYViewController alloc] initWithNibName:@"MYViewController" bundle:[NSBundle mainBundler]]; 

[mvc getDataArray:<pass your array>]; 

[self.navigationController pushViewController:mvc animated:YES]; 

這會設置一個dataArray中屬性第一那麼它將視圖控制器推到MyViewController類。

當你非常關心記憶時,這會很有用。因爲如果你使用static(sharedInstance),那麼它的範圍在整個應用程序範圍內保持不變。

+0

如果你想直接傳遞它,你應該使用代表。直接設置會創建視圖的緊密耦合。 – bryanmac

+0

@bryanmac:哦,我對代表們沒有太多想法。你能給一個例子提供代碼嗎? – Mrunal

+0

在我上面的答案中有幾個鏈接。 – bryanmac

相關問題