2009-11-10 5 views
1

Donc, ceci est mon problème: J'ai un UITableView avec UITableViewCells personnalisé. Chacune des cellules a un UIImageView qui télécharge une image distante en utilisant le chargement d'image asynchrone.UITableView problème avec le chargement de l'image asynchrone

Cela fonctionne presque parfaitement, mais j'ai ce problème étrange.

Lorsque la vue est chargée, je peux voir les 5 ou 6 premières cellules sans défilement (hauteur d'affichage de l'iPhone).

Le problème est: l'image de chaque cellule n'apparaît pas à ce moment. En faisant défiler la table vers le bas, les cellules # 7 ~ se chargent parfaitement.

Le fait WEIRD est: quand je retourne en haut, maintenant les 5 ou 6 cellules se chargent parfaitement. Ma première pensée a été: lorsque la vue est chargée, la méthode cellForRowAtIndexPath n'appelait pas la méthode loadimage automatiquement pour les premières cellules, juste après l'interaction de l'utilisateur.

Mais en utilisant NSLog (étape par étape) pour trouver où est le problème, la chose est:

  1. cellForRowAtIndexPath appelle la méthode LoadImage
  2. intérieur méthode LoadImage, de la NSURLConnection est créé
  3. NSURLConnection didReceiveData la méthode n'est pas appelée

Ainsi, la méthode loadimage est appelée, en effet. Mais ne pas recevoir de données.

Défilement vers le bas puis retour vers les cellules supérieures, tout va bien. Le mot est WEIRD.

Répondre

0

Vous dites que NSURLConnection est créé, mais vous ne dites jamais qu'il démarre. Assurez-vous que vous appelez l'une des méthodes qui lancent la connexion (initWithRequest:delegate:startImmediately: ou start).

Si ce n'est pas votre problème, alors pouvez-vous vérifier si l'une des autres méthodes de délégué NSURLConnection est appelée? Recherchez spécifiquement connection:didFailWithError:, car il peut y avoir une sorte de procédure bizarre de démarrage du réseau qui doit se produire avant que vos connexions ne fonctionnent, entraînant leur échec au premier chargement, mais pas plus tard.

Enfin, pouvez-vous vérifier pour voir si cela fonctionne lorsque vous envoyez un message reloadData à la vue de la table? Quelque chose comme [tableView performSelector:@selector(reloadData) withObject:nil afterDelay:1.0];, de sorte qu'il soit rechargé après une attente d'une seconde.

1

Vous pouvez essayer d'utiliser mon objet JImage, qui est exactement le même qu'un UIImageView, mais il est passé une URL au lieu d'un chemin de fichier. Pendant le chargement de l'image (full asynch), un indicateur d'activité est affiché. Utilisez-le comme vous le feriez avec UIImageView, mais initialisez-le avec une URL.

Implement a kind of white board on Iphone

0

L'explication la plus probable est que l'appel asynchrone prend trop de temps; Si elle n'est pas retournée avant qu'une cellule ne soit dessinée, votre cellule tirera sans elle et ne redessinera jamais avant d'avoir défilé hors de l'écran et de revenir dessus.Vous pouvez soit charger vos images de manière synchrone avant le premier tirage de vos cellules (ce qui n'est probablement pas ce que vous voulez, car cela affecterait la réactivité de l'interface utilisateur), soit ajouter du code dans votre connectionDidFinishLoading: handler qui marquera la table comme avoir besoin de réafficher la (les) cellule (s) pour l'image juste chargée.

0

Merci Tim, Skirwan et Dutchie! J'ai trouvé le problème. C'est tellement évident maintenant, omg! Je regardais juste au mauvais endroit!

Les données pour UITableView proviennent d'un fichier XML. Après l'avoir analysé, j'appelle reloadData. Ce que je n'ai pas vu auparavant, c'est que toutes les méthodes de ce processus sont en cours de traitement dans un NSAutoreleasePool. Ainsi, quand il se termine (assez vite), tout est parti (et le NSURLConnection n'a pas assez de temps pour charger l'image).

Questions connexes