11

Tengo una vista de tabla dentro de un controlador de vista. Puedo completar toda mi información dentro de la vista de tabla. Sin embargo, estoy un poco perdido para configurar las vistas de detalles. Creo que cada celda de la tabla necesita una transición a cada vista detallada, pero no del todo segura.Empujando a una vista de detalle desde una celda de vista de tabla usando Xcode Storyboard

Aquí está mi código. ¿Qué me falta para lograr el cambio de la vista de tabla a las vistas de detalle? Código:

.h 

@interface DetailViewController : UIViewController <UITableViewDelegate,UITableViewDataSource> 
{ 
    IBOutlet UITableView *myTable; 
    NSMutableArray *contentArray; 
} 

@property (strong, nonatomic) IBOutlet UITableView *myTable; 

.m 


- (void)viewDidLoad 
{ 
    contentArray = [[NSMutableArray alloc]init]; 
    [contentArray addObject:@"Espresso"]; 
    [contentArray addObject:@"Latte"]; 
    [contentArray addObject:@"Capicino"]; 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 

//Table Information 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [contentArray count]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath 
{ 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

    if([[contentArray objectAtIndex:indexPath.row]isEqualToString:@"EspressoViewController"]) 
    { 
     EspressoViewController *espresso = [[EspressoViewController alloc]initWithNibName:@"EspressoViewController" bundle:nil]; 
     [self.navigationController pushViewController:espresso animated:YES]; 
    } 
    else if ([[contentArray objectAtIndex:indexPath.row] isEqualToString:@"Latte"]) 
    { 
     LatteViewController *latte = [[LatteViewController alloc] initWithNibName:@"Latte" bundle:nil]; 
     [self.navigationController pushViewController:latte animated:YES]; 
    } 

} 

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    [self tableView:tableView didSelectRowAtIndexPath:indexPath]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"CellIdentifier"]; 
    } 

    NSString *cellValue = [contentArray objectAtIndex:indexPath.row]; 
    cell.textLabel.text = cellValue; 

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    cell.textLabel.font = [UIFont systemFontOfSize:16]; 
    cell.detailTextLabel.text = @"Hot and ready"; 

    UIImage *image = [UIImage imageNamed:@"coffeeButton.png"]; 
    cell.imageView.image = image; 

    cell.textLabel.text = [contentArray objectAtIndex:indexPath.row]; 
    return cell; 
} 

Respuesta

17

creo que hizo que fuera un poco demasiado complicado. No te preocupes, hago lo mismo a menudo.

En primer lugar, al enviar tableView:didSelectRowAtIndexPath: desde dentro de tableView:accessoryButtonTappedForRowAtIndexPath: no hay diferencia entre los dos métodos. Al tocar la celda, o su botón de accesorio realiza la misma acción. Si no necesita el botón de accesorio para realizar una acción diferente a tocar la celda, elimínela.

En segundo lugar, si está utilizando un guión gráfico, no necesita alloc/initWithNib para sus controladores de vista. En cambio, use un segue. Si lo hace a través del guión gráfico, usted también no necesita empujar programación viewControllers en su navigationController

Construir su guión gráfico primera:

  1. arrastre un UITableViewController. Asegúrese de configurar la clase del UITableViewController que arrastró a su propio "DetailViewController" utilizando el panel de inspectores en el lado derecho.
  2. A continuación, seleccione este controlador y el uso de los menús, seleccione "Editor -> Insertar En -> Controlador de Navegación ".
  3. A continuación, arrastre tres UIViewControllers genéricos. Establezca la clase de uno en "LatteViewController", otro en "EspressoViewController" y un tercero en "CapicinoViewController" (utilizando el inspector de nuevo).
  4. Controle + arrastre desde el UITableViewController a cada uno de estos viewControllers y elija PUSH.
  5. Haga clic en el pequeño círculo que se encuentra en la flecha entre su UITableViewController y cada uno de estos viewControllers. En el inspector (en el lado derecho), proporcione a cada segue un nombre único en el campo Identificador. Deberá recordar este nombre para su código. Yo los llamaría "EspressoSegue", "LatteSegue" y "CapicinoSegue". Verás por qué en el código a continuación.

continuación, poner el siguiente código en su UITableViewController:

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath*)indexPath { 

//Build a segue string based on the selected cell 
NSString *segueString = [NSString stringWithFormat:@"%@Segue", 
         [contentArray objectAtIndex:indexPath.row]]; 
//Since contentArray is an array of strings, we can use it to build a unique 
//identifier for each segue. 

//Perform a segue. 
[self performSegueWithIdentifier:segueString 
          sender:[contentArray objectAtIndex:indexPath.row]]; 
} 

¿Cómo se implementa el resto depende de usted. Puede implementar prepareForSegue:sender: en su UITableViewController y luego usar ese método para enviar información a segue.destinationViewController.

Tenga en cuenta que pasé la cadena de su contentArray como el remitente para el segue. Puedes pasar lo que quieras. La cadena que identifica la celda parece ser la información más lógica para pasar, pero la elección depende de usted.

El código publicado arriba debe realizar la navegación por usted.

Cuestiones relacionadas