从嵌入式视图控制器执行父segue

时间:2015-06-03 18:37:11

标签: ios uicontainerview

我有这个:

  • MyTableViewController(继承自UITableViewController

    • 它有一个带有几个单元格的动态工作台视图(foo,bar,qux)

  • MyViewController(继承自UIViewController

    • 从此控制器到其他视图控制器有一些“show”segue
    • 它有一个嵌入MyTableViewController的UIContainerView

一张图片说千言万语:

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»中使用什么?

6 个答案:

答案 0 :(得分:8)

在嵌入式segue的prepareForSegue:中,在viewController的新属性中设置tableViewController,我们将其命名为parentController。然后你就可以打电话给self.parentController.performSegueWithIdentifier()

编辑:但首先,如果它包含嵌入视图控制器,您可以使用现有的parentViewController

答案 1 :(得分:3)

您可能需要考虑使用委托来解决此问题,因为子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)
    }
}

答案 2 :(得分:2)

无需创建属性。就这个

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

答案 3 :(得分:0)

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)

希望这有帮助

答案 4 :(得分:0)

将您的segues挂钩到嵌入式表格视图控制器。您可以为每个单元格原型使用不同的segue。这使您无需检查索引路径,甚至根本无法实现didSelectRow。

答案 5 :(得分:0)

SWIFT 4

Swift 4不再具有parentViewController。您必须使用parent来访问父对象,并且是可选的,因此请确保在必要时检查nil。

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