2013-04-07 8 views
6

Po prostu zdałem sobie sprawę, że poniższy kod zawsze tworzy nową funkcję TagsFeedViewController. Czy to domyślne zachowanie segues? Czy istnieje sposób, aby skonfigurować iOS, aby za każdym razem nie tworzył nowego kontrolera miejsca docelowego?prepareForSegue ** always ** tworzy nowy obiekt docelowyViewController?

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

Tak, wszystkie seguy oprócz rozwijania segues create viewcontrollers - ale do czego służą segues, jeśli nie do stworzenia kontrolera widoku? –

Odpowiedz

1

Tak, jest to domyślne zachowanie dla sekwencji. Więcej informacji można znaleźć w post.

+0

łącze nie jest już ważne – CupawnTae

17

W przypadku segmentów stosuje się dowolne kontrolery widoku do ich metod – initWithIdentifier:source:destination:. To nie segue tworzy kontroler widoku docelowego, ale scenorys. Od the docs:

Normalnie, widok kontrolerów w serii ujęć są wystąpienia i tworzone automatycznie w odpowiedzi na działania określone w samej serii ujęć .

Więc masz kilka opcji:

  • Podklasa UIStoryboard. Prawdopodobnie zły pomysł. Publiczny interfejs UIStoryboard ma tylko trzy metody; "Działania zdefiniowane w samym scenariuszu" nie są publiczne i nie sądzę, że istnieje wystarczająca ilość informacji, które pozwolą ci prawidłowo wykonywać tę pracę.

  • Ustaw kontroler widoku docelowego jako singleton. Również zły pomysł. Oprócz general badness that singletons bring with them nie powinno się przechowywać kontrolera widoku, który nie ma widoków i nie ma kontrolerów widoku podrzędnego. Sprawienie, że kontroler widoku klasy będzie singletonem tylko po to, aby oszukać tablicę UIStoryboard przy użyciu konkretnego wystąpienia klasy kontrolera widoku, wydaje się dość kpiący.

  • Podklasa UIStoryboardSegue. Jeśli tworzysz własne segues, możesz robić, co chcesz w – initWithIdentifier:source:destination:, w tym ignorowanie podanego kontrolera widoku docelowego i używanie tego, którego chcesz. Wydaje się, że wciąż działa to wbrew ramom, a to zwykle jest kiepski plan, ale jeśli koniecznie musisz użyć konkretnej instancji kontrolera widoku docelowego, wydaje się, że jest to lepszy sposób.

  • Idź z prądem. Najlepsza opcja. Zastanów się, dlaczego masz zamiar przenieść się do istniejącego kontrolera widoku. Zastanów się, czy mogą istnieć lepsze sposoby na osiągnięcie tego, czego chcesz, bez konieczności niszczenia struktury. Na przykład, czy chcesz użyć istniejącego kontrolera widoku, ponieważ ma on już określony stan? Być może lepiej byłoby utrzymać ten stan w swoim modelu, a nie w kontrolerze widoku.

0

Można zapobiec tworzeniu kontrolera, posługując się komunikatem shouldPerformSegueWithIdentifier:sender:.

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

Wygląda na to, że uniemożliwisz stworzenie kontrolera, uniemożliwiając wykonanie segue. Nie sądzę, że to właśnie OP próbował osiągnąć. – Caleb

+0

@Caleb Być może źle zrozumiałem to pytanie, ale nie widzę powodu, aby przeprowadzać segue bez kontrolera (chyba że jest to oczywiście reszta). – Tassos

+1

Myślę, że OP chce użyć segue do przedstawienia istniejącego kontrolera widoku zamiast tworzenia nowego za każdym razem. – Caleb