Этот код находится внутри контроллера дочернего представления

@IBAction func send(_ sender: UIButton) {


    let parentVC = (self.navigationController?.parent)! as! sendController

    parentVC.sendText.text = ""

    self.removeFromParentViewController()
    self.view.removeFromSuperview()

}

При нажатии кнопки приложение вылетает с ошибкой «EXC_BAD_INSTRUCTION code i386»

Правильно ли я ссылаюсь на родительский контроллер представления?

0
Omar Alhadidy 25 Июл 2017 в 09:52
Что вы имеете в виду под «родителем»? Находится ли этот контроллер представления внутри контейнерного представления «родительского», или вы имеете в виду предыдущий контроллер представления в стеке навигации? Вы получаете сбой из-за принудительного разворачивания и опускания; либо self.navigationController?.parent равно nil, либо не sendController. Если вам нужен родительский элемент, вряд ли вам нужен родительский элемент контроллера навигации; Контроллер навигации не будет в виде контейнера
 – 
Paulw11
25 Июл 2017 в 09:54
В классе sendController у меня есть этот код: let vc = self.storyboard? .instantiateViewController (withIdentifier: "alertController") as! alertController self.addChildViewController (vc) self.view.addSubview (vc.view) @ Paulw11
 – 
Omar Alhadidy
25 Июл 2017 в 10:05
Итак, вы на самом деле как бы добавляете представление контроллера представления в качестве дочернего элемента. Вам следует прочитать документацию по UIViewController, поскольку она позволяет узнать, что вам нужно делать при добавлении дочернего контроллера представления; в частности, вам нужно позвонить didMoveToParent(). Вы должны иметь возможность сказать self.parent не self.navigationController.parent, поскольку здесь не задействован контроллер навигации.
 – 
Paulw11
25 Июл 2017 в 10:09

2 ответа

Кроме того, если был представлен контроллер представления (под этим я подразумеваю, что он не проталкивается через контроллер навигации), вы можете получить доступ к родительскому элементу с этим свойством в Swift:

self.presentingViewController

Вот документация об этом свойстве: https://developer.apple.com/ документация / uikit / uiviewcontroller / 1621430-presentingviewcontroller

1
Mavi 7 Сен 2018 в 22:54

Вы можете получить доступ к родительскому контроллеру представления как self.parent в Swift 3.

0
AkhilaHaridas 25 Июл 2017 в 10:00
Я попытался использовать self.parent.mylabel, но он не может получить доступ к нему или другим выходам
 – 
Omar Alhadidy
25 Июл 2017 в 10:07
Вы не можете использовать self.parent.mylabel напрямую, поскольку self.parent имеет тип UIViewController - вам нужно назначить self.parent переменной и уменьшить ее, как вы пытались в своем коде
 – 
Paulw11
25 Июл 2017 в 10:10
Я думаю, было бы лучше, если бы вы объявили протокол внутри контроллера дочернего представления и установили родительский элемент в качестве его делегата. Затем вы можете общаться с родительским классом, используя методы протокола.
 – 
AkhilaHaridas
25 Июл 2017 в 10:19