2013-03-06 5 views
27

Ich bin neu in Cocoa und ich verstehe das Konzept File's Owner einer. Nib-Datei nicht. HierWas ist der Eigentümer der Datei (im Builder für Benutzeroberfläche)?

ist die Art, wie ich die Dinge sehe würde:

  • eine Datei myNibFile.nib Datei Betrachten Sie das beschreibt, wie ein Fenster aussieht.

  • Jetzt möchte ich ein tatsächliches Fenster mit dieser .nib Datei verbinden. Also, ich erstelle eine Klasse myWindow, die eine Unterklasse von NSWindowController ist. Und diese Verbindung zu tun, ändern Sie die init Methode wie folgt:

     -(id)init 
        { 
         [super initWithWindowNibName:@"myNibFile"]; 
         return self; 
        } 
    

Also, ich verstehe, dass wenn ich eine Instanz von myWindow schaffen, das „System“ gehen und Blick auf die .nib Datei und erstellen Sie das entsprechende Objekt.

Also, meine Frage lautet:

  • warum muss ich die File's Owner meiner .nib Datei angeben, dass myWindow ist? Ist das nicht überflüssig?

  • Ich denke, es bedeutet, ich habe nicht wirklich verstanden, was die File's Owner. Was ist es ? Warum muss die .nib-Datei zu etwas gehören? Kann es nicht "irgendwo" in meiner "Anwendung" sein und wenn es benötigt wird, geht das "System" dorthin und benutzt es?

Danke, dass Sie mir geholfen haben, in diesen neuen Konzepten klarer zu sehen!

Antwort

41

Zwei Punkte in Erinnerung bleiben:

  • Der Datei-Besitzer das Objekt, das die Spitze lädt, das heißt, das Objekt, das die Nachricht loadNibNamed: oder initWithNibName: empfängt.
  • Wenn Sie nach dem Laden auf alle Objekte in der Feder zugreifen möchten, können Sie im Dateibesitzer eine Steckdose festlegen.

Sie haben also eine schicke Ansicht mit vielen Schaltflächen, Unteransichten usw. Erstellt. Wenn Sie diese Ansichten/Objekte jederzeit nach dem Laden der Feder aus dem Ladeobjekt (normalerweise eine Ansicht oder einen Fenster-Controller) ändern möchten, legen Sie für diese Objekte Steckdosen für den Dateibesitzer fest. So einfach ist das.

Dies ist der Grund, warum standardmäßig alle View Controller oder Window Controller als Dateieigner fungieren und auch eine Steckdose zum Hauptfenster oder View-Objekt in der NIB-Datei haben: weil du, wenn du etwas kontrollierst Ich brauche definitiv eine Steckdose, damit Sie Nachrichten senden können.

Der Grund dafür, dass es Dateibesitzer heißt und einen besonderen Platz hat, liegt darin, dass der Dateieigner im Gegensatz zu den anderen Objekten in der Schreibfeder außerhalb der Schreibfeder ist und nicht Teil davon ist. Tatsächlich wird es nur verfügbar, wenn die Spitze geladen ist. Der Dateieigentümer ist also ein Stellvertreter oder Proxy für das tatsächliche Objekt, das später die Schreibfeder lädt.

Ich hoffe, Sie haben es verstanden. Ich werde jeden Punkt klären, wenn du fragst.

+0

Danke für die Antwort. Der letzte Absatz ist für mich am wichtigsten: Der Eigentümer der Datei ist nicht Teil der Schreibfeder. Die Antwort 'Sie brauchen Steckdosen ...' ist für mich nicht gültig, da die Steckdosen zu einem Objekt gehören können, das Sie zu Ihrer NIB hinzufügen. Meine Idee, dass Sie ein Objekt und eine NIB über den Code ('loadNibNamed', etc.) verknüpfen können (und eigentlich * müssen *) und damit Sie den redundanten Link' File's Owner' nicht brauchen, ist aber wahr dann: Wie werden Sie tun, um die Ausgänge mit diesem Objekt zu verbinden? Du antwortest diesen Punkt. – Colas

+0

Ich warte auf eine befriedigende Antwort! Vielleicht könnten Sie Ihre Antwort neu organisieren, um den letzten Absatz zu betonen. Vielen Dank. Ich hoffe mein letzter Kommentar ist klar. – Colas

1

Der Eigentümer der Datei ist ein Platzhalter in IB, so dass alle Steckdosen und Aktionen in Ihrem Code "verknüpfbar" in IB sind, können Sie ziehen, um Dinge auf dem Bildschirm mit dem Code zu verbinden.

0

Dateibesitzer in Interface Builder ist so, dass es den Objekttyp des übergeordneten Elements kennt. Dies wird auf zwei Arten verwendet. Erstens, in Interface Builder, damit IB weiß, welche Outlets und Aktionen für die Verbindung verfügbar sind. Zweitens wird es vom Anwendungsframework verwendet, um zu wissen, wie die Dinge nach dem Laden der NIB-Datei wieder mit dem Rest des Codes verbunden werden.

5

Die grundlegende Sache zu verstehen ist, dass Interface Builder ermöglicht es Ihnen, Objekte, die automatisch miteinander verbunden sind, ohne Aufwand seitens Ihres Programms zu erstellen. Sie können alle Arten von Objekten einschließlich nicht sichtbarer Objekte instanziieren und sie können miteinander verknüpft sein. Sie können z. B. die Instanz einer Datenquelle für die Tabellenansicht zusammen mit der Ansicht selbst usw. erstellen. Dieser Mechanismus wird normalerweise verwendet, um einen Anwendungsdelegaten in der Hauptmenü-NIB zu erstellen.

Da dies jedoch alles per Drag & Drop getan wird, scheint es keine Möglichkeit, dass Sie eine Verbindung zwischen einem der NIB-Objekte und die Objekte, die bereits in Ihrer Anwendung existieren, mit einer Ausnahme bilden können.

Wenn Code die NIB-Datei lädt, haben Sie die Möglichkeit, genau ein Objekt anzugeben, das die NIB als "Files Owner" betrachtet. Dies ist der Platzhalter, den Sie im Interface Builder sehen. Da es jedes Objekt in Ihrer Anwendung darstellen kann, kann Interface Builder nicht wissen, welche Aktionen/Ausgänge darauf verfügbar sind.Aus diesem Grund können Sie die "Klasse" des Dateibesitzers auf der Registerkarte "Attribute" ändern.

Dateien Besitzer bedeutet nicht wirklich "Besitz" oder "Elternschaft". Was es darstellt, ist "das Objekt, das diese NIB geladen hat".

+1

Ich verstehe immer noch nicht, seit wie ich wirklich die NIB aus meinem Programm mit 'initWithWindowNibName: @" myNibFile "'. Mit dieser Anweisung erstelle ich die Verbindung zwischen der NIB und anderen Objekten. – Colas

Verwandte Themen