iOS SDK Benutzerdefinierte Delegierte

Delegierte sind ein nützliches Werkzeug für die Kommunikation zwischen Objekten. In diesem Lernprogramm erstellen und implementieren wir einen benutzerdefinierten Delegierten, um drei zuzulassen UISliders um die Hintergrundfarbe von a einzustellen ViewController.


Über Delegierte

Nachrichten in Objective-C sind eine Einbahnstraße. Eine übergeordnete Klasse kann eine Nachricht an ihr untergeordnetes Objekt senden, das untergeordnete Element kann jedoch nicht selbst eine Nachricht an das übergeordnete Objekt senden. Mit Hilfe eines Delegierten kann jedoch eine bidirektionale Kommunikation erreicht werden. UIScrollView und UITableView Verwenden Sie Delegaten routinemäßig, um zwischen Modell, Ansicht und Controller zu kommunizieren. Es gibt viele Gründe, warum das Delegat-Muster nützlich ist. Ein Delegat kann verwendet werden, um ein Objekt wiederverwendbar zu machen, um eine flexible Möglichkeit zum Senden von Nachrichten bereitzustellen oder um Anpassungen zu implementieren.


Schritt 1: Erstellen Sie ein neues Projekt

Starten Sie Xcode und klicken Sie auf Datei> Neu> Projekt. Wählen Sie eine iOS-Einzelanwendung aus und klicken Sie auf "Weiter". Benennen Sie Ihr Produkt "Delegaten" und geben Sie einen Namen für Ihre Firmenkennung ein, z. B. "com.companyName.delegates". Wählen Sie die iPhone-Gerätefamilie aus und klicken Sie auf "Weiter". Wählen Sie einen Speicherort für das Projekt aus und klicken Sie auf "Erstellen".


Schritt 2: Unterklassifizierung UISlider

Klicken Sie auf Datei> Neu> Datei und wählen Sie eine Cocoa Touch Objective-C-Klasse aus. Benennen Sie Ihre Klasse "MTSlider" und wählen Sie UISlider aus dem Dropdown-Menü "Unterklasse von". Klicken Sie auf "Weiter" und dann auf "Erstellen".


Schritt 3: Hinzufügen der Delegate-Protokollmethoden

Zuerst müssen wir die Methoden für den Delegierten angeben. Klicken Sie auf "MTSlider.h". Geben Sie den folgenden Code über der Schnittstelle ein.

 @ class MTSlider; @protocol MTSliderDelegate  @optional - (void) MTSliderDidChange: (MTSlider *) MTSlider withValue: (CGFloat) -Wert; @required - (CGFloat) startPositionForMTSlider: (MTSlider *) MTSlider; @Ende

Compiler-Richtlinie

Beachten Sie die Linie @ Klasse MTSlider. Wenn Sie diesen Code über alles andere setzen, wird der Compiler darüber informiert, dass er irgendwann in der Zeile erscheint, MTSlider wird erklärt. Ohne diese Compileranweisung gibt der Compiler eine Warnung aus, da erwartet wird, dass er die Schnittstelle findet MTSlider jetzt sofort.

Delegieren von Methoden

Die Methoden des Delegaten werden beginnend mit deklariert @Protokoll. Das Protokoll MTSliderDelegate entspricht der NSObject Protokoll aus einem bestimmten Grund. Das NSObject Protokoll enthält eine Methode, antwortetToSelector:, Dies kann verwendet werden, um sicherzustellen, dass das Delegatenobjekt tatsächlich eine optionale Methode implementiert, bevor die Methode aufgerufen wird. Das Aufrufen einer Methode, die nicht vom Delegatenobjekt implementiert wird, führt zum Absturz einer Anwendung.

Optionale Methode

Eine optionale Methode ist eine Methode, die nicht vom Delegat-Objekt implementiert werden muss. In diesem Fall ist das Delegatobjekt das ViewController, es kann jedoch ein beliebiges Objekt sein. Die optionale Methode MTSliderDidChange: withValue: wird im Delegatenobjekt angezeigt, wenn sich der Wert des Schiebereglers ändert.

Erforderliche Methode

Andererseits ist eine erforderliche Methode eine Methode, die vom Delegatenobjekt implementiert werden muss. Andernfalls wird eine Compiler-Warnung angezeigt. Die erforderliche Methode startPositionForMTSlider: fragt das Delegat-Objekt, wo die Schieberegler beginnen sollen, und erhält seinen Startwert vom Delegaten zurück.

Instanzvariable für den Delegaten erstellen

Geben Sie noch in "MTSlider.h" den folgenden Code direkt darunter ein @Schnittstelle um eine Instanzvariable oder ivar für den Delegierten zu deklarieren.

 Ich würde  sliderDelegate;

Wenn du verwenden ARC, Geben Sie stattdessen den folgenden Code ein:

 __weak id  sliderDelegate;

Der Ivar ist vom Typ Ich würde Daher ist es flexibel und kann jeden Objekttyp akzeptieren. Der nächste Teil, MTSliderDelegate sagt, dass das Objekt, dem es zugewiesen wird, am Ende sliderDelegate enthält die Protokollmethoden von MTSliderDelegate als Teil seiner eigenen Implementierung.

