ti-enxame.com

Erro não pôde desenfileirar uma exibição do tipo UICollectionElementKindCell

Tomando o primeiro mergulho com visualizações de coleção e estou com esse erro:

Aplicativo de finalização devido à exceção não identificada 'NSInternalInconsistencyException', razão: 'não foi possível extrair uma visualização do tipo: UICollectionElementKindCell com identificador Cell - deve registrar uma ponta ou uma classe para o identificador ou conectar uma célula protótipo em um storyboard'

O código é muito simples, como mostrado abaixo. Eu não posso para a vida de mim descobrir o que é que eu estou perdendo. 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor]; 
return cell;
}

O controlador da visão de coleção foi criado usando uma ponta e os delegados e origens de dados são ambos definidos para o proprietário do arquivo. 

Exibir arquivo de cabeçalho do controlador também é muito básico. 

@interface NewMobialViewController_3 : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@end
24
Anti-Dentite

Na documentação UICollectionView para o método dequeque:

Importante: Você deve registrar um arquivo de classe ou nib usando o método registerClass: forCellWithReuseIdentifier: ou registerNib: forCellWithReuseIdentifier: antes de chamar este método.

32
jrturton

Você precisa usar o mesmo identificador entre o argumento dequeueReusableCellWithReuseIdentifier e a propriedade UICollectionViewCell.

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" forIndexPath:indexPath];

identifier

24
Kohei Mikami

Complementando o que @jrtuton escreveu ... O que você precisa é:

1) Registre seu arquivo de nib para "conectá-lo" ao seu identificador:

//MyCollectionView.m
- (void) awakeFromNib{
 [self registerNib:[UINib nibWithNibName:@"NibFileName" bundle:nil]   forCellWithReuseIdentifier: @"MyCellIdentifier"];
}

2) Use seu identificador para carregar sua célula personalizada de um bico:

//MyCollectionView.m
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath  *)indexPath {
    MyCustomCollectionViewCell* cell = [cv dequeueReusableCellWithReuseIdentifier:@"MyCellIdentifier" forIndexPath:indexPath];
}

3) Use sempre o NSString * estático para evitar os mesmos identificadores em seu aplicativo.

6
orafaelreis

eu tinha tudo feito 100% corretamente mas por algum motivo eu tenho o mesmo erro por uma hora, então o que eu fiz é:

  1. ir para o storyboard
  2. selecione a célula protótipo (no meu caso)
  3. limpe o nome da classe do inspetor de identidade e, em seguida, reescreva-o
  4. reescreva o nome do identificador no inspetor de atributos

simplesmente, refiz esta etapa mesmo que eu tenha corrigido antes, é como se o xcode perdesse algo em um nanossegundo específico!

2
Omar N Shamali

Swift4.0

Sempre que a sua UITableViewCell for xib nesse momento, você deverá registrar-se com UITableView.

override func viewDidLoad(){
    super.viewDidLoad()

    self.yourtableview.register(UINib(nibName: "yourCellXIBname", bundle: Bundle.main), forCellReuseIdentifier: "YourCellReUseIdentifier")
   }
1
Rakesh Patel

Eu sei que este é um antigo, mas eu experimentei o mesmo problema e queria compartilhar o que foi consertado para mim. 

No meu caso, eu declarei um identificador global

let identifier = "CollectionViewCell"

e teve que usarselfright antes de usá-lo:

collectionView.dequeueReusableCellWithReuseIdentifier(self.identifier, forIndexPath: indexPath) as! CollectionViewCell

Espero que isso ajude alguém :)

1
Jacob.B

Você precisa fornecer o identificador reutilizável correto no storyboard, que você forneceu no código ao registrar o collectionViewCell.

Aqui está o código. 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ClctnVC", for: indexPath)as! ClctnVC
    return cell            
}
0
Ayush Dixit

O que consertou isso para mim foi (aproximadamente) o mesmo que a resposta de Omar, exceto que acabei criando uma nova classe personalizada UICollectionViewCell e dando ao Identificador de Reutilização de Célula um nome novo/diferente daquele que eu havia usado em outro lugar no aplicativo. Funcionou imediatamente depois disso.

0
ciara staggs