2010-11-21 7 views
3

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]; 
} 
+0

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. –

+0

Können Sie Ihre TestView-Klasse hinzufügen? Das ist der Kleber, der hier fehlt und könnte sein, wo dein Problem ist. – Rudiger

+0

ist TestSubView TestView? – Ben

Antwort

0

In erster Linie sind Sie ein Protokoll zu erklären und dann das gleiche Objekt zuweisen, wie das Protokoll zu implementieren. Was Sie wahrscheinlich suchen, ist, das TestDelegate-Protokoll stattdessen auf Ihrem TestSubView zu deklarieren. Wenn Sie eine Eigenschaft für einen Delegaten einrichten, sollten Sie außerdem das Schlüsselwort "assign" verwenden und nicht "beibehalten".

Schließlich kann all dies mit UIGestureRecognizer erheblich vereinfacht werden. Sie können es in Ihrem Controller einrichten und zu Ihrem testSubView hinzufügen. Wenn die Ansicht erkennt, dass die entsprechende Geste innerhalb ihrer Grenzen aufgetreten ist, wird auf diese Weise eine Nachricht an Ihren Controller gesendet, mit der Sie das tun können, was Sie tun müssen, z. B. das Zuweisen oder Anzeigen einer Nummer.

+0

Danke für den Rat, ich habe es immer noch nicht zur Arbeit, aber habe alle Fehler los. Oben aktualisiert. Ich schaue mir den GestureRecognizer an. –

0

Sie beziehen sich auf TestView, wenn Ihre Klasse TestSubView heißt, es sei denn, Sie haben 2 Klassen definiert.

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

Sie sind richtig, dass Sie nicht die Delegierten noch zuweisen.
Sie tun würden, dass in der nächsten Zeile:

myView.delegate = self;

Um damit am Ende:

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