2010-01-16 12 views
11

Salve, ho usato un controllo segmentato su una vista. Con l'aiuto di questo controllo segmentato vorrei visualizzarli a diversi tavoli a mio avviso, Supponiamo di avere due segmenti nella mia tabella alla pressione del segmento 1 Vorrei visualizzare la tabella 1 e al tocco del segmento 2 che vorrei visualizzare tabella 2 la mia tabella 1 è una tabella normale e la tabella 2 è una tabella raggruppata, Apple sta utilizzando l'approccio per visualizzare le diverse app in diverse categorie nell'app store ma non sono sicuro di come farlo. Si prega di suggerire qualsiasi approccio o qualsiasi esempio di codice per lo stesso sarà anche appannaggio.Hai bisogno di un approccio per mostrare le tabelle usando il controllo segmentato?

Grazie Sandy

risposta

26

Facciamo questo avere un unico Tableview, e poi fare una dichiarazione if/caso in ogni metodo Tableview callback per restituire i dati corretti in base ai quali il valore è selezionato nel controllo segmentato.

In primo luogo, aggiungere il segmentedControl al titleView, e impostare una funzione di callback per quando si cambia:

- (void) addSegmentedControl { 
    NSArray * segmentItems = [NSArray arrayWithObjects: @"One", @"Two", nil]; 
    segmentedControl = [[[UISegmentedControl alloc] initWithItems: segmentItems] retain]; 
    segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; 
    segmentedControl.selectedSegmentIndex = 0; 
    [segmentedControl addTarget: self action: @selector(onSegmentedControlChanged:) forControlEvents: UIControlEventValueChanged]; 
    self.navigationItem.titleView = segmentedControl; 
} 

successivo, quando il controllo segmentato viene modificato, è necessario caricare i dati per il nuovo segmento , e ripristinare la vista tabella per mostrare questi dati:

- (void) onSegmentedControlChanged:(UISegmentedControl *) sender { 
    // lazy load data for a segment choice (write this based on your data) 
    [self loadSegmentData:segmentedControl.selectedSegmentIndex]; 

    // reload data based on the new index 
    [self.tableView reloadData]; 

    // reset the scrolling to the top of the table view 
    if ([self tableView:self.tableView numberOfRowsInSection:0] > 0) { 
     NSIndexPath *topIndexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
     [self.tableView scrollToRowAtIndexPath:topIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO]; 
    } 
} 

Poi, nel tuo callback Tableview, è necessario disporre di logica per valore segmento di restituire la cosa giusta. Ti mostrerò un callback come esempio, ma implementare il resto in questo modo:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"GenericCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"GenericCell" owner:self options:nil] objectAtIndex: 0]; 
    } 

    if (segmentedControl.selectedSegmentIndex == 0) { 
     cell.textLabel.text = @"One"; 
    } else if (segmentedControl.selectedSegmentIndex == 1) { 
     cell.textLabel.text = @"Two"; 
    } 
    return cell; 
} 

Questo è tutto, spero che sia d'aiuto.

3

Un'altra alternativa è avere una vista contenitore, che si aggiunge a quella che è la tableView corrente come sottoview. Puoi anche avere ciascuna tabella in un diverso controller di visualizzazione per mantenere le cose separate, creando i controller di visualizzazione tabella e aggiungendo .view come sottoview del contenitore, ma se lo fai dovrai chiamare manualmente viewWillAppear e viewWillDisapear (che non è molto difficile come si chiamano quando si scambiano le tabelle quando viene toccato il controllo segmentato).

+0

Questo è un vero toccasana. Grazie mille per l'idea. – jakeboxer

+0

Inoltre, non dimenticare di inoltrare viewWillAppear e viewWillDisappear dal controller della vista principale a quello attualmente selezionato. –

+0

Ok .. sei arrivato fino a questo punto ... ma mi hai perso. Come inoltro viewWillAppear e viewWillDisappear? Dichiaro removeFromSuperView nel metodo viewWillDisappear della sottoview quando voglio tornare indietro? Il codice sarebbe apprezzato, se non a disagio. –

Problemi correlati