Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Erro na referencia outlet de um textLabel em um arquivo .xib

Tenho a seguinte situação:

Tenho um view controller no storyboard que possuí um container view, preencho esse container com um arquivo xib (com sua classe UIViewController). Dentro do arquivo xib tenho um collection view e tenho outro xib (com sua classe UICollectionViewCell) com o layout da célula do collection, onde tenho dois textLabel.

No container consigo adicionar uma subview para o xib UIViewController e trazer o mesmo para dentro do container sem problemas, consigo também registrar minha célula no collection sem preblemas.

Seguindo essa idéia, estou com o seguinte problema. Conectei os textLabels corretamente, criando seus outlets, mas quando executo o app está quebrando nestas labels, trazendo uma exception de que minhas variáveis de referência (outlets) estão vindo nulas. Mesmo eu tendo certeza de que estão conectadas corretamente.

Alguém já passou por isso, ou que saiba resolver e que possa me ajudar?

5 respostas
solução!

Resolvido

O problema era que estava tentando registrar a classe da célula:

self.collection.register(MyCollectionViewCell.self, forCellWithReuseIdentifier: self.cellIdentifier)

Quando na verdade deveria criar um UINib e registrar o nib, desta forma:

let nib = UINib(nibName: "MyCollectionViewCell", bundle: nil)
self.collectionView.register(nib, forCellWithReuseIdentifier: self.cellIdentifier)

Pesquisei sobre a diferença dos dois usos e descobri que o primeiro exemplo deve ser usado quando contruimos nossos componentes visuais apenas pelo código, assim teríamos apenas a classe UICollectionCell, e no segundo caso (que é o correto para mim neste projeto) deve ser usado quando construimos nossa célula através de um arquivo nib.

Oi Marcos, como vai?

Eu já passei por isso hahaha

Provavelmente você está registrando a sua célula com essa inicialização:

inicialização da célula

Para resolver esse problema da label estar nil no método cellForItemAt da collection, tente fazer o seguinte:

  • Troque o método que registra a célula:

Ao invés do método acima, use esse:

trocando a o registro da célula

Deixe somente a célula no .xib que você usou para registrar no método acima

celula no arquivo .xib

Com essa implementação já deve funcionar.

Obs: Não sei se o padrão do seu projeto está sendo em usar mais .xibs mas eu particularmente prefiro trabalhar com ViewControllers e os elementos no storyboard, a manipulação dos elementos é mais fácil e identificar o fluxo de telas também...

Veja se funciona, e depois me conta ;]

Abs.

Ótimo, é isso mesmo!!

Boa tarde Ândriu.

Eu estou usando arquivos .xibs porque estou usando um segmented control com três abas. Aí coloquei uma view abaixo do segmented control, e dependendo de qual aba o cliente tiver, vai mostrar um xib diferente no lugar da view.

Como você usa o segmented control, substitui por diferentes views simples criadas no próprio storyboard?

Entendi Marcos,

Usando o storyboard eu montaria dessa forma:

imagem ilustrando navegação de tela com segmented controll

Repare que tem um container apontando para um navigation controller

Programaticamente eu consigo pegar a instancia do navigation controller através do método

override func prepare(for segue: UIStoryboardSegue, sender: Any?)

Aí o que eu faria é de acordo com o índice que o usuário selecionar no segmented control eu faço push para o respectivo ViewController