Articles

Subclasse UIView personalizada de um arquivo xib

Vistas personalizadas com saídas & ações

Então a maneira correta de carregar vistas personalizadas de arquivos xib é algo como isto:

Dentro do seu objeto de vista personalizado, você instancia o arquivo xib exatamente da mesma maneira que eu lhe disse aqui em cima. 👆 A única diferença é que você não precisa usar o array de objetos retornado pelos métodos, mas você tem que conectar seus objetos de view através do construtor da interface, usando o Proprietário do Arquivo como ponto de referência, mais uma saída de view de container personalizada, que conterá tudo que você precisa. 🤨

// note: view object is from my previous tutorial, with autoresizing masks disabledclass CustomView: View { // this is going to be our container object @IBOutlet weak var containerView: UIView! // other usual outlets @IBOutlet weak var textLabel: UILabel! override func initialize() { super.initialize() // first: load the view hierarchy to get proper outlets let name = String(describing: type(of: self)) let nib = UINib(nibName: name, bundle: .main) nib.instantiate(withOwner: self, options: nil) // next: append the container to our view self.addSubview(self.containerView) self.containerView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate() }}

Então o método initialize aqui é apenas carregar o arquivo nib com o dono do self. Após o processo de carregamento terminar, os seus apontadores de saída serão preenchidos com os valores apropriados do ficheiro xib. Há uma última coisa que precisamos de fazer. Mesmo as vistas do ficheiro xib estão “programmaticamente” ligadas ao nosso objecto de vista personalizado, mas visualmente não estão. Portanto, temos de adicionar a nossa vista de contentor à hierarquia de vistas. 🤐

Se você quiser usar seu objeto de visualização personalizado, você só tem que criar uma nova instância a partir dele – dentro de um controlador de visualização – e finalmente sentir-se livre para adicioná-lo como uma subvisão!

Uma palavra sobre bounds, frames aka. springs e struts: f*ckng UGLY! Isso são duas palavras. Elas são consideradas como uma má prática, então por favor use o auto layout, tenho um bom tutorial sobre âncoras, elas são incríveis e aprendê-las leva cerca de 15 minutos. 😅

class ViewController: UIViewController { weak var customView: CustomView! override func loadView() { super.loadView() let customView = CustomView() self.view.addSubview(customView) NSLayoutConstraint.activate() self.customView = customView } override func viewDidLoad() { super.viewDidLoad() self.customView.textLabel.text = "Lorem ipsum" }}

É isso, agora você tem um objeto UIView personalizado completamente funcional que carrega um arquivo xib para usar o seu conteúdo. Não foi assim tão mau, certo? 🤪

Mais uma coisa a mais. Se você não gosta de lidar com visualizações programáticas ou simplesmente não quer mexer com o método loadView, basta removê-lo completamente. Em seguida, coloque a palavra-chave @IBOutlet bem antes da sua variável de classe de visualização personalizada. Abra seu storyboard usando IB, então arraste & solte um novo elemento UIView no seu controlador e conecte a saída de visualização personalizada. Ele deve funcionar como mágica. 💫

Eu prometi saídas e ações no cabeçalho desta seção, então vamos falar um pouco sobre as IBActions. Funcionam exactamente como seria de esperar com os controladores. Você pode simplesmente ligar um botão à sua view customizada e delegar a ação à classe view customizada. Se você quiser encaminhar toques ou ações específicas para um controlador, você deve usar o padrão de delegado ou ir com um simples bloco. 😎