2015-06-03 18 views
9

mam to:Przeprowadzić segue rodzica z wbudowanego kontrolera widoku

  • MyTableViewController (dziedziczy od UITableViewController)

    • Ma dynamiczny tableview z kilku komórek (foo, bar, qux)

  • MyViewController (dziedziczy z UIViewController)

    • Istnieje kilka "show" segues z tego regulatora do innych kontrolerów widoku
    • Ma UIContainerView który osadza MyTableViewController

obraz mówi więcej niż tysiąc słów:

embedded uitableviewcontroller

Kiedy określony c wybrano ell, chcę wykonać segue widoku nadrzędnego (MyViewController)

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

Czy to możliwe? co powinienem użyć w «WHAT»?

Odpowiedz

8

W prepareForSegue: dla osadzonego segue ustawić viewController w nowej nieruchomości w swojej tableViewController, nazwijmy go parentController. A potem będziesz musiał zadzwonić pod numer self.parentController.performSegueWithIdentifier().

EDIT: Ale przede wszystkim, może można wykorzystać istniejącą parentViewController jeśli zawiera kontroler widoku osadzanie.

+3

Każdy kontroler widoku dziecka może bezpośrednio uzyskać dostęp do obiektu nadrzędnego za pomocą parentViewController. Nie musimy tego nazywać, jest już dostępna. Przejrzyj nagłówek UIViewController :) – Sandeep

+0

O tak, to prawda, ale jest to tylko do odczytu ... Zmieniam nazwę w mojej odpowiedzi. – Zaphod

+0

Rzeczywiście użycie parentideadaptera było wystarczające. Chociaż pomysł był dobry :) – sports

0

Segue jest definiowany z jednego kontrolera widoku do innego i jest wywoływany tylko z kontrolera widoku, w którym jest zdefiniowany. Więc musisz zapisać referencję parentViewController.

jak z MyViewController

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

teraz po prostu można powołać segues jak

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

nadzieję, że to pomaga

3

Można rozważyć użycie delegację, aby rozwiązać ten problem, ponieważ dziecko Tableview nie wydaje się, żeby to on był odpowiedzialny za segue. Na przykład:

// 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

Zamocuj swoje seagulls do wbudowanego kontrolera widoku tabeli. Możesz użyć różnych segues na prototyp komórki. To pozwala zaoszczędzić na sprawdzaniu ścieżek indeksu, a nawet na wdrażaniu didSelectRow.

0

Nie trzeba tworzyć nieruchomości.Właśnie ten

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