Erstellen der Setter und Getter

Beenden Sie die Syntax der Setter- und Getter-Methoden. Geben Sie den folgenden Code direkt unter der schließenden Klammer der Instanzvariablen ein.

 @ property (nichtatomisch, zuweisen) id  sliderDelegate;

Wenn du verwenden ARC, Geben Sie stattdessen den folgenden Code ein:

 @ Eigenschaft (nichtatomisch, schwach) id  sliderDelegate;

Klicken Sie auf "MTSlider.m" und geben Sie den folgenden Code ein @Implementierung um die Immobilie abzuschließen.

 @synthesize sliderDelegate;

Schritt 4: Konformität mit den Delegate-Protokollmethoden

Klicken Sie auf die Datei "ViewController.h". Geben Sie den folgenden Code ein, um mit dem übereinzustimmen MTSliderDelegate Protokoll und Import "MTSlider.h."

 #import "MTSlider.h" @interface ViewController: UIViewController 

Implementieren der Delegate-Protokollmethoden

Klicken Sie auf die Datei "ViewController.m" und geben Sie den folgenden Code ein, um die Datei zu implementieren MTSliderDelegate Protokollmethoden.

 - (CGFloat) startPositionForMTSlider: (MTSlider *) MTSlider  - (void) MTSliderDidChange: (MTSlider *) MTSlider withValue: (CGFloat) -Wert 

Schritt 5: Einstellen des Delegierten

Benutzerdefinierte Initialisierung

Das Erstellen eines benutzerdefinierten Initialisierers ist der Schlüssel zum Abrufen der Startposition für die Schieberegler. Fügen Sie in "MTSlider.h" den folgenden Code hinzu, um den neuen Initialisierer zu deklarieren.

 - (id) initWithFrame: (CGRect) frame undDelegate: (id) delegateObject;

Klicken Sie auf "MTSlider.m" und suchen Sie nach initWithFrame: Methode. Löschen Sie die vorhandene Methode und ersetzen Sie sie durch den folgenden Code.

 - (id) initWithFrame: (CGRect) frame undDelegate: (id) delegateObject self = [super initWithFrame: frame]; if (self) self.sliderDelegate = delegateObject; self.value = [sliderDelegate startPositionForMTSlider: self];  return self; 

Durch das Festlegen des Delegaten während der Initialisierung kann die Delegat-Methode sofort aufgerufen werden. Die Methode startPositionForMTSlider: Ruft den Startort für die Schieberegler ab. Da sie im Initialisierungsprogramm aufgerufen wird, werden die Positionen der Schieberegler festgelegt, bevor sie auf dem Bildschirm dargestellt werden.

Überschreiben UISlider Methode

Das UISlider Methode setValue: animiert: wird jedes Mal automatisch aufgerufen, wenn ein Schieberegler verschoben wird. Fügen Sie noch in der "MTSlider.m" -Datei die folgende Methode hinzu.

 - (void) setValue: (Gleitkommazahl) Wert animiert: (BOOL) animiert [super setValue: Wert animiert: animiert]; if (sliderDelegate! = keine && [sliderDelegate antwortetToSelector: @selector (MTSliderDidChange: withValue:)]) [[self sliderDelegate] MTSliderDidChange: self withValue: value]; 

Durch Überschreiben setValue: animiert: Jedes Mal, wenn sich ein Schieberegler bewegt, wird eine Nachricht an das Delegatenobjekt gesendet. Beachten Sie den Anruf an super, super setValue: animiert:. Es ist wichtig, dass wir nicht versehentlich etwas durcheinander bringen, das die Methode im Hintergrund ausführt, wenn eine vorhandene Methode überschrieben wird.

Die Delegatmethode MTSliderDidChange: withValue: ist die zuvor deklarierte optionale Protokollmethode. Das Delegatenobjekt wird jedes Mal gemeldet, wenn sich der Schieberegler ändert. Denken Sie daran, dass das Aufrufen einer nicht implementierten Methode zum Absturz der Anwendung führt. Berufung antwortetToSelector: Beim Delegatenobjekt wird überprüft, ob es in Ordnung ist, die optionale Delegatmethode mitzuteilen.


Schritt 6: Einstellen der Hintergrundfarbe und Instantiieren der Schieberegler

