Ich habe diesen Testfall als ein einfaches Beispiel für mein Problem erstellt.Einen Delegierten und ein Protokoll richtig implementieren
- Die AppDelegate initialisiert die TestViewController und fügt sie dem Fenster
- Die TestViewController die Testview initialisiert und macht es die Ansicht
- Die Testview die TestSubView initialisiert und fügt sie als Subview
Mein Ziel ist es, TestSubView über einen Delegaten den Zugriff auf die Methoden & von TestViewController zu ermöglichen. In diesem Beispiel greift TestSubView auf die Methoden entweder über touchesBegan oder touchesMoved zu.
Bitte Hilfe. Vielen Dank.
EDIT: Funktioniert immer noch nicht, obwohl keine Fehler mehr. Was ich getan habe: Die Protokolldefinition in eine separate Datei verschoben und importiert, beibehalten, um sie zuzuweisen, und die @ protocol TestDelegate-Deklaration am Anfang der Überschrift entfernt.
Ich denke, mein Problem ist, dass ich den Delegaten nicht in der TestViewController.m zuweisen, wenn das das Problem ist, wie würde ich das tun?
TestViewController.h
#import <UIKit/UIKit.h>
@interface TestViewController : UIViewController <TestDelegate> {
int number;
}
-(void)assignNumber:(int)value;
-(void)displayNumber;
@property int number;
@end
Umzug nach protocol.h und wo
@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
benötigt importiert
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];
}
Wenn Sie Methoden in einem Protokoll zu erklären, brauchen Sie nicht diese Methoden wieder zu erklären, in einer Klasse, die dem Protokoll entspricht. (In der Tat, sollten Sie nicht, da dies später zu Mismatch-Fehlern führt, wenn Sie eine ändern, aber nicht die andere.) Auch, warum 'assignNumber:'? Ich schlage vor, nur die Eigenschaft im Protokoll zu deklarieren. –
Können Sie Ihre TestView-Klasse hinzufügen? Das ist der Kleber, der hier fehlt und könnte sein, wo dein Problem ist. – Rudiger
ist TestSubView TestView? – Ben