2010-05-06 4 views
1

J'ai un UITabBarConroller que j'utilise pour basculer entre 3 vues différentes. Tout cela fonctionne parfaitement. Sur l'un de mes onglets, j'ai ajouté un bouton à à appelé « Ajouter », j'ai ajouté une prise à cela, ainsi qu'une méthode de IBAction qui ressemble à ce qui suit:iPhone SDK: Passage à une vue puis retour aux erreurs de vue précédentes

// Method used to load up view where we can add a new ride 
- (IBAction)showAddNewRideView {  

    MyRidesViewController *controller = [[MyRidesViewController alloc] initWithNibName:@"AddNewRide" bundle:nil]; 
    controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    [self presentModalViewController:controller animated:YES]; 
    [controller release]; 

}//end showAddNewRideView 

Cela fonctionne actuellement très bien, et charge mon fichier nib AddNewRide. Mais, une fois cette vue chargée, j'ai un bouton d'annulation, qui, lorsqu'on clique dessus, je veux revenir à la vue précédente. Alors, je me suis dit que je voudrais juste faire l'inverse de ce qui précède, en utilisant la méthode suivante qui chargerait retour ma plume précédente:

- (IBAction)cancelAddingNewRide { 
    MyRidesViewController *controller = [[MyRidesViewController alloc] initWithNibName:@"MainWindow" bundle:nil]; 
    controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    [self presentModalViewController:controller animated:YES]; 
    [controller release]; 

}//end cancelAddingNewRide 

Mais, qui essaie de charger la pointe MainWindow, le programme se bloque, et je reçois l'erreur suivante:

2010-05-05 20:24:37.211 Ride[6032:207] *** -[MyRidesViewController cancelAddingNewRide]: unrecognized selector sent to instance 0x501e450 
2010-05-05 20:24:37.213 Ride[6032:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[MyRidesViewController cancelAddingNewRide]: unrecognized selector sent to instance 0x501e450' 

donc, je suis un peu perdu la raison pour laquelle il travaillerait dans un sens, mais pas l'autre.

Répondre

3

D'abord, je voulais adresser une partie de l'erreur: Pensez à vos vues en tant que pile. Lorsque vous "poussez" un contrôleur modal, vous ajoutez cette vue à une pile. La vieille vue est toujours là en dessous. Vous devez donc "sortir" de la vue modale pour revenir à l'ancienne vue. Si vous appuyez sur une nouvelle vue, vous avez maintenant 3 vues sur la pile qui prennent toutes de la mémoire, alors que vous n'en avez besoin que d'une seule.

Ainsi, à l'intérieur cancelAddingNewRide juste essayer:

[super dismissModalViewControllerAnimated:true]; 

Vous pouvez avoir d'autres problèmes qui causent l'accident, mais cela ne devrait généralement faire fonctionner les choses.

+0

Ceci est vrai mais n'est pas recommandé. Le viewController actuel ne devrait pas se fermer, la classe qui l'a appelé devrait l'ignorer. – Rudiger

+0

Les docs d'Apple disent: "Le contrôleur de vue parent est responsable de l'annulation du contrôleur de vue modale présenté en utilisant la méthode presentModalViewController: animated:.Si vous appelez cette méthode sur le contrôleur de vue modale lui-même, le contrôleur de vue modale transfère automatiquement le message à son contrôleur de vue parent. "Bien que le contrôleur modal ne soit pas responsable, il ne dit pas qu'il ne doit pas se fermer. –

+0

Yay! Cela a vraiment fonctionné, et résolu mon problème.Mais, vous voyez que ce n'est pas une bonne méthode? –

0

Généralement, lorsque j'ai utilisé presentModalViewController, le viewController présenté indique à viewController appelant de le fermer en utilisant dismissModalViewControllerAnimated: YES; Donc, en d'autres termes, dans le cacncelAddingNewRide, vous appelez simplement la classe qui contient showAddnewRideView et vous vous passez à la méthode.

Il est difficile à expliquer, mais Ill vous montrer un exemple:

classe cancelAddingNewRide:

- (IBACtion)home:(id)sender { 
    if (self.delegate respondsToSelctor:@selector(dismiss:)]) { 
     [self.delegate dismiss:self]; 
    } 
} 

puis dans la classe showAddNewRideView

-(void) dismiss:(cancelAddingNewRide_class *) controller { 
    [self dismissModalViewControllerAnimated:Yes]; 
} 

espoir qui fait sens et Soz pour les fautes de frappe

Éditer: oh et faire le sélecteur du contrôleur f

controller.delegate = self; 

Actuellement, en y réfléchissant plus, il y a un peu plus à ce sujet. Vous devez définir le viewController appelé en tant que délégué. Jetez un oeil à Stanford universités conférences iPhone, conférence 11 traite de cela et est disponible à partir de iTunesU

Questions connexes