Klicken Sie auf die Datei "ViewController.m" und geben Sie den folgenden Code ein viewDidLoad um die Hintergrundfarbe der Ansicht mit vier Farbkomponenten festzulegen und Rot, Grün und Blau zu instanziieren MTSlider Objekte. Wenn du verwenden ARC, Stellen Sie sicher, dass Sie die Linien entfernen [redSlider release];, [GreenSlider Release];, und [blueSlider Release]; da diese Aufrufe nicht notwendig sind.

 CGFloat sliderColorPosition = 0.3f; self.view.backgroundColor = [UIColor colorWithRed: sliderColorPosition grün: sliderColorPosition blau: sliderColorPosition alpha: 1.0f]; CGRect redSliderFrame = CGRectMake (20.0f, 20.0f, 280.0f, 28.0f); MTSlider * redSlider = [[MTSlider-Zuordnung] initWithFrame: redSliderFrame undDelegate: self]; redSlider.tag = 1; [self.view addSubview: redSlider]; [redSlider release]; CGRect greenSliderFrame = CGRectMake (20.0f, 70.0f, 280.0f, 28.0f); MTSlider * greenSlider = [[MTSlider-Zuordnung] initWithFrame: greenSliderFrame undDelegate: self]; greenSlider.tag = 2; [self.view addSubview: greenSlider]; [GreenSlider Release]; CGRect blueSliderFrame = CGRectMake (20.0f, 120.0f, 280.0f, 28.0f); MTSlider * blueSlider = [[MTSlider-Zuordnung] initWithFrame: blueSliderFrame undDelegate: self]; blueSlider.tag = 3; [self.view addSubview: blueSlider]; [blueSlider Release];

Durch die Gewohnheit MTSlider Initialisierer, initWithFrame: undDelegate:, Der Delegierte ist festgelegt und die ViewController Objekt wird zum Delegat-Objekt jedes Schiebereglers. Normalerweise können Sie erwarten, dass ein Delegatensatz mit dem folgenden Code angezeigt wird: redSlider.sliderDelegate = self;. In diesem Fall wird die Delegiertenzuweisung jedoch während der Initialisierung übergeben.

Beachten Sie, dass die Tag-Eigenschaft jedes Schiebereglers festgelegt wurde. Anfangs ist die Hintergrundfarbe der ViewController ist auf dunkelgrau eingestellt. Bei der Anpassung jedes Schiebereglers ändert sich die Hintergrundfarbe entsprechend, da das Tag angibt, welcher Schieberegler aktiv ist.


Schritt 7: Ändern der Hintergrundfarbe

Finden Sie die Implementierung von startPositionForMTSlider:, Geben Sie den folgenden Code in die geschweiften Klammern ein, um den Anfangswert der Schieberegler auf 0,3 festzulegen.

 CGFloat sliderStartPosition = 0.3f; return sliderStartPosition;

Anpassen der Hintergrundfarbe

Finden Sie die Implementierung von MTSliderDidChange: withValue:, und fügen Sie den folgenden Code hinzu, um die Hintergrundfarbe anzupassen.

 if (MTSlider.tag == 1) // Roter Schieberegler CGColorRef bgColor = self.view.backgroundColor.CGColor; const CGFloat * colorsPointer = CGColorGetComponents (bgColor); CGFloat currentGreen = colorsPointer [1]; CGFloat currentBlue = colorsPointer [2]; self.view.backgroundColor = [UIColor colorWithRed: Wert grün: currentGreen blau: currentBlue alpha: 1.0f];  if (MTSlider.tag == 2) // Green Slider CGColorRef bgColor = self.view.backgroundColor.CGColor; const CGFloat * colorsPointer = CGColorGetComponents (bgColor); CGFloat currentRed = colorsPointer [0]; CGFloat currentBlue = colorsPointer [2]; self.view.backgroundColor = [UIColor colorWithRed: currentRed grün: Wert blau: currentBlue alpha: 1.0f];  if (MTSlider.tag == 3) // Blue Slider CGColorRef bgColor = self.view.backgroundColor.CGColor; const CGFloat * colorsPointer = CGColorGetComponents (bgColor); CGFloat currentRed = colorsPointer [0]; CGFloat currentGreen = colorsPointer [1]; self.view.backgroundColor = [UIColor colorWithRed: currentRed grün: currentGreen blue: Wert alpha: 1.0f]; 

Bei jeder Änderung des Schiebereglers wird eine Nachricht an die Delegatmethode gesendet. Die Nachricht enthält den aktuellen MTSlider und seinen Wert. Auf die Tag-Eigenschaft des aktuellen Schiebereglers wird zugegriffen, um zu bestimmen, welcher Schieberegler die Nachricht gesendet hat, und die Hintergrundfarbe wird entsprechend aktualisiert.


Schritt 8: Testen des Delegierten

Klicken Sie auf Produkt> Ausführen oder klicken Sie auf den Pfeil "Ausführen" in der oberen linken Ecke, um die aktiven Schieberegler anzuzeigen. Passen Sie die Schieberegler an, um zu sehen, wie die untergeordneten Elemente die Hintergrundfarbe des übergeordneten Elements steuern können.


Fazit

Es gibt viele andere Möglichkeiten, die Hintergrundfarbe von a zu steuern UIViewController, einschließlich Ziele oder Benachrichtigungen. Apple entworfen UISlider ein Zielmuster verwenden, um Daten zu übergeben. Wenn Sie jedoch weitere Funktionen hinzufügen möchten, können Sie am besten von einem untergeordneten zu einem übergeordneten Element kommunizieren, indem Sie einen benutzerdefinierten Delegaten erstellen.