Специализированная реализация ViewConrtoller от storyobard - PullRequest
0 голосов
/ 09 марта 2020

У меня есть специализированный ViewController ViewModel, подобный этому:

final class MyViewConrtoller<MyViewModel>: UIViewController {
    var viewModel: MyViewModel?

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Я устанавливаю тип ViewController в InterfaceBuilder. Затем я пытаюсь создать его экземпляр следующим образом:

guard let myViewController = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "MyViewController") as? MyViewController<MyViewModel> else { return }

И похоже, что приведение не удалось. Экземпляр действительно создан (до приведения), но когда он пытается его разыграть, возвращается ноль.

Есть ли что-то, что я пропускаю?

РЕДАКТИРОВАТЬ:

Глядя дальше, я нашел интересное решение, которое собираюсь опробовать. Вот ссылка для тех, кому это может понадобиться:

Ссылка раскадровки на UIViewController с Generi c

1 Ответ

1 голос
/ 09 марта 2020

Как насчет того, чтобы создать базовый класс, как показано ниже, и использовать подкласс внутри раскадровки.

class MyBaseViewController<MyViewModel> : UIViewController {
    var viewModel: MyViewModel?
}

final class MyViewConrtoller: MyBaseViewController<MyViewModel> {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Теперь используйте это как:

 private func LoadMyViewContrller() {
        guard let myViewController = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "MyViewController") as? MyViewConrtoller else { return }

        myViewController.viewModel = yourViewModel
        myViewController.loadView()

    }
...