2013-04-07 17 views
6

我剛纔意識到下面的代碼總是會創建一個新的TagsFeedViewController。這是segues的默認行爲嗎?有沒有辦法將iOS配置爲每次都不創建新的destinationViewController?prepareForSegue ** always **創建一個新的destinationViewController?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"showSearchResult"]) { 
     TagsFeedViewController *destViewController = segue.destinationViewController; 
     destViewController.query = query; 
    } 
} 
+1

是的所有segues,除了unwind segues創建viewcontrollers - 但是你用什麼segues,如果不是創建一個視圖控制器? – 2013-04-08 00:04:20

回答

1

是的,這是segues的默認行爲。有關更多信息,請參見post

+0

該鏈接不再有效 – CupawnTae 2017-08-01 10:54:17

17

Segues使用任何視圖控制器提供給它們的– initWithIdentifier:source:destination:方法。創建目標視圖控制器的不是segue,而是故事板。從the docs

通常,在故事板視圖控制器被實例化和 響應於 故事板本身內定義的操作自動創建。

所以,你有一些選擇:

  • 子類UIStoryboard。可能是一個糟糕的主意。 UIStoryboard的公共接口只有三種方法; 「故事板本身內定義的動作」並非公開的,我認爲沒有足夠的信息可以讓你做正確的工作。

  • 使您的目標視圖控制器成爲一個單身人士。也是一個壞主意。除了general badness that singletons bring with them之外,你不需要保留一個沒有視圖並且沒有子視圖控制器的視圖控制器。並且讓你的視圖控制器類成爲一個單例只是爲了欺騙UIStoryboard使用你的視圖控制器類的特定實例,看起來有點兒。。

  • 子類UIStoryboardSegue。如果您創建自己的segues,則可以在– initWithIdentifier:source:destination:中執行您喜歡的操作,包括忽略提供的目標視圖控制器並使用您想要的目標視圖控制器。這仍然看起來像對框架的工作,這通常是一個糟糕的計劃,但如果你絕對必須使用目標視圖控制器的特定實例,這似乎是一個更好的方法。

  • 請隨流。最好的選擇。想想你希望延續到現有視圖控制器的原因。考慮是否有更好的方法來實現你想要的而不必顛覆框架。例如,你是否想使用現有的視圖控制器,因爲它已經有一些特定的狀態?也許最好是在模型中保持這種狀態,而不是在視圖控制器中。

0

您可以通過處理shouldPerformSegueWithIdentifier:sender:消息來阻止創建控制器。

-(BOOL) shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 
{ 
    if ([identifier isEqualToString:@"showSearchResult"]) { 
     return [self.results count] > 0; 
    } 
    return YES; 
} 
+1

似乎這樣可以防止通過阻止執行繼續來創建控制器。我不認爲這是OP想要完成的。 – Caleb 2013-04-09 06:03:28

+0

@Caleb我可能誤解了這個問題,但是我沒有理由在沒有控制器的情況下執行segue(當然,除非它是放鬆) – Tassos 2013-04-09 07:14:16

+1

我認爲OP想要使用segue來呈現現有的視圖控制器,而不是創建新的每次一個。 – Caleb 2013-04-09 07:20:33