2010-01-16 9 views
11

Hola, estoy usando un control segmentado en una vista. Con la ayuda de este control segmentado, me gustaría mostrar en mi vista diferentes tablas. Supongamos que tengo dos segmentos en mi tabla al tocar el segmento 1. Me gustaría mostrar la tabla 1 y al tocar el segmento 2 que quisiera mostrar. tabla 2 mi tabla 1 es una tabla simple y la tabla 2 es una tabla agrupada, Apple está utilizando el enfoque para mostrar diferentes aplicaciones en diferentes categorías en la tienda de aplicaciones, pero no estoy seguro de cómo hacerlo. Por favor, sugiera que cualquier aproximación o cualquier muestra de código para la misma también se apruebe.¿Necesita un enfoque para mostrar las tablas usando un control segmentado?

Gracias arena

Respuesta

26

Hacemos esto por tener un solo tableview y, a continuación, hacer una instrucción if/caja en cada método de devolución de llamada tableview para devolver los datos correctos en base a qué valor se selecciona en el control segmentado.

En primer lugar, añadir el segmentedControl a la titleview, y establecer una llamada de retorno para cuando se 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; 
} 

A continuación, cuando se cambia el control segmentado, es necesario cargar los datos para el nuevo segmento y restablecer la vista de tabla para mostrar estos datos:

- (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]; 
    } 
} 

Luego, en sus devoluciones de llamada tableView, es necesario tener la lógica por valor de segmento para volver lo correcto. Le mostraré una devolución de llamada como ejemplo, pero implemente el resto de esta manera:

- (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; 
} 

Eso es todo, espero que ayude.

3

Otra alternativa es tener una vista de contenedor, que se agrega cualquiera que tableView esté actualizado como subvista. Incluso puede tener cada tabla en un controlador de vista diferente para mantener las cosas separadas, creando los controladores de vista de tabla y luego agregando .view como una subvista del contenedor, pero si lo hace tendrá que llamar manualmente al viewWillAppear y viewWillDisapear (que no es muy difícil ya que solo los llama cuando intercambia tablas cuando se toca el control segmentado).

+0

Esto es un salvavidas. Muchas gracias por la idea. – jakeboxer

+0

Además, no te olvides de reenviar la vista de Mostrar y ver la vista de Mostrar desde el controlador de vista principal al seleccionado actualmente. –

+0

Ok ... te llevé hasta este punto ... pero me perdiste. ¿Cómo reenvio viewWillAppear y viewWillDisappear? ¿Debo declarar removeFromSuperView en el método viewWillDisappear de la subvista cuando quiero retroceder? El código sería apreciado, si no inconveniente. –

Cuestiones relacionadas