簡體   English   中英

在Segues與ViewController之間傳遞數據的最佳方法

[英]Best way to pass data between ViewController with segues

我閱讀了一些有關使用segues將數據從ViewController傳遞到另一個的教程。

常見的方法不是很好,恕我直言:源ViewController可以獲取對目標ViewController的引用,以便可以在目標ViewController中設置一些屬性。 但是,源ViewController知道目標ViewController的某些部分這一事實必然會減少對象之間的去耦。

我想知道是否可能有像這樣的更通用的方法:

  • 源ViewController執行segue並打包一個NSDictionary,其中包含要發送的數據(如NSNotifications一樣),而無需了解目標ViewController的特定屬性
  • 目的地ViewController可以訪問NSDictionary,並且可以填充其自己的數據結構。

有人知道這是否可能嗎?

prepareForSegue:sender:是使用情節提要板時將數據從一個視圖控制器傳遞到另一個視圖控制器的首選方法。 觀看去年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:調用

這是觀點,但我認為視圖控制器不符合面向對象的要求。

視圖控制器非常特定於單個應用程序的體系結構,通常不打算用於一般用途。 至少在我看來,廣義類與為僅一種方式使用一個應用程序而明確設計的類之間存在明顯的區別。

高度耦合的視圖控制器使代碼更簡單。 類的解耦是降低代碼復雜性的指導原則。 如果您的去耦導致復雜性增加,那么這違背了指南的意圖。

因此,可以更直接地回答:我認為,在視圖控制器之間傳遞數據的最好方法是讓發送視圖控制器知道接收視圖控制器的接口,並將其直接傳遞給變量。 否則可以認為是過早的優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM