2013-02-27 13 views
9

Chcę zbudować aplikację do nawigacji w hierarchii danych. Struktura tej hierarchii jest podobna do tej, którą pokazuję na poniższym obrazku. Oddział struktury może mieć więcej poziomów niż pozostałe.Uszczegółowić dane hierarchiczne za pomocą UITableView

enter image description here

Chciałbym drążenia tej struktury z TableViews tak:

A > AA > AAB > AABA 

lub

A > AB > ABA 

Co chciałbym wiedzieć, czy mogę mieć tylko jeden TableViewController w moim scenorysie i ponownie użyć go do wyświetlania każdego nowego poziomu danych? Nie chcę mieć połączonego ze sobą zestawu tableviewcontrollers w moim scenorysie, ponieważ nie jestem pewien, czy będę miał hierarchię 3, 4 lub 100 poziomów.

Odpowiedz

7

Aby powrócić do arbitralnej głębokości za pomocą tylko pojedynczego VC namalowanego w storyboardie, użyj storyboardu do pomalowania najwyższego poziomu: kontrolera nawigacyjnego z kontrolerem widoku tabeli w jego katalogu głównym. Tabela vc powinna być podklasą UITableView i mieć identyfikator storyboarda w storyboardie (powiedzmy "MyCustomTableVC").

Podaj właściwość publiczną MyCustomTableVC (powiedzmy, węzeł ModelItem *), która wskazuje, który węzeł w modelu powinien on reprezentować.

Zamiast storyboard segues, gdy vc stół dostaje didSelectRowAtIndexPath mają stworzyć kolejną instancję sobie ...

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                 bundle: nil]; 
// Imagine it's called MyCustomTableVC 
MyCustomTableVC *newVC = (MyCustomTableVC*)[mainStoryboard 
        instantiateViewControllerWithIdentifier: @"MyCustomTableVC"]; 

Ustaw model węzeł newVC do wybranej pozycji (elementu w modelu na indexPath .row), a następnie wcisnąć do niego ...

// making up a lot of stuff about your model here, but hopefully you get the idea... 
newVC.node = [self.model objectAtIndex:indexPath.row]; 
[self.navigationController pushViewController:newVC animated:YES]; 

podejście to ma tę zaletę, że dostajesz wszystkie zachowania kontroler nawigacyjny: animowane popycha i wyskakuje, tylne przyciski itp

+0

Próbowałem tego rozwiązania i działa, ale pasek nawigacji znika, więc nie mam możliwości powrotu do poprzedniego poziomu hierarchii. jakieś pomysły? – jarz

+0

Jedyne, co mogę wymyślić, to upewnić się, że robisz self.navigationController ** push **, nieobecny. – danh

+0

@danh co masz na myśli przez węzeł? Czy przypadkiem nie wiesz, jak to zrobić w szybkim 3? – Number1

1

Oczywiście, można ponownie użyć numeru UITableView. Model UITableView ma 2 podstawowe elementy: UITableViewDelegate i UITableViewDataSource.

UITableViewDelegate kontroluje dużo interakcji z tabelą i niektóre właściwości wyświetlania (heightForRowAtIndexPath i inne). Co się stanie, gdy wybierzesz wiersz. Czy możesz nawet wybrać wiersz?

UITableViewDataSource to studnia, źródło danych. Ile sekcji ma tabela? Ile wierszy w każdej sekcji? Jaka jest zawartość komórki w sekcji X, wiersz Y?

Można na przykład użyć tego samego UITableView i UITableViewDelegate dla każdej tabeli w hierarchii, ale zmień wartość UITableViewDataSource. Gdy chcesz zmienić źródło danych, można zrobić coś takiego ...

if (isSingingBand) { 
    self.tableview.dataSource = [TableABBADataSource alloc] init]; 
} else { 
    self.tableview.dataSource = [TableAABDataSource alloc] init]; 
} 
[self.tableview reloadData]; 

Apple's programming guide on Table Views powinien odpowiedzieć na wiele pytań, które napotkasz how realizacji.