Desculpas se isso foi perguntado antes, eu pesquisei muito e muitas respostas são de versões beta do Swift anteriores, quando as coisas eram diferentes. Não consigo encontrar uma resposta definitiva.
Quero criar uma subclasse UIViewController
e ter um inicializador personalizado que me permita configurá-lo no código facilmente. Estou tendo problemas para fazer isso no Swift.
Quero uma init()
função que possa usar para passar um específico NSURL
que irei usar com o controlador de visualização. Em minha mente, parece algo assim init(withImageURL: NSURL)
. Se eu adicionar essa função, ele me pedirá para adicionar a init(coder: NSCoder)
função.
Acredito que isso seja porque está marcado na superclasse com a required
palavra - chave? Então eu tenho que fazer isso na subclasse? Eu adiciono:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
O que agora? Meu inicializador especial é considerado convenience
um? Um designado? Devo chamar um superinicializador? Um inicializador da mesma classe?
Como adiciono meu inicializador especial a uma UIViewController
subclasse?
fonte
Respostas:
fonte
ViewController()
,ViewController(imageURL: url)
ou carregá-lo a partir de um storyboard.required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
contráriosuper.init(coder: aDecoder)
, estava recebendo o erro de Propriedadeself.someProperty
não inicializada nasuper.init
chamadainit(coder: aDecoder)
. OfatalError
bastam vontadePara aqueles que escrevem UI em código
fonte
Isso é muito semelhante às outras respostas, mas com alguma explicação. A resposta aceita é enganosa porque sua propriedade é opcional e não expõe o fato de que você
init?(coder: NSCoder)
DEVE inicializar cada propriedade e a única solução para isso é ter umfatalError()
. No final das contas, você poderia escapar tornando suas propriedades opcionais, mas isso não responde verdadeiramente à pergunta do OP.Você basicamente tem que ABANDONAR o carregamento do storyboard. Por quê?
Porque quando você chama um viewController,
storyboard.instantiateViewController(withIdentifier: "viewController")
então o UIKit fará seu trabalho e chamaráVocê nunca pode redirecionar essa chamada para outro método init.
No entanto, para viewController criado programaticamente ou viewControllers criados com nib, você pode redirecionar essa chamada conforme mostrado acima.
fonte
Eles estão documentados aqui .
fonte
Se precisar de um init personalizado para um popover, por exemplo, você pode usar a seguinte abordagem:
Crie um init customizado que usa o super init com nibName e bundle e depois acesse a propriedade de visualização para forçar a carga da hierarquia de visualização.
Então, na função viewDidLoad você pode configurar as visualizações com os parâmetros passados na inicialização.
fonte