Выполните родительский сегмент из встроенного контроллера просмотра

У меня есть это:

  • MyTableViewController (наследуется от UITableViewController)

    • Он имеет динамическое представление таблицы с несколькими ячейками (foo, bar, qux)

  • MyViewController (наследуется от UIViewController)

    • Есть несколько "показов" от этого контроллера к другим контроллерам представлений.
    • У этого есть UIContainerView, который включает MyTableViewController

Изображение говорит тысячу слов:

embedded uitableviewcontroller

Когда выбрана определенная ячейка, я хочу выполнить segue родительского представления (MyViewController)

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

Возможно ли это? что я должен использовать в «WHAT»?

Ответ 1

В prepareForSegue: для встроенного segue установите viewController в новом свойстве tableViewController, назовите его parentController. И тогда вам просто нужно позвонить self.parentController.performSegueWithIdentifier().

EDIT. Но прежде всего, возможно, вы можете использовать существующий parentViewController, если он содержит контроллер представления вложения.

Ответ 2

Вы можете захотеть использовать делегирование для решения этой проблемы, так как дочерний tableView не кажется, что он должен отвечать за segue. Например:

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

Ответ 3

Не нужно создавать свойство. Только это

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

Ответ 4

Вместо этого подключите ваш переход к встроенной ячейке контроллера табличного представления. Вы можете использовать разные сегменты на прототип клетки. Это избавляет вас от проверки путей индекса или даже от реализации didSelectRow.

Ответ 5

SWIFT 4

Swift 4 больше не имеет parentViewController. Вы должны использовать parent для доступа к родительскому объекту и является необязательным, поэтому обязательно проверяйте nil там, где это необходимо.

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

Ответ 6

Segue определяется от одного контроллера представления к другому и только вызывается из контроллера представления, в котором он определен. Поэтому вам нужно будет сохранить ссылку parentViewController.

Как от MyViewController

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

Теперь вы можете просто вызывать segues, например

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

Надеюсь, что это поможет