Выполните родительский сегмент из встроенного контроллера просмотра
У меня есть это:
Изображение говорит тысячу слов:
![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)
Надеюсь, что это поможет