2010-12-10 53 views
0

// //
MyGameViewController.h
//
#import < UIKit/UIKit.h>
#import "SecondViewController.h"Comment appeler la méthode de ViewController pour afficher 2nd View?

@interface MyGameViewController: UIViewController {
IBOutlet SecondViewController * secondViewController;
}
- (IBAction) goToSecondView;
@end


// //
MyGameViewController.m
//
#import "MyGameViewController.h"

@implementation MyGameViewController

- (IBAction) goToSecondView {
[self presentModalViewController: secondViewController animé: OUI];
}


// //
MyGameView.h
//
#import < UIKit/UIKit.h>
#import "Sprite.h"

@interface MyGameView : UIView {...}

Actuellement j'ai implémenté un bouton sur le MyGameView.xib pour appeler la vue secondViewController et cela fonctionne. Mais je veux que le secondViewController soit appelé en programmant dans MyGameView.m quand il y a une interruption, pas en appuyant sur un bouton. Par conséquent, je pense qu'il ya 2 approches:

a) soit faire la méthode goToSecondView disponible pour MyGameView.m
b) Mettre en œuvre tout le code dans MyGameViewController.h et MyGameViewController.m à MyGameView.m.

Problèmes:
1) Quand on essaie de faire a) se produire, je dois faire la méthode goToSecondView en commençant par (void), pas (IBAction). Mais alors comment l'invoquer dans MyGameView.m?
2) J'ai essayé de faire b) et j'ai implémenté tout le code dans MyGameView.m. Mais presentModalViewController est une méthode de ViewController et ne fonctionne pas dans UIView. Alors, quelle est la solution?

Répondre

2

Comme vous l'avez indiqué, vous ne pouvez pas appeler presentModalViewController dans une classe UIView. Cela semble être une excellente occasion d'utiliser un délégué. Vous pouvez faire quelque chose le long des lignes de:

Dans MyGameView.h

@protocol MyGameViewDelegate 
- (void)showSecondView; 
@end 

@interface MyGameView { 
} 
@property (nonatomic, assign) id <MyGameViewDelegate> delegate; 
... 
@end 

En MyGameView.m, lorsque vous devez afficher la deuxième vue:

[self.delegate showSecondView]; 

En MyGameViewController.h:

#import "MyGameView.h" 
@interface MyGameViewController : UIViewController <MyGameViewDelegate> { 
... 

En MyGameViewController.m:

#pragma mark MyGameViewDelegate methods 

- (void)showSecondView { 
    [self goToSecondView]; 
} 

Notez que vous aurez également besoin définissez MyGameViewController comme délégué de MyGameView. Vous pouvez le faire dans Interface Builder ou dans le code, en fonction de l'endroit où vous créez les deux objets.

Pour le faire dans le code, par exemple dans la méthode MyGameViewController.h viewDidLoad:

myGameView.delegate = self; 
+0

Merci pour votre réponse de détail. Je suis un novice et je suis un peu perdu. La plupart des mots-clés que vous avez mentionnés ci-dessus sont nouveaux pour moi, tels que @protocol, #pragma mark ..., etc. 1) Pourriez-vous expliquer ce que fait l'algorithme? Je dois créer une autre classe de délégué afin qu'une instance de celui-ci puisse être créée? Tout ce qui précède ressemble à la déclaration typique que j'ai utilisée. 2) à quoi se réfère ** MyGameViewDelegate **? Un autre fichier .h.m que je dois créer? 3) Alors, comment définir MyGameViewController pour être le délégué de MyGameView? Il existe déjà des fichiers MyGameAppDelegate. – NorthKyut

+0

Les protocoles sont une partie fondamentale d'Objective-c. Tout livre décent vous dira à leur sujet. Les documents d'Apple sont disponibles sur http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProtocols.html. –

+0

+1 pour une bonne explication et une solution :) – mAc