Eu tenho uma classe chamada MyClass
que é uma subclasse de UIView
, que eu quero inicializar com um XIB
arquivo. Não sei como inicializar essa classe com o arquivo xib chamadoView.xib
class MyClass: UIView {
// what should I do here?
//init(coder aDecoder: NSCoder) {} ??
}
Respostas:
Eu testei esse código e funciona muito bem:
Inicialize a visualização e use-a como abaixo:
OU
UPDATE Swift> = 3.x & Swift> = 4.x
fonte
var view = MyClass.instanceFromNib()
&self.view.addSubview(view)
ao contrário devar view = MyClass.instanceFromNib
&self.view.addSubview(view())
. Apenas uma pequena sugestão para melhorar a resposta :)A solução de Sam já é ótima, apesar de não levar em conta pacotes diferentes (o NSBundle: forClass vem em socorro) e requer carregamento manual, também conhecido como código de digitação.
Se você deseja suporte completo para seus Xib Outlets, pacotes diferentes (use em estruturas!) E obtenha uma boa visualização no Storyboard, tente o seguinte:
Use seu xib como de costume, ou seja, conecte Outlets ao File Owner e defina a classe File Owner para sua própria classe.
Uso: basta subclassificar sua própria classe View de NibLoadingView e definir o nome da classe como Proprietário do arquivo no arquivo Xib
Não é mais necessário código adicional.
Créditos onde o crédito é devido: bifurcou-o com pequenas alterações de DenHeadless no GH. Minha essência: https://gist.github.com/winkelsdorf/16c481f274134718946328b6e2c9a4d8
fonte
nibSetup
deinit?(coder:)
causará uma recursão infinita se incorporadaNibLoadingView
em um XIB..clearColor()
- depois de carregá-la no Storyboard. Mas deve funcionar se você fizer isso por código após instanciar. De qualquer forma, como dito, uma abordagem ainda mais elegante é a baseada em protocolo. Então, com certeza, aqui está um link para você: github.com/AliSoftware/Reusable . Agora, estou usando uma abordagem semelhante em relação ao UITableViewCells (que eu implementei antes de descobrir esse projeto realmente útil). hth!A partir do Swift 2.0, você pode adicionar uma extensão de protocolo. Na minha opinião, essa é uma abordagem melhor porque o tipo de retorno é
Self
melhor queUIView
, portanto, o chamador não precisa transmitir para a classe view.fonte
var myView = nib.instantiate... as! myViewType
Swift 3
(XCode 8.0 beta 6) sem problemas. O erro ocorreuSwift 2
. Por que deveria ser outra resposta quando esta resposta é boa e usuários, provavelmente, como a busca, quais são as alterações quando eles vão usar XC8E esta é a resposta de Frederik no Swift 3.0
fonte
Maneira universal de carregar a vista do xib:
Exemplo:
Implementação:
fonte
Resposta Swift 3: No meu caso, eu queria ter uma saída na minha classe personalizada que pudesse modificar:
Quando estiver no .xib, verifique se o campo Classe personalizada é MyClassView. Não se preocupe com o proprietário do arquivo.
Além disso, certifique-se de conectar a tomada no MyClassView ao rótulo:
Para instanciar:
fonte
Swift 4
Aqui, no meu caso, tenho que passar dados para essa exibição personalizada, portanto, crio uma função estática para instanciar a exibição.
Criar extensão UIView
Criar MyCustomView
Defina a classe personalizada como MyCustomView no arquivo .xib. Conecte a tomada, se necessário, como de costume.
Instanciar visualização
fonte
fonte