2012-01-01 156 views
7

首先,有一點背景。我對iOS開發很陌生,很久以來我一直在.NET網站上,這可能就是爲什麼我甚至會問這個問題,但這裏就是這樣。將數據從一個視圖控制器傳遞到另一個視圖控制器; iOS <= 4 vs iOS 5

基本設置是這樣的。你有一個UINavigationControllerRootViewController我們會打電話給MasterViewController。當此MasterViewController發生某些操作時,我們想要鑽入DetailsViewController。但是,我們也想將一些數據傳遞給DetailsViewController

這是我的理解,這在SDK的早期版本(之前的iOS 5)的方法是類同的:

@implementation MasterViewController 

    -(IBAction)someAction 
    { 
     DetailsViewController *dvc = [[DetailsViewController alloc]initWithNibName:@"DetailsView" bundle:nil]; 
     dvc.someDataProp = [self getSomeDataSomeHow]; 
     [[self navigationController] pushViewController:dvc animated:YES]; 
    } 

@end 

然而現在,在iOS 5中,似乎這是現在做使用Storyboard並繼續。在Xcode中設置了從MasterViewController的SEGUE到DetailsViewController,然後在代碼中你做這樣的事情:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    [segue.destinationViewController setSomeDataProp:[self getSomeDataSomeHow]]; 
} 

我的問題基本上是這樣的:舊的做法在某種程度上感覺更清潔了很多給我。您正在非常明確地指出要推進導航堆棧的ViewController類型,並且您可以輕鬆地設置屬性。但在新方法中,destinationViewController的類型爲id(出於顯而易見的原因),它對我來說感覺不那麼幹淨。再次,這可能是我的.Net方面出來,但這在iOS中很常見?只需使用身份證,並謹慎對待風?

+1

非常尊重質疑如何做到這一點,而不是簡單地複製和粘貼片段。我也有類似的問題,並在這裏有一些經驗是我的答案:在iOS5中,我看到UI邏輯被分成兩部分:1)ViewController生命週期和轉換2)數據流。Storyboard負責1,開發人員需要照顧2.在這種情況下,這些演員將會發生。對我而言,問題是,這種分裂是否有意義?這兩個概念可以分離嗎?我猜蘋果會這樣,我們會看到它是如何運作的。 – Guven 2012-04-10 16:17:32

回答

6

通過故事板,您可以爲segue指定一個已命名的標識符, 選擇segue並在屬性檢查器中爲segue標識符添加名稱。

而在prepareForSegue方法中,您應該檢查此標識符,因此您將明確知道哪個segue將要執行以及destinationViewController將是什麼。

​​
+0

更好,但你仍然有那麼醜。這是首選的方法嗎? – BFree 2012-01-01 17:25:20

+0

這是首選的方法。你是對的,舊的方式更清晰,更明確。用這種新方法,你可以「接入」故事板。不幸的是,只有在故事板中才能找到的新功能並未進入XIB設計器,例如新的靜態和動態UITableView設計器支持。 – 2012-01-01 22:24:16

+1

是在'prepareForSegue'方法中插入了這段代碼嗎? – chwi 2012-07-31 08:54:05

4

在許多情況下,對於一個賽格瑞目的地視圖控制器可以是UINavigationViewController,在這種情況下,溶液(上面丹尼斯Mathews的溶液輕微的修改)將需要使用消息‘topViewController’ :

if ([segue.identifier isEqualToString:@"My First Segue Identifier"]) 
{  
    NavitationViewController* navController = [segue destinationViewController]; 
    DetailsViewController *dvc = (DetailsViewController*) [navController topViewController] 
    // Set the DVC's properties 
} 
+0

這對我來說伎倆,除了我認爲你的意思是「UINavigationController * navController」而不是「NavitationViewController * navController」。 – mpemburn 2012-06-25 23:27:42

1

我沒有一直與iOS設備上的長,但我已經看到了幾個例子,說明你沒有投,因爲Objective-C的鬆散耦合的消息系統。

而不是檢查SEGUE標識符或強制轉換爲特定的ViewController的,你可以這樣做:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.destinationViewController respondsToSelector: @selector(setCompany:)]) { 
     [segue.destinationViewController performSelector: @selector(setCompany:) withObject: self.company]; 
    } 
} 

在第一行中我問,如果destinationViewController有一個方法setCompany(如果你有一個名爲物業公司這一個會爲你生成)。如果是這樣,您可以調用該方法/使用第二行代碼設置該屬性。

因此,在這種情況下,您並不需要知道目標ViewController,並且可以輕鬆地將其替換爲支持處理公司的另一個。

相關問題