2015-06-03 12 views
9

ho questo:Eseguire un segue genitore dal controller vista incorporata

  • MyTableViewController (eredita da UITableViewController)

    • Ha un Tableview dinamica con poche cellule (foo, bar, qux)

  • MyViewController (eredita da UIViewController)

    • Ci sono alcuni "show" sfocia da questo controller ad altri controller di vista
    • Ha un UIContainerView che incorpora MyTableViewController

un'immagine vale più di mille parole:

embedded uitableviewcontroller

Quando un certo c ell è selezionata, voglio eseguire un segue di vista padre (MyViewController)

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     if (indexPath.section == 1 && indexPath.row == 1) { 
       self.WHAT.performSegueWithIdentifier("someShowSegue1", sender: self) 
     } 
    } 

è possibile? cosa dovrei usare in «WHAT»?

risposta

8

Nel prepareForSegue: per i passaggi incorporati impostare viewController in una nuova proprietà nel proprio tableViewController, denominiamolo parentController. E poi dovrai chiamare lo self.parentController.performSegueWithIdentifier().

EDIT: Ma prima di tutto, forse è possibile utilizzare lo parentViewController esistente se contiene il controller di visualizzazione di incorporamento.

+3

Ogni controller di visualizzazione figlio può accedere direttamente ai propri genitori utilizzando parentViewController. Non dobbiamo chiamarlo, è già disponibile. Guarda l'intestazione di UIViewController :) – Sandeep

+0

Oh sì, è vero, ma è in sola lettura ... Lo rinominerò nella mia risposta. – Zaphod

+0

L'utilizzo di parentViewController è stato sufficiente. Anche se l'idea era buona :) – sports

0

Segue è definito da un controller di vista a un altro e viene richiamato solo dal controller di visualizzazione in cui è definito. Quindi è necessario memorizzare il riferimento di parentViewController.

Come da MyViewController

if ([segueName isEqualToString: @"embedseg"]) { 
    MyTableViewController * tblViewController = (MyTableViewController *) [segue destinationViewController]; 
    tblViewController.parentController=self; //Storing reference of parentViewController i.e MyViewController 
} 

Ora si può semplicemente richiamare segues come

self.parentController.performSegueWithIdentifier("someShowSegue1", sender: self) 

Spero che questo aiuti

3

Si consiglia di considerare l'utilizzo di delegazione per risolvere questo problema in quanto il bambino tableView non sembra che dovrebbe essere responsabile per il seguito. Ad esempio:

// MyViewController 
class MyViewController: UIViewController, MyTableViewControllerDelegate { 

    func selectedMyTableViewControllerCell(cell: UITableViewCell) { 
     // ... check cell type or index or whatever 
     self.performSegueWithIdentifier("someValueFromCellType", sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == myTableViewControllerIdentifier { 
      if let vc = segue.destinationViewController as MyTableViewController? { 
       vc.delegate = self 
      } 
     } 
    } 
} 

// MyTableViewController 
protocol MyTableViewControllerDelegate: class { 
    func selectedMyTableViewControllerCell(cell: UITableViewCell) 
} 

class MyTableViewController: UITableViewController { 
    weak var delegate: MyTableViewControllerDelegate? 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     // ... get the cell 
     delegate?.selectedMyTableViewControllerCell(cell) 
    } 
} 
0

Collegare invece i follower al controller di visualizzazione tabella incorporato. È possibile utilizzare diversi prototipi di segui per cella. Questo ti evita di controllare i percorsi dell'indice o addirittura di implementare didSelectRow.

0

Non è necessario creare una proprietà.Proprio questo

self.parent?.performSegue(withIdentifier: "ID", sender: self) 
Problemi correlati