从嵌入式视图控制器执行父 segue
Perform a parent segue from the embedded view controller
我有这个:
MyTableViewController
(继承自UITableViewController
)
- 它有一个带有几个单元格(foo、bar、qux)的动态表视图
MyViewController
(继承自UIViewController
)
- 从该控制器到其他视图控制器有一些 "show" 转接
- 它有一个嵌入 MyTableViewController 的 UIContainerView
一张图说一千个字:
选中某个单元格后,我想对父视图进行segue(MyViewController
)
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if (indexPath.section == 1 && indexPath.row == 1) {
self.WHAT.performSegueWithIdentifier("someShowSegue1", sender: self)
}
}
可能吗?我应该在 «WHAT»
中使用什么?
在 prepareForSegue:
中为您的嵌入式 segue 在 tableViewController
的新 属性 中设置 viewController
,我们将其命名为 parentController
。然后你只需调用 self.parentController.performSegueWithIdentifier()
.
编辑:但首先,如果它包含嵌入视图控制器,也许您可以使用现有的parentViewController
。
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)
希望对您有所帮助
您可能需要考虑使用委托来解决此问题,因为子 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)
}
}
改为将您的 segue 连接到嵌入式 table 视图控制器的单元格。您可以为每个单元格原型使用不同的转场。这使您无需检查索引路径,甚至根本无需实施 didSelectRow
。
无需创建 属性。就是这个
self.parent?.performSegue(withIdentifier: "ID", sender: self)
SWIFT 4
Swift 4 不再有parentViewController。您必须使用 parent 来访问父对象,并且是可选的,因此请务必在必要时检查 nil。
self.parent?.performSegue(withIdentifier: "IdentifierHere", sender: self)
我有这个:
MyTableViewController
(继承自UITableViewController
)- 它有一个带有几个单元格(foo、bar、qux)的动态表视图
- 它有一个带有几个单元格(foo、bar、qux)的动态表视图
MyViewController
(继承自UIViewController
)- 从该控制器到其他视图控制器有一些 "show" 转接
- 它有一个嵌入 MyTableViewController 的 UIContainerView
一张图说一千个字:
选中某个单元格后,我想对父视图进行segue(MyViewController
)
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if (indexPath.section == 1 && indexPath.row == 1) {
self.WHAT.performSegueWithIdentifier("someShowSegue1", sender: self)
}
}
可能吗?我应该在 «WHAT»
中使用什么?
在 prepareForSegue:
中为您的嵌入式 segue 在 tableViewController
的新 属性 中设置 viewController
,我们将其命名为 parentController
。然后你只需调用 self.parentController.performSegueWithIdentifier()
.
编辑:但首先,如果它包含嵌入视图控制器,也许您可以使用现有的parentViewController
。
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)
希望对您有所帮助
您可能需要考虑使用委托来解决此问题,因为子 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)
}
}
改为将您的 segue 连接到嵌入式 table 视图控制器的单元格。您可以为每个单元格原型使用不同的转场。这使您无需检查索引路径,甚至根本无需实施 didSelectRow
。
无需创建 属性。就是这个
self.parent?.performSegue(withIdentifier: "ID", sender: self)
SWIFT 4
Swift 4 不再有parentViewController。您必须使用 parent 来访问父对象,并且是可选的,因此请务必在必要时检查 nil。
self.parent?.performSegue(withIdentifier: "IdentifierHere", sender: self)