UITableView défilement Application se bloque
Préface: je suis nouveau sur le SDK de l'iPhone, l'Obj-C, Interface Builder et le Cacao. Je suis susceptible de faire quelque chose évidemment faux.
Question:
J'ai un UITableView
qui se bloque si je la faire défiler. Faire défiler un peu de révéler l'intégralité de la cellule du fond de la plupart des demi-cellule cachée, mais ne se charge pas de la suivante. De même, si je défilent en haut pour bien cacher le fond de la plupart des cellules, et des bandes de caoutchouc arrière pour montrer que la cellule, il tombe en panne avant de le montrer. Cela me semble bizarre car c'est le dessin de la première 7 de 11 cellules correctement. Les données de la cellule est dans un NSArray
, dans un UITableViewController
lié à la fois la dataSource
et delegate
pour la UITableView
dans Interface Builder. Il fonctionne lorsque la vue initialise.
Je suis en train de faire une Application, j'ai pensé que je pourrais être fait avec 2 jours il ya que juste calcule les combinaisons et affiche une liste de ce que je pensais serait une pratique de défilement de la vue de la table. Maintenant, il n'a même pas calculer tout, le NSArray
dans le DataSource
est initialisée une fois avec des chaînes comme @"Hello"
et @"World"
.
Étapes pour reproduire:
Parce que je suis à l'aide de l'IB, je ne peux pas vraiment vous montrer l'intégralité de l'article dans le code. Donc, je vais vous décrire ce que j'ai fait jusqu'à présent et j'espère qu'il ne vous rend pas somnolent.
Fait un nouvel Onglet "Barre d'Application" dans Xcode, parce que je veux 2 onglets, et je ne veux pas d'une barre de navigation, ni un plein écran de la table. J'ai déplacé le MainWindow.xib
premier onglet vue sur FirstView.xib
comme un analogue de la SecondView.xib
. Cela a fonctionné à merveille. J'ai modifié le point de vue de contenir deux UITextField
s pour les entrées, et un UITableView
pour la sortie. Cela a fonctionné, mais la table était vide. Je sous-classé le UITableViewController
où j'ai remplie un NSArray
propriété nommée combinations
avec 11 cordes, et ensuite ajouté
//Set up the cell...
cell.userInteractionEnabled = NO;
cell.text = [combinations objectAtIndex:indexPath.row];
où il y a eu uniquement le commentaire. Dans IB, j'ai ajouté un Table View Controller
à la FirstView.xib
et définir le nom de classe pour correspondre au nom de cette nouvelle sous-classe et de contrôle-traîné le Table View
de mon point de vue sur cette Combinations Table View Controller
deux fois. Une fois la liaison la dataSource
et une fois le delegate
. Bien que je reçois le même comportement si seulement le dataSource
est lié.
Cela fonctionne et remplit la table de lignes visibles (6.5) avec les 7 premières valeurs de la dataSource
combinations
. Je peut de défilement de 0,5 cellules vers le bas, puis vers le haut. Mais si je défiler plus de 0,5 cellules vers le haut ou vers le bas l'application crash. L'explication dans le rapport se lit comme suit:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -[NSCFTimer tableView:cellForRowAtIndexPath:]:
unrecognized selector sent to instance 0x52ca40'
Je n'ai pas fait un NSCFTimer
je n'ai d'ailleurs le lien de mon Table View
, je soupçonne que l' cellForRowAtIndexPath
est exactement un message qui aurait dû à mon dataSource
ou delegate
donc je ne comprends pas pourquoi il s'est égaré et où il a fini.
Mise à jour: Merci pour les réponses et les commentaires. Mon problème semble être que la CombinationsTableViewController
(sous-classe de UITableViewController
) est en fait pas instancié une place particulière dans mon code. Il est créé comme un certain temps (quand le FirstView.xib
est chargé), et est apparemment réussi même si la première tableView est rempli avec 7 cellules, et est alors libérée. J'ai donc besoin d'identifier où/comment faire une retenue de référence à ce contrôleur. Mon Application Delegate
devrait probablement avoir une certaine prise qui détient ce contrôleur qui peut être lié à l'instance qui est dans le xib
. Ouais, je suis nouveau sur ce. Je sais que je pourrait simplement éliminer ces problèmes en évitant de l'IB et de faire les choses de manière explicite dans le code, mais je me dis que je veux apprendre à utiliser l'IB de manière flexible.
Enfin: Oui, j'avais besoin d'une retenue instance de la table view controller. Il semble élémentaire, mais ce n'était pas évident lorsque l'on travaille avec le bureau international, que j'ai eu. Lire mon propre post pour l'ensemble du processus et de fixer.
De côté: Soit le débogueur besoins des instructions détaillées (tous les liens apprécié), ou qu'il ne fonctionne pas très bien. Je semble pour obtenir plus d'informations, plus rapidement, en laissant l'Application crash et la lecture du rapport qu'il génère. Mais cela nécessite un fastidieux de résiliation, la relance, et en 3 clics. J'avais vraiment envie de continuer sur cette de câblage des entrées, en faisant le calcul, et la mise à jour de la table à chaque changement. C'est censé être la partie la plus difficile, de ne pas ce faire un cadre membre des travaux de trucs.
Plus de la randonnée: C'était tous dans le SDK de l'iPhone pour 2.2.1. Au moment de l'iPhone OS 3.0 non-bêta n'était pas encore disponible, sans rejoindre le club pour de l'argent comptant dur froid. Je m'attendais à l'ouverture de la WWDC 2009, mais c'était en fait aujourd'hui (17 juillet 2009) que le public et gratuit de l'3.0 SDK a été mis à disposition.
OriginalL'auteur dlamblin | 2009-06-14
Vous devez vous connecter pour publier un commentaire.
dirait que vous êtes la perte de votre tableView délégué.
Ce qui ressemble à ce qui se passe est la UITableViewDelegate est libérée et l'application est ensuite à l'aide de la même adresse de pointeur pour un NSCFTimer.
Avez-vous appelé la libération sur votre delegete n'importe où, ou l'avez-vous pas conservé le délégué s'il est dans une autorelease pool.
OriginalL'auteur Bluephlame
Ok, donc, si vous avez suivi les étapes pour reproduire je vais maintenant ajouter les étapes pour résoudre ce problème:
Étapes pour résoudre ce problème
La sous-classe des
UIViewController
. J'ai appelé le mienCombinationsViewController
. Dans ce contrôleur ajouter une propriété comme un IBOutlet pour lacombinations
Table
ViewController
à partir de l'étape 6 ci-dessous.N'oubliez pas d'importer les bonnes choses, et de synthétiser de la table view controller, aussi le relâcher dans la
dealloc
méthode.Dans
FirstView.xib
changer leFile's Owner
classe de cette dernière sous-classe.Lien c'est combinationsViewController prise à la
Combinations Table View Controller
dans leFirstView.xib
faite à l'étape 7 ci-dessous.Ouvrir le
TabBarController
dans votreMainWindow.xib
sélectionnez le premier onglet, et dans l'Identité de l'Inspecteur de changer la classe de la dernière sous-classe (CombinationsViewController
).Qui fait la table de remplir normalement et de faire défiler des trucs.
Maintenant, je vais passer enfin et obtenez certains de table personnalisé vue de cellules de choses qui se passe et fait faire mon app de faire des trucs.
Énuméré les Étapes pour reproduire le comme référence pour la correction:
Fait un nouvel Onglet "Barre d'Application" dans Xcode.
Ouvert la
Tab View Controller
, traîné le prefab vue pour le premier onglet dans laMainWindow.xib
Fait un nouveau point de vue en fonction xib appelé
FirstView.xib
comme un analogue de laSecondView.xib
, et de mettre de la préfabrication en vue de cette xib.Lié à la vue de la
File's Owner
'sview
prise.J'ai modifié le point de vue de contenir deux
UITextField
s pour les entrées, et unUITableView
pour la sortie.Je sous-classé le
UITableViewController
commeCombinationsTableView
où j'ai remplie unNSArray
propriété nomméecombinations
avec 11 cordes, puis ajouté lecell.text = [combinations objectAtIndex:indexPath.row];
code où il y a eu uniquement le commentaire à propos de la configuration de la cellule.Dans
FirstView.xib
j'ai ajouté unTable View Controller
et définir le nom de classe pour correspondre au nom de cette nouvelle sous-classe et de contrôle-traîné leTable View
de mon point de vue sur cetteCombinations Table View Controller
deux fois. Une fois la liaison ladataSource
et une fois ledelegate
.À ce point, le tableau ne le rendu avec les données, mais le défilement des pauses. C'est parce que le CombinationsTableView n'est pas conservé n'importe où. Et c'est pas clair du tout pour une première fois, de l'IB de l'utilisateur. Donc, vous devez appliquer le correctif ci-dessus.
La première personne à résumer ce dans leur réponse la bonne réponse coche. E. G. Faire un viewController sous-classe qui est le propriétaire du fichier de FirstView.xib et contient une retenue IBOutlet vous pouvez lier à votre table view controller dans le même fichier xib.
OriginalL'auteur dlamblin
La raison de la première cellule de charge, c'est parce que la tableview pré-charge qui, comme les autres cellules qui sont à l'écran.
Toutes les cellules sont chargées à partir de la source de données de la méthode:
Je voudrais assurez-vous que vous avez explicitement définir le délégué et la source de données de la tableView. Cela peut être fait dans le code ou de l'IB. par:
Aussi comme Bluephlame dit, vous pourriez être en relâchant la UITableVewController quelque part.
À savoir, définir un point d'arrêt à l'intérieur de la méthode dealloc:
Si vous ne relâchez, vous atteignez ce point d'arrêt. Vous pouvez alors commencer à traquer le coupable.
OriginalL'auteur Corey Floyd
allouer de la mémoire à la matrice au lieu de
[NSArray arrayWithObjects:];
. Sans allocation de mémoire il l'habitude de recharger les lignes....utilisationarray=[NSArray alloc] initWithObjects];
...à la place de la ci-dessus.OriginalL'auteur Abhishek Singh
J'ai eu le même problème et qu'il est corrigé par l'ajout de néant dans un tableau comme le dernier élément.
Il a été s'écraser à cela:
mais pas pour ce:
Espère que cette aide.
OriginalL'auteur COzkurt
J'ai eu ce même problème. J'ai eu un UITableViewController sous-classe dans un fichier nib, mais je n'avais qu'a déclaré le UITableView d'une prise de courant/de la propriété, qui la tableview de UITableViewController a été libérée, tout est encore en usage.
La solution était tout simplement pour ajouter une prise de courant pour le Propriétaire du Fichier de classe qui fait référence à l'embedded UITableViewController.
OriginalL'auteur Lee