2009-05-25 25 views
6

Was ist der beste Weg für die Registrierung von Ereignissen für meine UIView-Unterklasse, so dass ich sie in Interface Builder mit IBAction-s verbinden kann?Ereignisse für benutzerdefinierte UIView

Momentan habe ich nur ein Standard-UIView in meine Hauptansicht eingefügt und ich habe die Klasse auf "RadioDial" (meine benutzerdefinierte Klasse) eingestellt. Dies zeigt die Ansicht an, aber ich habe keine Ahnung, wie ich Ereignisse daraus machen kann.

Dank

Antwort

5

Bitte klarstellen: meinen Sie, dass Interface Builder Ihren View-Controllern die Möglichkeit bieten soll, benutzerdefinierte Ereignisse zu verkabeln, die Ihre View-Unterklasse ausgibt (ähnlich wie die Button-Bedienelemente Touch Inside verdrahten)?

Wenn Sie diese Art von Funktionalität benötigen, müssen Sie eine generalisierte 'Delegate'-Eigenschaft in Ihrer View in Verbindung mit einem Protokoll verwenden.

@protocol RadioDialDelegate 
-(void)dialValueChanged:(id)sender 
@end 

@interface RadioDial 
{ 
    id<RadioDialDelegate> radioDelegate; 
} 
@property (nonatomic, assign) IBOutlet id<RadioDialDelegate> radioDelegate; 

Dies ermöglicht es dem Controller zu der Ansicht verkabeln und empfängt alle Ereignisse (Er implementiert RadioDialDelegate angenommen wird), die aus der Sicht kommen. Alternativ können Sie einen nicht typisierten Delegaten verwenden und in Ihrem View-Code einen Anruf für einen späten Anruf verwenden:

+0

Ja, das ist genau das, was ich meine. Und das Problem, das ich habe, ist das Erstellen dieser benutzerdefinierten Ereignisse für meine Sichtunterklasse. Was tatsächlich passiert ist, dass in den Klassen - (void) touchesMoved unter bestimmten Bedingungen ich möchte feuern und Event und ich möchte, dass dieses Ereignis mit IBActions über IB verbunden werden kann. –

+0

Ich habe meine Antwort bearbeitet, um zu zeigen, wie das geht. Sie müssen das Delegate/Protokoll-Muster verwenden, um dies zu tun. IB wird die Stellvertretung als eine Eigenschaft offen legen, die Ihrem Controller zugewiesen ist (Sie müssen auch Ihre Controller-Klasse ordnungsgemäß in IB festlegen), und Ihr Controller muss das Protokoll implementieren. – Jason

+0

Das macht Sinn (ziemlich neu für die ganze Objective-C/Cocoa-Sache), aber wie würde es mir erlauben, jedes RadioDial-s-Wertänderungsereignis mit einer anderen Methode auf dem View-Controller zu verbinden? Ich verstehe, dass ich die gleiche Methode verwenden und die Absenderreferenz überprüfen könnte, aber ist das der einzige Weg? –

3

eine Methode in Ihren View-Controller erstellen (wenn nichts anderes, sollten Sie eine RootViewController haben in ihrem Projekt). Lassen Sie uns sagen, dass Ihre Methode

-(void) buttonClicked { code code code } 

in der Headerdatei des Controllers (zB RootViewController.h) ist man dann setzen:

-(IBAction) buttonClicked; 

Und in IB Sie mit der rechten Maustaste auf Ihren Taste/Radio Wahl/was auch immer. Sie sehen eine Liste von Ereignissen und Sie können FROM vom Connector des Ereignisses, das Ihr Controller erhalten soll, zu dem Objekt in IB ziehen, das den Controller repräsentiert (wahrscheinlich First Responder). Dies hängt davon ab, wie Ihre IB-Struktur aufgebaut ist, aber es sollte einfach sein.

Eine andere Alternative ist es, zu lernen, wie man UIViews programmatisch erstellt und IB vorerst vergessen kann. Die Meinungen sind geteilt darüber, ob es besser ist, IB am Anfang zu lernen, oder ob es besser ist, zu lernen, wie man alles im Code macht und IB für später speichert. In jedem Fall ist es notwendig, beide Möglichkeiten zu erlernen, um irgendwann eine Schnittstelle einzurichten.

Verwandte Themen