Por que a saída do UICollectionViewCell é nula?

143

Criei um UICollectionViewCell personalizado no Interface Builder, vinculei visualizações à classe e, quando desejar usar e definir uma string para o rótulo da string, esse rótulo terá um valor nulo.

override func viewDidLoad() {
    super.viewDidLoad()

    // Register cell classes
    self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
}

override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {

    var cell: LeftMenuCollectionViewCell
    cell = collectionView.dequeueReusableCellWithReuseIdentifier("ls", forIndexPath: indexPath) as LeftMenuCollectionViewCell
    println(cell.label) // <- this is nil, why??
    cell.label.text = "asd"

    return cell
}

E a célula da subclasse:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}
János
fonte
Existe uma razão para você usar o "!" Explícito além de digitar nomes em todos os lugares? Parece redundante, especialmente nos IBOutlets. O único lugar que pode interessar é onde você desenfileirar a célula como LeftmenuCollectionViewCell, mas não a faz lá. Você pode imprimir a célula ou o próprio NSLog?
Mc01
1
Se eu remover "!" ou use "?" na definição de classe, recebo erro ou falha do compilador. "!" é o padrão quando você o vincula.
János
form a própria célula: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; quadro = (0 0; 180 50); camada = <CALayer: 0x7aa6f810 >>
János
Todas as lojas conectadas no IB? Os outros pontos de venda funcionam? Não vejo outros problemas óbvios, desculpe.
Mc01 #

Respostas:

310

Estou ligando self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")novamente. Se você estiver usando um storyboard, não deseja chamar isso . Ele substituirá o que você tem no seu storyboard.

Se você ainda tiver o problema, verifique reuseIdentifierse o mesmo está dentro dequeueReusableCellWithReuseIdentifier e dentro storyboard.

János
fonte
18
Obrigado! Passou mais de uma hora nisso, pois estava usando uma célula personalizada.
DogCoffee
Eu tenho o mesmo problema, mas nunca usei essa linha de código, você tem alguma idéia de por que recebo a mesma exceção?
Dekel Maman
obrigado. isso resolveu para mim. Eu tinha um storyboard e adicionei manualmente um controlador de exibição. o código padrão incluía a linha que você mencionou. embora parecesse correto (identificador e classe corretos), recusou-se a conectar as tomadas. agora funciona. doce!
Joris Weimar
13
Se você estiver usando um storyboard, não deseja chamar isso. Ele substituirá o que você tem no seu storyboard. <- Este realmente me ajuda
Sruit A.Suk
6
GAH, que coisa horrível de se ter no modelo UICollectionViewController !!!!! Janos, obrigado.
quer
53

Apenas remova esta linha:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
能 蟹 仔
fonte
3
Não entendo por que isso foi rejeitado. Esta foi a resposta para o meu problema.
Félix Simões
1
Essa é a resposta correta e deve ser marcada de acordo com a pessoa que fez a pergunta. Também seria ótimo para entender por que ela funciona :)
Kiko Lobo
3
Acho que foi diminuído porque a pergunta foi respondida em 14 de agosto ... enquanto essa resposta apenas copia a resposta novamente aqui, depois de vários meses.
Nitin Nain
1
Mas quando eu não usá-lo, dá-me erro de falha de declaração na - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
Shaheera
Uma explicação sobre por que essa linha não é necessária seria bem-vinda. Atualmente, é adicionado pelo padrão do Xcode para uma nova exibição de coleção.
Pkamb # 8/18
47

Se você estiver usando o xib, certifique-se de ter adicionado esta linha de código ao seu viewdidload.

Objetivo C:

[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"MyCellIdentifier"];

Rápido:

collectionView.register(UINib(nibName:"MyCell", bundle: nil), forCellWithReuseIdentifier:"MyCellIdentifier")
Vineeth
fonte
você precisa registrar a classe e a ponta, ou apenas a ponta é suficiente?
RainCast
3
Acabei de registrar a ponta e resolveu meus problemas.
Amelia
Parece que há duas maneiras de registrar e eu estava usando a incorreta ... collectionView? .Register (UINib (nibName: "YourItemClassName", pacote: nil), forCellWithReuseIdentifier: "yourIdentifier") collectionView? .Register (YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier")
Sergio
17

Tenho que registrar esse pessoal!

collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCellId")
Michael
fonte
6

Parece que há duas maneiras de me registrar e eu estava usando a primeira errada. Eu tenho uma visualização xib personalizada, registrada com a segunda opção, e temos dados!

1:

collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier") 

2:

collectionView?.register(UINib(nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")
Sergio
fonte
0

Eu tive um problema semelhante, mas meu erro foi não delegar o CollectionViewCell para poder alterar o texto do rótulo.

justRadojko
fonte
0

Eu acho que a melhor solução é usar diretamente do storyboard onde adicionar a CollectionView, em alternativa, você precisa remover a CollectionViewCelldo seu CollectionViewstoryboard e registrar uma célula com o seguinte comando:

collectionView? .register (UINib (nibName: "YourItemClassName", pacote: zero), forCellWithReuseIdentifier: "yourIdentifier")

dgalluccio
fonte