Storyboard cellules statiques: dequeueReusableCellWithIdentifier retourne nil

utilisant le storyboard, cellules statiques, dans cellForRowAtIndexPath: la ligne

UITableViewCell *cell = 
   [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

renvoie toujours nil .

j'ai vérifié ce qui suit:

  • L'Identificateur de la cellule est correctement défini dans IB/Storyboard et j'utilise le même identificateur dans le code. J'ai vérifié à de nombreuses reprises.
  • Je n'ai pas instancié le contrôleur de vue ailleurs (qui était le problème dans ce stackoverflow question ).

mon contrôleur de vue est une sous-classe de UITableViewController , bien sûr, enveloppé dans un ad hoc contrôleur de navigation dans storyboard. Soupçonnant que mon contrôleur de vue ne sait pas d'une façon ou d'une autre sur les identificateurs de cellules définis dans storyboard parce que cela pourrait être une autre instance, voici le code que le "instanciates" lui. Dans prepareForSegue: , j'utilise

CustomViewController *vc = [[[segue destinationViewController] 
   viewControllers] objectAtIndex:0];

autres les personnalisations du contrôleur de vue faites ici(définition des propriétés etc.) fonctionne très bien.

j'utilise des cellules statiques parce que le nombre de sections et de lignes ne change pas, et chaque cellule contient du texte statique (et d'autres contrôles ou champs de texte à éditer).

il me semble qu'il s'agit d'une tâche très courante (personnaliser les cellules statiques à partir du storyboard dans les méthodes de source de données du contrôleur de vue). Ce que je fais mal?

21
demandé sur Community 2012-04-03 16:52:26

5 réponses

avec du contenu statique dans une vue de table, vous n'implémentez aucune des méthodes de source de données (y compris tableView:cellForRowAtIndexPath: , donc vous n'obtiendriez jamais la valeur des cellules. Il n'y a pas de déqueuing pour les contenus statiques (dans lesquels vous pouvez de toute façon vous impliquer).

Si vous voulez obtenir un pointeur sur une cellule particulière:

  • obtenir à partir de l'affichage de la table à l'aide de cellForRowAtIndexPath: :

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    
  • avoir une sortie vers la cellule spécifique et la personnaliser directement.

  • itérez à travers les cellules et vérifiez la propriété reuseIdentifier pour obtenir la cellule qui vous intéresse.

L'une de ces choses peut se faire en vue ou similaire.

si vous voulez avoir un contenu complètement différent dans vos cellules de celui trouvé sur le storyboard, alors les cellules statiques ne sont probablement pas le bon choix. Vous devriez utilisez des prototypes dynamiques (notez que vous pouvez avoir plusieurs prototypes dans le storyboard) avec les méthodes traditionnelles de sources de données à la place.

44
répondu jrturton 2012-04-03 13:30:15

la solution était d'utiliser des cellules prototypes plutôt que des cellules statiques. Je donne toujours le chèque à @jrturton car il a été le premier qui m'a donné l'idée.

une autre erreur intéressante que je viens de résoudre: avec des prototypes de cellules de type" Custom", si vous essayez de remplir cell.textLabel de texte, il ne fera que fonctionner automatiquement, mais tous vos autres subviews se comportent très étrangement. Je viens d'utiliser mon étiquette personnalisée maintenant, et tout fonctionne bien.

santé, merci tout le monde pour les aider.

0
répondu Mundi 2012-04-03 14:48:57

Différente de la réponse ci-dessus,

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

ne marchera pas. Mais la méthode mentionnée pour créer une sortie vers le cell lui-même fonctionne.

il est également possible de placer des vues telles que UIButtons ou UITextFields sur le cell et avoir des débouchés pour ceux-ci ainsi.

les Deux méthodes peuvent également être utilisées en combinaison. Par exemple: régler le cell.textLabel.text pour une cellule particulière et avoir un autre contrôle qui sera accessible à partir de la prise de contrôle.

0
répondu Marcus 2015-06-28 07:54:05

dans le storyboard, les cellules statiques ne peuvent pas appliquer les méthodes du protocole <UITableViewDataSource> .

donc vous pouvez utiliser les méthodes qui sont inclus dans <UITableViewDelegate> .

0
répondu s1ro6 2016-01-07 18:22:26

vous pouvez toujours utiliser les méthodes source de données/délégué de la statique UITableView , vous n'avez tout simplement pas à créer nouvelles cellules.

si vous voulez modifier des cellules avec les méthodes de source de données, à l'intérieur de cellForRowAtIndexPath: :

UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];

et ensuite commencer à modifier la cellule.

0
répondu farzadshbfn 2016-07-26 15:20:16