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];
}
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. –
Pouvez-vous ajouter votre classe TestView? C'est la colle qui manque ici et pourrait être où votre problème est. – Rudiger
TestSubView est-il censé être TestView? – Ben