«Попытайтесь представить VC на VC, чье представление не находится в иерархии окон!» когда кнопка нажата из таблицы - PullRequest
0 голосов
/ 05 января 2019

Пытаюсь построить мое первое приложение. Использование TableView для представления 4 различных разделов. Каждый раздел имеет свой тип ячейки, который определен в файле .xib. В последнем разделе TableView ячейка представлена ​​двумя кнопками, плюс и минус.

Когда, например, нажата кнопка плюс, она вызывает следующий код в классе, связанном с ячейкой:

// link to the viewcontroller with the tableview in it
let mainViewController = ViewController()

// func called when plusbutton is tapped
@IBAction func plusButtonTapped(_ sender: UIButton) {
    // viewcontroller that should popup when the button is tapped
    let popup = PopupViewController()
    let sbPopup = SBCardPopupViewController(contentViewController: popup)
    // call to show()
    sbPopup.show(onViewController: mainViewController)
}


// show() function that is called
public func show(onViewController viewController: UIViewController) {
        self.modalPresentationStyle = .overCurrentContext
        viewController.present(self, animated: false, completion: nil)
 }

Когда я нажимаю кнопку в симуляторе, должен появиться PopupViewController, но отображается следующее предупреждение:

 Warning: Attempt to present "balance1.SBCardPopupViewController:     0x7fdf8752cb20> on <balance1.ViewController: 0x7fdf8743cac0> whose view is not in the window hierarchy!

Я попытался исследовать предупреждение и нашел некоторые другие темы, связанные с ним. Ни одно из решений не сработало для меня. Может быть, это связано с тем, что я вызываю plusButtonTapped () из ячейки, определенной в файле .xib?

Я следовал этому руководству на YouTube: https://www.youtube.com/watch?v=9yUIOjykPDU Все шло хорошо до 10:36, где show () вызывается на том же VC, где живет кнопка, которая вызывает функцию. В моем случае plusButton, который вызывает функцию show (), живет в ячейке, определенной в отдельном файле .xib, и, следовательно, не в (главном) VC (как показано в руководстве). Это как-то связано с проблемой, с которой я сталкиваюсь?

1 Ответ

0 голосов
/ 05 января 2019

Сообщение об ошибке выглядит правильно. Просто глядя на ваш код, «висячий» mainViewController еще не был добавлен в окно.

// link to the viewcontroller with the tableview in it
let mainViewController = ViewController()

Этот комментарий над этой строкой, похоже, указывает на то, что это ссылка на родительский viewcontroller, но на самом деле это только что созданный экземпляр viewcontroller. Вам нужно будет передать фактического родителя по иерархии, чтобы добиться того, что вы пытаетесь.

Вы могли бы упростить себе задачу, если бы дали каждой ячейке своего рода «презентацию-представление», которая будет обрабатывать все представления карточек.

...