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.
fonte
2010-01-16 17:22:59
Questo è un vero toccasana. Grazie mille per l'idea. – jakeboxer
Inoltre, non dimenticare di inoltrare viewWillAppear e viewWillDisappear dal controller della vista principale a quello attualmente selezionato. –
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. –