Решение работает и / или лучше как универсальный "UIViewController auto-instantiator", но это ответ на вопрос как таковой.
отрим базовый класс UIViewController ...
class Rooms: UIViewController {
class func instantiate()->Rooms {
}
static func make()->Rooms {
let emplacedAndSetup = self.instantiate()
// various kodes here
// very likely put s.view somewhere
return emplacedAndSetup
}
sundryOtherFunctionality()
}
(Обратите вниманиеself.
доinstantiate()
что кажется необходимым для получения "этого" инстанциатора.)
Каждый подкласс знает свой собственный ID раскадровки, чтобы узнать, какinstantiateViewController
:
class Dining: Rooms {
override class func instantiate()->Dining { // returns a "Dining"
let d = stbd.instantiateViewController(
withIdentifier: "Some Specific Scene") as! Dining
return d
}
}
class Bath: Rooms {
override class func instantiate()->Bath { // returns a "Bath"
let b = stbd.instantiateViewController(
withIdentifier: "Some Other Scene") as! Bath
return b
}
}
Вы можете сделать это,
let d = Dining.make()
let r = Bath.make()
Единственная небольшая проблема - возвращает базовый класс.НО СМОТРИ НИЖЕ. Так что на практике вы должны
let d = Dining.make() as! Dining
let r = Bath.make() as! Bath
Есть ли способ изменить статическийmake
так что на самом делеDining.make()
вернетDining
а такжеBath.make()
вернетBath
?
(@Hamish указал, что можно использоватьinit
а такжеSelf
шаблон,Метод, который возвращает объект типа, который был вызван из Тем не менее, я думаю, что это невозможно из-заinstantiateViewController
, )
Так. Скажем, у вас есть код как
let d = Dining.make(blah blah)
по факту.Во время выполнения d превращается в «Столовую», а не в «Комнату»
это круто.
Но. Если вы делаете это в IDE
let d:Dining = Dining.make(blah blah)
он терпит неудачу - он думает, что это будет Комната,не столовая.
Итак, весь ваш код должен выглядеть так:
let d = Dining.make(blah blah) as! Dining
который отстой. Как исправить?
Заметка просто TBC, решение состоит в том, чтобы сделать статический тип обобщенным, как в ответе MartinR здесьhttps://stackoverflow.com/a/33200426/294884 Пример кода в ответе ниже.