2010-12-03 8 views
7

Für das acani iPhone App, würde ich Anzeigegruppen (basierend auf Interessen) in einem UITableView mögen. Ich möchte die Gruppen taxonomisch, zB organisieren:iPhone UITableView Nested Abschnitte

  • Sports
    • Bat-and-Ball
      • Baseball
      • Softball
      • Cricket
    • Eishockey
      • Fi eld Eishockey
      • Eishockey
      • Rollhockey
  • Technik
    • Elektrotechnik
    • Bioverfahrenstechnik

Wie soll ich arrangieren dies auf einem UITableView?

Ich denke, dass es eine Wurzel UITableView sein, die in den Abschnitten Sport & Engineering und die Zellen Bat-and-Ball & Hockey unter dem Sportteil werden müssen, und die Zellen Elektrotechnik & Bioverfahrenstechnik wird Unter der Rubrik Technik sein.

Dann Bat-and-Ball sollte seine eigene UITableView, haben die Zellen Baseball, Softball, und Cricket haben sollte.

Klingt das wie ein guter Weg, um die Benutzeroberfläche zu arrangieren?

Haben Sie Beispielcode oder Links zu Xcode Beispielcode für eine UI wie diese haben? Es muss ein Xcode-Beispielprojekt geben, das so etwas tut. Vielleicht das Periodensystem der Elemente Projekt oder Core Data Books?

Danke!

Matt

Antwort

6

Sie haben es. A UITableView ist wirklich nicht entworfen, um mehr als zwei Ebenen einer Hierarchie als Abschnitte und Zeilen anzuzeigen. Wenn Sie mehr als zwei Ebene zeigen wollen, einen „Drill-down“ -Ansatz verwendet, in den meisten (alle?) IOS-Anwendungen, wo eine Zeile tippen stellt einen weiteren UITableView auf dem Navigationsstapel. (Wie Sie sagen.)

Es gibt viele Apple-Beispielcode Projekte, die dieses Entwurfsmuster verwenden.

Edit: nur überprüft und DrillDownSave ist ein gutes Beispiel, wie auch SimpleDrillDown.

+0

Ja, das würde ich auch empfehlen. –

+0

Danke, Jungs! :) – ma11hew28

+1

Links funktioniert nicht – Nazir

4

Der Trick, verschachtelte Abschnitte zu haben, besteht darin, zwei Arten von Zeilen in der Tabellenansicht zu haben. Eine für die zweite Ebene der Abschnitte und eine weitere für die normalen Zeilen in der Tabellenansicht.Nehmen wir an, Sie haben ein Array mit zwei Ebenen (zB Abschnitte), um die Elemente in Ihrer Tabellenansicht darzustellen.

Dann ist die Gesamtzahl der Abschnitte, die wir haben, nur die Anzahl der Abschnitte auf oberster Ebene. Die Anzahl der Zeilen in jedem Abschnitt auf oberster Ebene wäre die Anzahl der Unterabschnitte + die Anzahl der Zeilen in jedem Unterabschnitt.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return self.sections.count; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSArray *sectionItems = self.sections[(NSUInteger) section]; 
    NSUInteger numberOfRows = sectionItems.count; // For second level section headers 
    for (NSArray *rowItems  in sectionItems) { 
        numberOfRows += rowItems.count; // For actual table rows 
    } 
    return numberOfRows; 
} 

nun alles, was wir brauchen, darüber nachzudenken, wie die Zeilen für die Tabellenansicht zu erstellen. Richten Sie im Storyboard zwei Prototypen mit verschiedenen Wiederverwendungskennungen ein, einen für den Abschnittskopf und einen weiteren für den Zeileneintrag, und instanziieren Sie den richtigen, basierend auf dem angeforderten Index in der Datenquellenmethode.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSMutableArray *sectionItems = self.sections[(NSUInteger) indexPath.section]; 
    NSMutableArray *sectionHeaders = self.sectionHeaders[(NSUInteger) indexPath.section]; 
    NSIndexPath *itemAndSubsectionIndex = [self computeItemAndSubsectionIndexForIndexPath:indexPath]; 
    NSUInteger subsectionIndex = (NSUInteger) itemAndSubsectionIndex.section; 
    NSInteger itemIndex = itemAndSubsectionIndex.row; 

    if (itemIndex < 0) { 
        // Section header 
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SECTION_HEADER_CELL" forIndexPath:indexPath]; 
        cell.textLabel.text = sectionHeaders[subsectionIndex]; 
        return cell; 
    } else { 
        // Row Item 
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ROW_CONTENT_CELL" forIndexPath:indexPath]; 
        cell.textLabel.text = sectionItems[subsectionIndex][itemIndex]; 
        return cell; 
    } 
} 

- (NSIndexPath *)computeItemAndSubsectionIndexForIndexPath:(NSIndexPath *)indexPath { 
    NSMutableArray *sectionItems = self.sections[(NSUInteger) indexPath.section]; 
    NSInteger itemIndex = indexPath.row; 
    NSUInteger subsectionIndex = 0; 
    for (NSUInteger i = 0; i < sectionItems.count; ++i) { 
        // First row for each section item is header 
        --itemIndex; 
        // Check if the item index is within this subsection's items 
        NSArray *subsectionItems = sectionItems[i]; 
        if (itemIndex < (NSInteger) subsectionItems.count) { 
            subsectionIndex = i; 
            break; 
        } else { 
            itemIndex -= subsectionItems.count; 
        } 
    } 
    return [NSIndexPath indexPathForRow:itemIndex inSection:subsectionIndex]; 
} 

Here's a detailed post wie Sie dies tun.

Verwandte Themen