2012-01-12 17 views
44

Witam Mam scenorys i jestem w stanie pokazać szczegółowy widok po kliknięciu komórki tabeli. Chcę dodać dodatkową funkcjonalność, aby w zależności od tego, którą komórkę kliknę, pokazywam inny kontroler widoku. Próbowałem przeciągnąć dwa segues z tej samej komórki, ale na to nie pozwala.IOS StoryBoard wiele Segue z TableCell

Moje myślenie było, że mam dwie Segue Jest z celi każdy wskazuje na inny widok, a następnie wywołać pożądany segue:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    NSInteger row = indexPath.row; 
    NSLog(@"Selected Item :-) %@",[NSString stringWithFormat:@"%@",[myData objectAtIndex:row]]); 
    if(row %2 ==0){ 
     NSLog(@"Even");   
     [self performSegueWithIdentifier:@"ShowSecondIndex" sender:self]; 
    }else{ 
     [self performSegueWithIdentifier:@"ShowSelectedMovie" sender:self]; 
     NSLog(@"Odd"); 

    } 

} 

bym wtedy obsłużenia segue w prepareForSegue

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 

    NSLog(@"Prepare For Segue ID:%@",[segue identifier]); 

    if([[segue identifier] isEqualToString:@"ShowSelectedMovie"]){ 
     Tab2_ItemViewController *vc = [segue destinationViewController]; 
     NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row]; 
     NSLog(@"Selected Index: %d",selectedIndex); 
     [vc setSelectedItem: [NSString stringWithFormat:@"%@",[myData objectAtIndex:selectedIndex]]]; 
     NSLog(@"String Value: %@",[NSString stringWithFormat:@"%@",[myData objectAtIndex:selectedIndex]]); 
     [vc setSelectedIndex:selectedIndex]; 


    }else if([[segue identifier] isEqualToString:@"ShowSecondIndex"]){ 

     NSLog(@"Viewing Second Index"); 
    } 

} 

Jednak nigdy nie pokazuje drugiego widoku. Jest tak, ponieważ nie można uzyskać dwóch seguesów z jednej komórki tabeli. Próbowałem również przeciągnąć obie segue z kontrolera do każdego miejsca docelowego, a nie jednego z komórki i jednego ze sterownika, ale nie ma szczęścia?

+2

@casperOne - Dlaczego zamknąć to? Jeśli nie rozumiesz pytania, zignoruj ​​je. Jest to BARDZO częste pytanie dotyczące osób próbujących korzystać ze scenorysów. Proszę zamknąć się. – Adam

+1

Uzgodnione całkowicie. Z pewnością zostało to zamknięte przez przypadek? Proszę odłączyć. – Tim

+0

Ditto. Prawdopodobnie zostało to zamknięte przez pomyłkę. –

Odpowiedz

60

Nie próbuj podłączyć Segów do tableviewcell w tym przypadku. Podłącz je do kontrolera View.

+0

Próbowałem tego, ale nadal nie ma szczęścia, tylko jeden z widoków został nazwany – Bear

+12

To musi zadziałać. Robię to cały czas. Usuń teraz Segues, które masz do tego VC, i dodaj je ponownie, upewniając się, że łączysz każdą zmianę z samym VC. Następnie możesz wywołać [self performSegueWithIdentifier: @ "segueID" sender: nil]; na stronie didSelectRowAtIndexPath. –

+4

Słodki! Nie wiedziałem, że możesz mieć segue z kontrolera widoku, myślałem, że mogliby tylko wyjść z podobnego przycisku lub podobnego. :) Lubię teraz sepy. – DonnaLea

40

Nie próbuj tworzyć wielu seguesów z TableCell do innych kontrolerów widoku, które chcesz ctrl + przeciągnąć z ikony kontrolera widoku pod kontrolerem widoku w interfejsie storyboardu do kontrolerów widoków, które chcesz przenosić. Następnie pozwoli ci ustawić wiele segues.

screenshot showing multiple segues

a następnie do faktycznie uczynić segues pracować, trzeba dodać identyfikatory do segues się, co można zrobić poprzez kliknięcie na nich, a następnie nadając jej nazwę w Inspektorze właściwości:

giving segue an identifier

następnie, na przykład TableCells w twojej UITableViewDelegate, w

-tableView:didSelectRowAtIndexPath: 

można użyć , aby ręcznie rozpocząć segue w zależności od własnej logiki tego, co należy wybrać.

+0

To jest najlepsza odpowiedź, ponieważ Kreator interfejsów z Storyboards nie jest super intuicyjny. Wiedząc, gdzie kontrolujesz, kliknij * od * jest kluczem :) – smoothlandon

+0

Dziękujemy za opisanie dokładnie, jak to zrobić w IB! – kjw0188

4

Oto przykładowy kod z mojego projektu demonstracyjnego:

-   (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *segueName = nil; 

    if (type == kCore) { 
     segueName = @"segue1"; 
    } else if (type == kStdlib) { 
     segueName = @"segue2"; 
    } 

    [self performSegueWithIdentifier: segueName sender: self]; 
} 

type jest własnością kontrolera widoku, który określa, które segue powinny być wykonywane.

Jak wspomniano w powyższej odpowiedzi, kluczem jest utworzenie przejścia między dwoma kontrolerami widoku.

1

w Swift 3.1, ze sterowaniem segmentowym dwóch państw

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
var segue: String! 
if selectedSegment == 0 { 
    segue = "segue1" 
} else { 
    segue = "segue2" 
} 
self.performSegue(withIdentifier: segue, sender: self) 

}

Powiązane problemy