Как сделать sh новый контроллер представления из представления - PullRequest
0 голосов
/ 04 августа 2020

Я создал представление в .xib. На нем я разместил кнопку, на которой хочу открыть другой ViewController. Я назначил этому ViewController раскадровку. Но я не могу установить sh новый контроллер, как решить эту проблему?

Мой код:

class MyView: UIView {
...
   @IBAction func buttonPressed(_ sender: Any) {
        let storyboard = UIStoryboard.init(name: "ViewController", bundle: Bundle.init())
        let vc = storyboard.instantiateViewController(withIdentifier: "VC") as! ViewController
        let navigationController = UINavigationController.init()
        navigationController.pushViewController(vc, animated: true)
   }
...
}

class ViewController: UIViewController {
...
}

Xcode выдает эту ошибку:

'Не удалось найти раскадровку с именем' ViewController '

, но я проверил, нет ли ошибок. Перезагрузил Xcode - безрезультатно.

Ответы [ 4 ]

0 голосов
/ 04 августа 2020

Вам следует еще раз проверить имя файла раскадровки, потому что, когда вы хотите инициировать UIViewController из файла раскадровки, параметр name в инициации UIStoryboard должен быть точно таким же, как имя файла раскадровки.

@IBAction func buttonPressed(_ sender: Any) {
    // Let's say that you have a Storyboard file named ViewController.storyboard and a UIViewController class named ViewController.swift
    let destinationVC = UIStoryboard(name: "ViewController", bundle: nil).instantiateViewController(withIdentifier: "VC") as! ViewController
    self.navigationController?.pushViewController(destinationVC, animated: true)
}

Надеюсь, это поможет в вашей проблеме

0 голосов
/ 04 августа 2020

Кажется, у вас несколько проблем.

  1. Вы пытаетесь превратить sh a UIViewController в не представленный UINavigationController
  2. Вы создаете экземпляр из UIStoryboard с неправильным идентификатором

Сначала вам нужно выбрать правильный UIStoryboard, который, как я предполагаю, это main , затем вы должны представить UINavigationController из держатель UIViewController или пытается получить sh от этого UIViewController, если он имеет UINavigationController,

Часть 1: Исправление экземпляров,

let storyboard = UIStoryboard.init(name: "main", bundle: Bundle())
let vc = storyboard.instantiateViewController(withIdentifier: "VC") as! ViewController
let navigationController = UINavigationController(rootViewController: vc)

Теперь у вас есть a navigationController, который содержит ваш VC

Часть 2: вы хотите представить эту навигацию из вашего холдинга VC, вы можете либо добавить слушателя к UIButton из этого VC и представить / pu sh оттуда

, так что давайте обернем это и создадим функцию в вашем VC, которая содержит UIView

@objc func pushToMyVc() {
let storyboard = UIStoryboard.init(name: "main", bundle: Bundle())
let vc = storyboard.instantiateViewController(withIdentifier: "VC") as! ViewController
let navigationController = UINavigationController(rootViewController: vc)
}

И в вашем UIView добавьте эту переменную var selector: (() -> Void)?

Теперь в @IBAction func buttonPressed вызовите эту функцию selector?()

Теперь все, что нам нужно, это передать, какую функцию я хочу использовать, когда эта кнопка получит в нашем случае щелкнул функцию pushToMyVC, которую мы поместили в наш основной UIViewController, поэтому в нашем didLoad или где бы вы ни вызывали это настраиваемое представление

установите селектор следующим образом

myView.selector = pushtoMyVC

Боковое примечание: вы не можете представить / pu sh UIViewController из не UIViewController классов

0 голосов
/ 04 августа 2020

Попробуйте изменить способ получения раскадровки с

let storyboard = UIStoryboard.init(name: "ViewController", bundle: Bundle.init())

на

let storyboard = UIStoryboard(name: "ViewController", bundle: nil)

, обратите внимание, что идентификатор раскадровки должен быть точно ViewController.

Если это по-прежнему показывает ту же ошибку, я бы сказал, что у вас проблема с целевым членством в раскадровке, поэтому проверьте это в инспекторе файлов в правой части редактора Xcode.

0 голосов
/ 04 августа 2020

вы должны вернуть делегата к viewController, который содержит текущее представление, и вызвать navigationController.pu sh оттуда

...