2012-05-06 59 views
2

我閱讀了一些關於使用segues將數據從ViewController傳遞到另一個的教程。在Segmentation之間傳遞ViewController數據的最佳方式

通常的做法不太好,恕我直言:源碼ViewController可以獲取對目標ViewController的引用,以便它可以在目標ViewController中設置一些屬性。但是源代碼ViewController知道目標ViewController的某個部分必然會減少對象之間的解耦。

我想知道是否有可能這樣的一個較普遍的辦法:

  • 源視圖控制器執行賽格瑞和包一個NSDictionary 包含它想要發送的數據(如NSNotifications辦) ,不知道目標ViewController的具體屬性
  • 目標ViewController可以訪問NSDictionary並且它可以用 填充它擁有的數據結構。

任何人都知道這是否可能?

回答

0

這是意見,但我很頭腦,視圖控制器不符合面向對象的純度。

視圖控制器對於單個應用程序的體系結構非常具體,通常不適合一般消費。至少在我看來,廣義類和類之間有明顯的區別,這些類只爲一種應用程序使用而設計。

強耦合視圖控制器使代碼更簡單。爲了減少代碼的複雜性,類的解耦是一個指導原則。如果你的解耦導致複雜性增加,那麼它違背了準則的意圖。

所以要更直接地回答:我相信在視圖控制器之間傳遞數據的最佳方式是讓發送視圖控制器知道接收視圖控制器的接口並直接將變量傳遞給變量。否則可能被認爲是不成熟的優化。

1

prepareForSegue:sender:是使用故事板時將數據從一個視圖控制器傳遞到另一視圖控制器的首選方法。觀看Storyboard session from last year's WWDC;你會看到Apple也推薦這種方法。

爲了重申sobri的說法,視圖控制器代碼通常包含應用程序的「業務邏輯」,因此通常是應用程序中可重用程度最低的代碼。在撰寫本文時,我在應用商店中有7個應用程序,並且我從未重複使用過任何重要的視圖控制器代碼。

如果您想提供最細微的抽象(例如,避免對目標視圖控制器的硬依賴),您可以如下所示。我的應用程序中有幾乎這個確切的代碼。

- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender 
{ 
    if([[segue identifier] isEqualToString:@"showLog"]) { 
     UIViewController* logView = segue.destinationViewController; 
     if([logView respondsToSelector:@selector(setManagedObjectContext:)]) { 
      [logView setValue:self.managedObjectContext forKey:@"managedObjectContext"]; 
     } 
    } 
} 

你可以做一本字典類似的東西,使用NSKeyValueCodingsetValuesForKeysWithDictionary:。我可能只是使用multiple setValue:forKey:來電,我自己

相關問題