2012-09-01 2 views
9

Attualmente ho un'applicazione con due controller di vista. Il primo è un controller di visualizzazione con una tabella incorporata con celle dinamiche. Il secondo è un controller di visualizzazione tabella con celle statiche. Se aggiungo un seguito dalla selezione di una delle celle della tabella dinamica al controller della vista tabella statica (usando l'impostazione di stile Push o Modal), posso vedere che il seguito funziona come previsto. Tuttavia, quando cambio lo stile per Popover ottengo il seguente errore di compilazione:Il popover passa alla cella statica UITableView causa l'errore di compilazione

Couldn't compile connection: <IBCocoaTouchOutletConnection:0x4004c75a0 <IBProxyObject: 0x400647960> => anchorView => <IBUITableViewCell: 0x400f58aa0>> 

Qualcun altro ha funzionato in questo problema, o qualcuno sa che cosa questo messaggio di errore potrebbe significare? Sembra strano che ciò avvenga in fase di compilazione a meno che un controller di visualizzazione tabella statica non sia supportato in un Popover ...

risposta

15

Ho capito come farlo. Non si può collegarlo dallo storyboard, ma può fare a livello di codice in questo modo:

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

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" 
               bundle:nil]; 
    UITableViewController *detailController = [sb instantiateViewControllerWithIdentifier:@"TableSettingDetails"]; 

    self.popoverController = [[UIPopoverController alloc] initWithContentViewController:detailController]; 

    self.popoverController.popoverContentSize = CGSizeMake(320, 416); 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    [self.popoverController presentPopoverFromRect:cell.bounds inView:cell.contentView 
          permittedArrowDirections:UIPopoverArrowDirectionAny 
              animated:YES]; 
} 

Basta fare in modo di avere un riferimento al vostro popover nel controllore, altrimenti si otterrà immediatamente smaltiti - causando qualche altro interessanti eccezioni.

+0

Per quanto preferirei che ciò accadesse nello storyboard (IB), questo ha funzionato per me, grazie! – Joe

+0

Post molto utile! Grazie – Rahul

+0

Votato come molto utile, ma non è più valido in iOS 10 - Ho aggiunto il codice iOS 10 pertinente come risposta separata, ma se vuoi incorporarlo nella risposta accettata, @ lehn0058, vai avanti, e io cancellerò la mia risposta – Grimxn

2

Devi scegliere un punto di ancoraggio per quel Popover che NON è la cella statica. Il mio suggerimento è di mettere un set UIButton invisibile (tipo personalizzato). Quindi selezionare la Segover Popover e trascinare la connessione Anchor su quel pulsante.

+0

Il punto di ancoraggio per il popover è una delle celle dinamiche. Toccando quella cella è ciò che fa apparire il popover con la tabella di celle statiche. – lehn0058

+0

Vedo che aggiungere un pulsante alla vista principale e impostarlo mentre l'ancora elimina l'errore di compilazione, ma il mio popover non punta alla cella corretta nella tabella. Spostando il pulsante sulla cella si ripresenta lo stesso errore di compilazione. – lehn0058

+0

A questo punto, non è possibile ancorare un popover a una cella di visualizzazione tabella statica. –

0

A partire da iOS 10, la risposta corretta e accettata di @ lehn0058 non funziona più. Ecco la sua soluzione aggiornata per iOS 10 ...

override func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) { 
    // *** Next line doesn't work with popover, only full screen detail 
    //self.performSegue(withIdentifier: "editRow", sender: self) 
    // Hence, do it by hand... 
    let sb = UIStoryboard(name: "Main", bundle: nil) 
    let detailVC: MyDetailViewController = sb.instantiateViewController(withIdentifier: "itemEditor") as! MyDetalViewController 
    detailVC.modalPresentationStyle = .popover 
    detailVC.popoverPresentationController?.sourceView = tableView.cellForRow(at: indexPath) 
    detailVC.detailItem = self.itemAtIndexPath(indexPath) 

    self.present(detailVC, animated: true, completion: {}) 
}