Frage

In meinem Code unten ist CustomWindow eine Unterklasse von NSWindow.

CustomWindow *window = [[CustomWindow alloc] init];
if (![NSBundle loadNibNamed:@"NibName" owner:window])
[window center]; // doesn't work

Wie erhalten Sie einen Zeiger zur Steuerung Ihres XIB, nachdem Sie es geladen haben, sodass Sie beispielsweise das NSWindow zentrieren können (ich meine das serialisierte Fenster, das sich im XIB befindet)?

Was mache ich hier falsch?

War es hilfreich?

Lösung

Sie sollten eine verwenden NSWindowController Unterklasse. NSWindowController ist speziell so konzipiert, dass sie genau das tun, was Sie erreichen möchten, und löst mehrere Probleme, auf die Sie begegnen werden, wenn Sie die NIB direkt mit den Methoden von NSBundle. Sie sollten im Allgemeinen immer eine verwenden NSWindowController Unterklasse zum Verwalten von Windows.

Erstellen Sie eine Unterklasse von NSWindowController:

@interface MyWindowController : NSWindowController {}
@end

@implementation MyWindowController
- (id)init
{
    self = [super initWithWindowNibName:@"MyWindow"];
    if(self)
    {
        //initialize stuff
    }
    return self;
}
//this is a simple override of -showWindow: to ensure the window is always centered
-(IBAction)showWindow:(id)sender
{
    [super showWindow:sender];
    [[self window] center];
}
@end

Setzen Sie im Schnittstellenbuilder die Klasse von Der Eigentümer der Datei sein MyWindowController und verbinden Sie die window Auslass von Der Eigentümer der Datei zum Fensterobjekt in Ihrer NIB.

Sie können das Fenster dann anzeigen, indem Sie dies tun:

MyWindowController* controller = [[MyWindowController alloc] init];
[controller showWindow:self];

Andere Tipps

In meinem Code unten ist CustomWindow eine Unterklasse von NSWindow.

CustomWindow *window = [[CustomWindow alloc] init];
if (![NSBundle loadNibNamed:@"NibName" owner:window])
[window center]; // doesn't work

Wie erhalten Sie einen Zeiger zur Steuerung Ihrer XIB, nachdem Sie sie geladen haben, sodass Sie beispielsweise das NSWindow innerhalb der XIB zentrieren können?

„Das NSWindow im XIB zentrieren“ macht keinen Sinn (Sie würden es zentrieren). auf dem Bildschirm), es sei denn, Sie meinen die Zentrierung des NSWindow-Objekts, das sich innerhalb der xib befindet. Warum erstellen Sie in diesem Fall ein weiteres NSWindow-Objekt (CustomWindow) außerhalb der xib?

Denken Sie daran, dass eine Nib (oder Xib) ein Archiv von Objekten ist.Wenn Sie ein Fenster verwenden möchten, das Sie in Ihrer Feder haben, müssen Sie einen Ausgang erstellen, der auf dieses Fenster zeigt, die Klasse des Dateieigentümers auf die Klasse festlegen, in der Sie den Ausgang hinzugefügt haben, und den Ausgang anschließen IB, und ernennen Sie das Objekt mit dem Ausgang zum Eigentümer der Datei, indem Sie es an den übergeben owner: Streit.Dieses Objekt ist dann als Eigentümer für die Arbeit mit dem Fenster verantwortlich.Es kann (normalerweise ist es in meinem Code) dasselbe Objekt sein, das die Feder lädt.

Auch, init funktioniert nicht auf NSWindow;Sie müssen verwenden initWithContentRect:styleMask:backing:defer: oder initWithContentRect:styleMask:backing:defer:screen:.Benutzen init wäre nur gültig, wenn Sie es implementiert haben init Sie haben sich in CustomWindow selbst erstellt und einen dieser beiden Selektoren für die verwendet [super init…] Nachricht.

Sie möchten Ihr Fenster wahrscheinlich nicht zum Eigentümer der Datei machen. Normalerweise würden Sie passieren self oder ein Controller -Objekt dort. Dann wenn self oder dieses Controller -Objekt hat einen CustomWindow IBOutlet, Es wird angeschlossen, wenn Sie anrufen loadNibNamed:. Kasse dieser Beitrag Zum Beispiel Code.

Ein XIB ist ein Container für Objekte, er ist nicht gleich einem Fenster. Sie können ein XIB nicht zentrieren, Sie können nur ein in einem XIB enthaltenes Fenster zentrieren.

Außerdem werden die Objekte im XIB erstellt, wenn Sie sie laden. Sie übergeben kein Objekt als Eigentümer, das dann für eines der Objekte im XIB steht. Sie verwenden stattdessen Iboutlets, um Verweise auf die neuen Objekte zu erhalten, die beim Laden des XIB erstellt wurden, und dann können Sie mit ihnen interagieren.

Das Eigentümerobjekt der Datei ist ein spezielles Objekt in XIBs, da es das einzige Objekt ist, das nicht erstellt wird und das Sie angeben können, indem Sie es an übergeben loadNibNamed:owner:. Es ist Ihr Tor zwischen den XIB-geschaffenen Objekten und Ihrer Anwendung.

Normalerweise ist das Eigentümerobjekt eine Art Controller -Klasse. Stellen Sie die Klasse des Eigentümers der Datei im Schnittstellenbuilder auf Ihre Controller -Klasse ein und definieren Sie einige Iboutlets in der Klasse, sie werden im Schnittstellenbuilder im Eigentümer der Datei angezeigt und Sie können Ihre Objekte in der XIB mit ihnen verbinden.

Schließlich, wenn Sie Ihr Controller -Objekt an übergeben loadNibNamed:owner:, Kakao verbindet Ihre Iboutlets mit den neu erstellten Objekten und Sie können sie verwenden, um mit ihnen zu interagieren, z. B. um ein Fenster in Ihrem XIB zu zentrieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top