11

Ho una vista tabella all'interno di un controller di visualizzazione. Posso popolare tutte le mie informazioni all'interno della vista tabella. Tuttavia sono un po 'perso per impostare le viste di dettaglio. Credo che ogni cella di una tabella abbia bisogno di un seguito per ogni vista di dettaglio ma non del tutto sicura.Passare a una vista di dettaglio da una tabella Visualizza cella utilizzando Xcode Storyboard

Ecco il mio codice. Cosa mi manca per completare i passaggi dalla vista tabella alle viste di dettaglio? Codice:

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

risposta

17

penso che hai fatto questo un po 'troppo complicato. Non preoccuparti, faccio spesso la stessa cosa.

Innanzitutto, inviando tableView:didSelectRowAtIndexPath: dall'interno di tableView:accessoryButtonTappedForRowAtIndexPath: non c'è differenza tra i due metodi. Toccando la cella, o il suo pulsante accessorio esegue la stessa azione. Se non è necessario il pulsante accessorio per eseguire un'azione diversa rispetto a toccare la cella stessa, rimuoverla.

In secondo luogo, se si utilizza uno storyboard, non è necessario allocare/initWithNib per i controller di visualizzazione. Invece, usa un seguito. Se si esegue questa operazione attraverso la storyboard, anche voi non c'è bisogno di spingere programmazione viewControllers sul vostro navigationController

Costruisci la tua storyboard prima:

  1. trascinare un'UITableViewController. Assicurati di impostare la classe di UITableViewController che hai trascinato sul tuo "DetailViewController" usando il pannello di controllo sul lato destro.
  2. Quindi selezionare questo controller e utilizzando i menu scegliere "Editor ->incorporare nel ->Navigation Controller".
  3. Quindi, trascinare tre generici UIViewControllers. Impostare la classe di uno su "LatteViewController", un altro su "EspressoViewController" e un terzo su "CapicinoViewController" (utilizzando di nuovo l'ispettore).
  4. Controllo + trascinamento da UITableViewController su ciascuno di questi viewController e scegliere PUSH.
  5. Fai clic sul piccolo cerchio che si trova sulla freccia tra il tuo UITableViewController e ciascuno di questi viewControllers. Nell'ispettore (sul lato destro), assegnare a ciascun passaggio un nome univoco nel campo Identificatore. Dovrai ricordare questo nome per il tuo codice. Li chiamerei "EspressoSegue", "LatteSegue" e "CapicinoSegue". Vedrai perché nel codice qui sotto.

quindi inserire il seguente codice nel tuo 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]]; 
} 

Come si implementa il resto sta a voi. Si consiglia di implementare prepareForSegue:sender: nel proprio UITableViewController e quindi utilizzare tale metodo per inviare le informazioni a segue.destinationViewController.

Nota che ho passato la stringa da contentArray come mittente per il seguito. Puoi passare quello che vuoi. La stringa che identifica la cella sembra essere l'informazione più logica da passare, ma la scelta spetta a te.

Il codice pubblicato sopra dovrebbe eseguire la navigazione per voi.

Problemi correlati