2010-11-19 4 views
0


Merci pour votre aide, comme d'habitude, je cherche un peu plus d'informations ...iphone, comprendre le contrôleur de vue, presentModalViewController

En ce qui concerne les contrôleurs de vue, je suis en train de développer une application avec plusieurs vues .

Voir les charges de contrôleur View A l'aide presentModalViewController - et charges View B à partir de là - fonctionne aussi bien, mais j'ai des questions lancinantes ...

Voir A a une table, ce qui fore vers le bas pour voir B, et je peux revenir en arrière pour voir A utiliser reportModalViewController, mais une fois de retour dans View A je ne peux pas accéder à la table dans la vue A.

Qu'est-ce qui arrive aux contrôles/variables dans la vue A lorsque la vue B est poussée? le dealloc est-il appelé lorsque la vue B est appelée? Si je souhaite accéder aux contrôles/variables lorsque la vue B est fermée et que la vue A revient à la vue, que dois-je faire?

Y at-il un article qui peut éduquer à ce sujet? d'aide est très appréciée

Pour re-itérer

  • View Controller initie une page Voir x
  • Voir charges X - Voir A avec une table dans la vue en utilisant le tableau presentModalViewController
  • est publié dans dealloc View A
  • Voir B charges bien, fonctionne très bien - en rejetant la vue B contrôleurs ramène à la vue A
  • À ce stade, je voudrais lik e pour recharger la table dans la vue une fois qu'il revient sur l'écran

Je suis assez sûr qu'il ya beaucoup d'autres collègues qui sont dans ce genre de situation

Voici mon code, en bits et pièces

startpage - (Ceci est la page d'accueil de l'application) avec un bouton de démarrage, contient

View Controller -> View 

en cliquant sur le bouton de démarrage, je suis le chargement d'un viewcontroller appelé viewA (View Controller -> View), w vec le code suivant

UIViewController *viewA= [[viewA alloc] initWithNibName:@"viewA" bundle:nil]; 
viewA.modalTransitionStyle=UIModalTransitionStyleCoverVertical; 
[naviControl presentModalViewController:viewA animated:YES];  
[viewA release]; 

En choisissant une ligne de table dans viewA, un autre viewcontroller viewB (View Controller -> View) est appelée avec le code follwoing

UIViewController *viewB= [[viewB alloc] initWithNibName:@"viewB" bundle:nil]; 
viewB=UIModalTransitionStyleCoverVertical; 
[self viewB animated:YES]; 

viewB est rejeté et viewA est représenté avec Code

[self dismissModalViewControllerAnimated:YES]; 

à ce stade, avec quelques NSLogs, quand viewB est rejeté, que viewWillAppear est appelé viewA, pas viewDidLoad et si je tente de recharger les données sur la table viewA , L'application crashses avec EXC_BAD_ACCESS

Merci Veeru

+0

Dans mon cas, si View A a une table, qui fore jusqu'à View B, je voudrais recharger les données de la table dans la vue A quand View B est rejeté .. Ceci plante parce que la table n'est plus disponible. – Veeru

+0

quand vous dites View A et View B, voulez-vous dire ViewController A et ViewController B? Vous ne pouvez pas présenter une vue de manière modale. – kevboh

+0

Oui Vue A est en fait un contrôleur de vue avec une vue à l'intérieur et la même chose pour la vue B - donc essentiellement les deux sont ViewControllers non? – Veeru

Répondre

0

Tout d'abord, s'il vous plaît corriger la déclaration suivante:

UIViewController *viewA= [[viewA alloc] initWithNibName:@"viewA" bundle:nil]; 

à

UIViewController *viewA= [[UIViewController alloc] initWithNibName:@"viewA" bundle:nil]; 

et vous aurez besoin de comprendre d'autre part la gestion de la mémoire et le flux des contrôleurs de vue, par exemple

  1. lorsque vous allouez un contrôleur de vue alors une instance avec retenue comptage 1 est lancé dans la mémoire,
  2. lorsque vous poussez ou présentez ce contrôleur de vue sur l'écran, puis le conserver nombre devient 2 comme maintenant une autre instance alors que vous le relâchez, vous conservez à nouveau le compte de l'instance de votre contrôleur de vue à 1, c'est-à-dire réduit de 1 (vous devez savoir que lorsque le nombre de retenue devient 0, alors seulement il sera libéré de la mémoire).
  3. puis vous avez appelé un autre contrôleur de vue sur ce contrôleur de vue en cours qui le rend en arrière-plan et comme vous n'avez pas conservé l'instance explicitement, il est libéré par votre contrôleur de navigation ou contrôleur de vue dans lequel vous avez ajouté, donc son compte de retenue devient 0, donc libéré de la mémoire. Par conséquent, lorsque vous essayez de recharger la vue de table, vous obtenez EXC_BAD_ACCESS alors que vous essayez d'utiliser une instance déjà libérée.

Solution:

  1. Si vous essayez d'utiliser plusieurs écrans de navigation dans votre application, vous ne devez utiliser la méthode pushViewController de UINavigationController qui maintient les instances de viewcontroller jusqu'à ce que vous les libérer explicitement. Veillez également à utiliser des instances locales ou des instances d'objet et leur nombre de conservation, gardez une trace de alloc et release, c'est-à-dire retain count, il ne doit pas être 0 sauf si vous le souhaitez.

Espérons que cela aidera ...

+0

Salut sanniv, merci pour le temps que vous avez pris pour fournir un bon aperçu sur les contrôleurs de vue, on dirait que j'ai plus de lecture à faire. Merci encore :) – Veeru

0

Lorsque vous présentez ViewController (VC) B comme modal de la VC A, il ne doit pas dealloc une des variables VC A (sauf peut-être un avertissement de mémoire est envoyé). Si vous voulez recharger des données de table qui résident dans VC A lorsque vous fermez B, vous pouvez utiliser [UITableView reloadData]. Vous devriez l'appeler à partir de la méthode viewDidAppear car celle-ci sera appelée à chaque fois que la vue reviendra sur l'écran. J'espère que cela t'aides! Ps .. remplace UITableView avec la table appropriée pour recharger.

+0

Je pensais la même chose .. mais son ne fonctionne pas, je doute qu'il y ait un avertissement de mémoire depuis son dans le simulateur. Je vais donner un autre coup de feu et voir..toutes les autres suggestions? – Veeru

+0

Mettez des instructions NSLog dans votre code (dealloc/etc) pour voir si elles peuvent être appelées. – DerekH

+0

J'ai mis quelques NSLogs et j'ai remarqué ce qui suit - ViewDidLoad n'est pas appelé lorsque ViewB est fermé et View A apparaît, seul ViewWillAppear est appelé. Si j'ajoute des données de rechargement de table ici, son écrasement avec EXC_BAD_ACCESS. ViewDidLoad n'est appelé qu'une seule fois lorsque la vue A est chargée pour la première fois dealloc n'est pas appelé - mais la table n'est toujours pas accessible Je suis en train de mettre à jour le message original avec du code – Veeru

Questions connexes