Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Bindung an einen NSView, Teil 1

Auch an eigene Klasse kann mit Cocoa Binding eine direkte Verbindung zwischen zwei Werten hergestellt werden. Im nachfolgenden Beispiel geschieht das mit einer von NSView abgeleiteten Klasse. Mit Hilfe von zwei Schiebereglern (NSSlider) soll ein grafisches Objekt innerhalb eines View bewegt werden. Eine weitere leichte Aufgabe dank Datenbindung. Nennen Sie das nächste Projekt GraficBinding. Wenn Sie eine aktuelle Version von Xcode benutzen, wird automatisch die Klasse GraficBindingAppDelegate als Controller generiert.

Das Objekt, im Beispiel ein Rechteck, soll nicht durch absolute Positionsangaben, sondern durch Prozentwerte positionierbar sein. Bei 0 % befindet sich das Rechteck am linken Rand und bei 100 % ganz am rechten Rand. Ähnlich funktioniert es mit der vertikalen Position. Durch diese Vorgehensweise ist die Position unabhängig von der tatsächlichen Größe des View und die Silder müssen nur auf Werte von 0 bis 100 konfiguriert werden.

Erstellen Sie zunächst eine Klassem die von NSView abgeleitet ist. In Xcode können Sie bei hinzufügen einer neuen Objective-C Klasse NSView als Superklasse auswählen. Dadurch werden automatisch zwei Methode generiert, die Sie später benötigen. Zunächst braucht die Klasse aber zwei Properties, denn ohne sie kann die Datenbindung nicht funktionieren.

Die DrawingView.h
#import <Cocoa/Cocoa.h>

@interface DrawingView : NSView {

    int
positionXpercent;
    int
positionYpercent;
}

@property (readwrite) int positionXpercent;
@property (readwrite) int positionYpercent;

@end
Zunächst sollte die Klasse soweit programmiert werden, dass sie auch ohne Datenbindung etwas anzeigt. Das Rechteck wird zu diesem Zweck in die Mitte, also bei 50 % initialisiert. Dank Properties kann in Obective-C 2.0 auch mit der Punktnotation, also z.B. self.positionXpercent = 50 programmiert werden. Die Code Sense Hilfe von Xcode wird alle zur Verfügung stehenden Eigenschaften anzeigen.

Die Berechung der tatsächlichen Position in Pixeln findet in der drawRect-Methode statt. Diese Methode wird immer automatisch aufgerufen, wenn das View neu gezeichnet werden muss.

Die DrawingView.m
@implementation DrawingView

@synthesize positionXpercent;
@synthesize positionYpercent;

- (
id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {

        self
.positionXpercent = 50;
        self
.positionYpercent = 50;
    }
    return self;
}

- (
void)drawRect:(NSRect)dirtyRect
{
    NSRect bounds = [
self bounds];
    [[NSColor gridColor] set];
    [NSBezierPath fillRect:bounds];

    float
posX = ( bounds.size.width - 20) / 100 *
    self
.positionXpercent;

    float posY = ( bounds.size.height - 20) / 100 * self.positionYpercent;

    NSRect theRect = NSMakeRect(posX, posY,
20, 20);
    [[NSColor redColor] set];
    [NSBezierPath fillRect:theRect];
}

@end
Dieser Code reicht schon, um die Klasse DrawingView zu testen. Erzeugen sie im Interface Builder eine Instanz von DrawingView, indem Sie einen Custom View auf das Programmfenster ziehen und die Klassenidentität auf DrawingView ändern.
stacks_image_840D60A4-1473-4C64-A186-03F185FFB228
Ausserdem sollten Sie den View so konfigurieren, dass er sich bei einer Vergrößerung des Programmfensters anpasst.
stacks_image_B23ECC12-05B2-479B-B1D7-436AED2FA128
Wenn Sie die Anwendung jetzt testen, sollte das Ergebnis ähnlich der folgenden Abbildung aussehen.
stacks_image_55C40310-6263-4918-8E1C-0CD109097118