我有这个:
MyTableViewController
(继承自UITableViewController
)
MyViewController
(继承自UIViewController
)
一张图片说千言万语:
当选择某个单元格时,我想执行父视图的segue(MyViewController
)
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if (indexPath.section == 1 && indexPath.row == 1) {
self.WHAT.performSegueWithIdentifier("someShowSegue1", sender: self)
}
}
有可能吗?我应该在«WHAT»
中使用什么?
答案 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
}
现在你可以简单地调用像
这样的seguesself.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)