Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Schieberegler-Label-Bindung

Datenbindung kann bei vielen Anforderungen der Softwareentwicklung hilfreich sein, machmal auch bei ganz alltäglichen Problemen. Zum Beispiel wenn der aktuelle Wert eines Schieberegler (Slider) Steuerelements in einem Label angezeigt werden soll.
stacks_image_CE4F734B-B1E6-4465-A636-AF13B7AFF3AC
Der traditionelle Weg dies zu erreichen ist zwar recht überschaubar, aber auch recht aufwendig. Benötigt werden zwei IBOutlet, die mit Slider und Label verbunden werden und eine IBAction, die immer dann eine Nachricht sendet, wenn sich der Wert des Slider verändert.
#import <Cocoa/Cocoa.h>

@interface SliderLabelBindingAppDelegate : NSObject {
NSWindow *window;

    IBOutlet NSSlider *theSlider;
    IBOutlet NSTextField *theLabel;

}

@property (assign) IBOutlet NSWindow *window;

- (
IBAction)sliderDidMove:(id)sender;

@end
Im Prinzip käme man auch mit einem Outlet aus, denn der Slider lässt sich auch über den Sender der Action ermitteln. Aber das Beispiel soll nicht unnötig kompliziert werden.
 
In der Methode geschieht dann das folgende:
- (IBAction)sliderDidMove:(id)sender
{
    int value = [theSlider intValue];
    [theLabel setIntValue:value];
}
Zunächst wird sich der aktuelle Wert vom Slider geholt, nur um ihn anschliessend an das Label Steuerelement zu senden. Eine weitere Bearbeitung geschieht nicht.

Falls Sie diesen Code testen möchten, vergessen Sie nicht im Interface Builder für den Slider die Eigenschaft Continuous zu aktivieren. Erst dann werden auch während der Slider bewegt wird, Nachrichten gesendet.
stacks_image_6C24C688-83D6-44BB-9B37-BAA88F205FEB
Aus technischer Sicht ist an dieser Lösung wahrscheinlich wenig auszusetzen, sie funktioniert perfekt, obwohl es natürlich ein großer Aufwand ist. Leider nimmt der Silderwert immer einen Weg über eine Action und eine Methode, nur um von einem Steuerelement in ein anderes zu gelangen. Dank Datenbindung ist das nun nicht mehr nötig.
Zwar kann man Steuerelemente nicht direkt mit einander verbinden, wohl aber an eine gemeinsame Datenquelle. Alles, was nötig ist, ist ein passendes Property im Controller, der in der folgenden Abblidung SliderLabelBindingAppDelegate heisst.
@property (readwrite) int sliderValue;
stacks_image_F7F32EA6-E575-4794-9BE2-F6F3EC106FFB