2010-11-21 8 views
3

J'ai créé ce cas de test en tant qu'exemple simple de mon problème.Implémentation correcte d'un délégué et d'un protocole

  • Le AppDelegate initialise le TestViewController et l'ajoute à la fenêtre
  • Le TestViewController initialise le TestView et rend la vue
  • Le TestView initialise le TestSubView et il ajoute un sous-vue

Mon but est de permettre à TestSubView, via un délégué, d'accéder aux méthodes & de TestViewController. Dans cet exemple, TestSubView accède aux méthodes via un touches touchesBegan ou touchesMoved.

Aidez-nous s'il vous plaît. Je vous remercie.

EDIT: ne fonctionne toujours pas, mais pas plus d'erreurs. Ce que j'ai fait: Déplacé la définition de protocole dans un fichier séparé et importé, conserver pour assigner, et enlevé la déclaration @protocol TestDelegate au début de l'en-tête.

Je pense que mon problème est que je n'attribue pas le délégué dans le TestViewController.m, si c'est le problème comment je ferais cela?

TestViewController.h

#import <UIKit/UIKit.h> 

@interface TestViewController : UIViewController <TestDelegate> { 

    int number; 
} 

-(void)assignNumber:(int)value; 
-(void)displayNumber; 

@property int number; 

@end 

Transféré à protocol.h et importés en cas de besoin

@protocol TestDelegate 

-(void)assignNumber:(int)value; 
-(void)displayNumber; 

@end 

TestViewController.m

#import "TestViewController.h" 
#import "TestView.h" 

@implementation TestViewController 

@synthesize number; 

- (void)loadView { 
    TestView *myView = [[TestView alloc] initWithFrame:CGRectMake(0,0,320,480)]; 
    self.view = myView; 
    [myView release]; 
} 

-(void)assignNumber:(int)value { 
    NSLog(@"Number Assigned"); 
    number = value; 
} 

-(void)displayNumber { 
    NSLog(@"%i",number); 
} 

TestSubView.h

#import <UIKit/UIKit.h> 
#import "TestViewController.h" 


@interface TestSubView : UIView { 

    id<TestDelegate> delegate; 
} 

@property (nonatomic, retain) id<TestDelegate> delegate; 

@end 

TestSubView.m

#import "TestSubView.h" 
#import "TestViewController.h" 

@implementation TestSubView 

@synthesize delegate; 

- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     // Initialization code 
     [self setBackgroundColor:[UIColor redColor]]; 
     [self setUserInteractionEnabled:YES]; 
    } 
    return self; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    [self.delegate assignNumber:5]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    [self.delegate displayNumber]; 
} 
+0

Lorsque vous déclarez des méthodes dans un protocole, vous n'êtes pas obligé de déclarer ces méthodes encore dans une classe conforme au protocole. (En effet, vous ne devriez pas, car cela conduit à des erreurs de concordance plus tard si vous changez un mais pas l'autre.) Aussi, pourquoi 'assignNumber:'? Je suggère simplement de déclarer la propriété dans le protocole. –

+0

Pouvez-vous ajouter votre classe TestView? C'est la colle qui manque ici et pourrait être où votre problème est. – Rudiger

+0

TestSubView est-il censé être TestView? – Ben

Répondre

0

Tout d'abord, vous déclarer un protocole, puis attribuer le même objet que la mise en œuvre de ce protocole. Ce que vous cherchez probablement, c'est de déclarer le protocole TestDelegate sur votre TestSubView à la place. De plus, lors de la configuration d'une propriété pour un délégué, veillez à utiliser le mot clé 'assign' plutôt que 'retain'.

Enfin, tout ceci peut être grandement simplifié en utilisant UIGestureRecognizer. Vous pouvez le configurer dans votre contrôleur et l'ajouter à votre testSubView. De cette façon, lorsque la vue reconnaît que le geste correspondant s'est produit dans ses limites, un message sera envoyé à votre contrôleur vous permettant de faire ce que vous devez faire comme l'attribution ou l'affichage d'un nombre.

+0

Merci pour le conseil, je ne l'ai toujours pas eu à travailler mais me suis débarrassé de toutes les erreurs. Mis à jour ci-dessus Je vais jeter un oeil à la GestureRecognizer. –

0

Vous faites référence TestView lorsque votre classe est appelée TestSubView, sauf si vous avez 2 classes définies.

TestView *myView = [[TestView alloc] initWithFrame:CGRectMake(0,0,320,480)];

Vous avez raison que vous n'êtes pas encore attribuer le délégué.
Vous feriez cela sur la ligne suivante:

myView.delegate = self;

Pour mettre fin à ceci:

- (void)loadView { 
    TestSubView *myView = [[TestSubView alloc] initWithFrame:CGRectMake(0,0,320,480)]; 
    myView.delegate = self; // Set Delegate Here 
    self.view = myView; 
    [myView release]; 
} 
Questions connexes