2017-03-27 3 views
1

Je ne suis pas sûr de manquer quelque chose de très basique ou si c'est juste un autre problème rencontré avec Swift UITableview s. Mon problème est que je référence une cellule dans la vue de la table (dans ce cas la section 4 rangée 0) et pour une raison quelconque, swift me donne une erreur hors limites avec un index (6) qui ne devrait jamais exister parce que la taille de la section devrait seulement être 4 le journal n'a jamais montré un 5 (lors de l'impression positionCounter dans la boucle while). Toute aide serait grandement appréciée Je ne sais pas pourquoi j'obtiendrais une valeur de 6 dans ce cas s'il vous plaît laissez-moi savoir si vous avez besoin de moi pour fournir un code supplémentaire ou clarifier quelque chose.Des index apparemment aléatoires provoquent des erreurs hors limite lors du référencement d'une cellule dans une vue de table

Message d'erreur

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 5]' 

Le code entourant l'erreur

cell = tableView.dequeueReusableCell(withIdentifier: "Item Card", for: indexPath) 
      var positionCounter = 0 

      while positionCounter < eventSettingsTableView.numberOfRows(inSection: 4) { 
       print(positionCounter) 
       print(String(eventSettingsTableView.numberOfSections) + " NUMBER OF SECTIONS") 
       print(String(eventSettingsTableView.numberOfRows(inSection: 4)) + " NUMBER OF ROW IN SECTION 4") 

       if eventSettingsTableView.cellForRow(at: IndexPath(row: 0, section: 4)) != nil { 
        print("no") 
       } else { 
        print("yes") 
       } 
       positionCounter = positionCounter + 1 
      } 
      positionCounter = 0 

J'ai réduit l'erreur à cette ligne (en changeant la section de 4 à 3 fixe l'erreur mais n'explique pas pourquoi positionCounter était toujours 6)

if eventSettingsTableView.cellForRow(at: IndexPath(row: 0, section: 4)) != nil { 

EDIT - Désolé oublié de mentionner que ce code se trouve dans la fonction cellForRowAt pour mon UITableView

+0

Pourriez-vous poster le code de votre contrôleur de vue entier? – carlos21

+0

@ carlos21 le contrôleur de vue est assez complexe et probablement trop long à poster ici est-il une section particulière du code contrôleur de vue dont vous avez besoin? – XvKnightvX

+0

Veuillez indiquer 'numberOfRowsInSection' et' numberOfSections' – Paulw11

Répondre

1

Il semble que vous appelez de l'intérieur cellForRowAt:cellForRowAt:. Cela va causer des problèmes en fonction de la situation. Vous voudrez peut-être regarder la mise en œuvre de manière différente logique suivante:

if eventSettingsTableView.cellForRow(at: IndexPath(row: 0, section: 4)) != nil { 
    print("no") 
} else { 
    print("yes") 
} 

Mise à jour:

Comme @ PaulW11 souligne, appelle cellForRowAt: de la tableview à partir de la source de données cellForRowAt: ne devrait pas être un problème. Et il a raison.

Cependant, j'ai mis en place un projet de démonstration pour étudier le problème et supprimer l'appel à cellForRowAt: mais en conservant les résultats de boucle dans le crash ne se produisant pas. De plus, j'ai mis en place un tableau statique de données et j'ai remarqué que le crash n'était pas dû à une condition aux limites, car alors que le tableau était long de 9 éléments, j'ai eu des problèmes de limites. Donc, pour l'instant, je soupçonne que ce problème est dû à une sorte de condition de synchronisation/course où cellForRowAt: est appelé plusieurs fois dans une boucle et quelque chose devient bancal . Mais qu'est-ce que "quelque chose" est, je ne sais pas. Si quelqu'un a des idées, je serais vraiment intéressé d'en entendre parler puisque c'est une question intéressante ...

+1

Vous ne savez pas pourquoi cela aurait été voté parce que cela semble être la cause probable du problème, essayez de prendre une autre approche qui n'appelle pas infiniment cellForRowAt. – XvKnightvX

+1

J'ai vu beaucoup de gens faire des downvotes sur le SO. Je ne pense pas qu'ils ont même lu les réponses. J'ai abandonné en essayant de comprendre pourquoi: D Mais ouais, laissez-nous savoir ce qui se passe lorsque vous faites ce changement et si cela résout le problème :) – Fahim

+0

Parce qu'il y a deux fonctions 'cellForRowAt:'; celui qui fait partie du protocole de source de données et celui qui fait partie de la classe tableview. Dans ce cas, le second est appelé depuis le premier et ce n'est pas le problème. – Paulw11