2010-11-11 3 views
1

Je rencontre un problème où tableView:numberOfRowsInSection: est appelé, puis d'autres méthodes sont appelées qui affectent le tableau sous-jacent, puis tableView:cellForRowAtIndexPath: est appelé et se bloque car le contenu du tableau sous-jacent est différent que lorsque numberOfRowsInSection a été appelé. Si le cadre appelle numberOfRowsInSection juste avant d'appeler cellForRowAtIndexPath, il n'y aurait pas de problème. Comme je ne peux pas m'attendre à un correctif dans le framework à court terme, la solution la plus simple que je recherche est de renvoyer une cellule fictive si le tableau sous-jacent ne contient pas l'entrée demandée.CellForRowAtIndexPath se bloque après avoir été appelé beaucoup plus tard que numberOfRowsInSection

Plus de détails sur la façon dont ce problème se produit:

  1. application utilise un contrôleur de barre d'onglets.
  2. Le contrôleur racine de chaque onglet est un UINavigationController.
  3. Le contrôleur de vue en question est appelé en le poussant sur la pile de navigation du contrôleur de navigation de l'élément de la deuxième barre d'onglets.
  4. La méthode viewWillAppear du contrôleur de vue en question réinitialise le groupe sous-jacent, puis appelle [_tableView reloadData].
  5. Le délégué de l'application qui implémente UITabBarControllerDelegate implémente la méthode tabBarController:didSelectViewController: et appelle popToRootViewControllerAnimated: sur le contrôleur de vue sélectionné.
  6. La méthode viewWillAppear du contrôleur de vue racine appelle une méthode sur le contrôleur de vue en question qui affecte le contenu du tableau sous-jacent.

étapes pour REPRO le problème:

  1. application Démarrer.
  2. Appuyez sur le deuxième élément de l'onglet.
  3. Appuyez pour afficher le contrôleur de vue en question. Effectuez un travail sur cette vue pour remplir la table.
  4. Appuyez sur le premier élément de l'onglet.
  5. Appuyez sur le deuxième élément.

A l'étape cinq, voici l'ordre des appels:

  1. viewControllerInQuestion: viewWillAppear - rechargements tableau sous-jacent, appelle [_tableView reloadData]
  2. viewControllerInQuestion: numberOfRowsInSection - renvoie 1
  3. App délégué: didSelectViewController - appels popToRootViewControllerAnimated
  4. secondTabBarRootViewController: viewWillAppear - appelle la méthode sur viewControllerInQuestion qui efface con tentes du tableau sous-jacent
  5. viewControllerInQuestion: cellForRowAtIndexPath - se bloque en essayant d'accéder à l'objet à l'index 0 dans le tableau sous-jacent.

Merci pour toute aide que vous pouvez me donner.

Répondre

1

Cela s'est avéré être un problème avec des appels incorrects à reloadData sur la vue de table.J'ai hérité de ce code, mais je suis assez nouveau pour iOS que je n'ai pas compris le bon usage.

Le code appelait [_tableView reloadData] à la fois dans loadView et dans viewWillAppear. Supprimer les deux appels a résolu ce problème particulier.

0

J'ai eu un problème similaire. Si vous avez un observateur dans votre contrôleur qui appelle reloadData, utilisez la méthode viewWillAppear pour ajouter l'observateur et viewWillDisappear pour l'enlever.

Questions connexes