2015-08-01 21 views
5

Ich baue ein NSView, das eine Art Sammlungsansicht darstellt, aber anstelle einer Tabelle oder eines Gitters wird es ein Grafikeditor sein (ähnlich dem Quarz-Composer).Verwenden von Xcode und Interface Builder zum Erstellen von Prototypansichten

Das Problem, mit dem ich jetzt konfrontiert bin, ist, dass ich Prototypansichten (für die Knoten) von einer xib Datei laden möchte. Ähnlich wie mit UITableView und UICollectionView können Sie Prototypzellen in Interface Builder entwerfen. Wie werden diese Objekte dann in mehreren Kopien instanziiert?

Wie funktioniert UITableViewController et. al. Dies erreichen?

Lösungen I gedacht haben:

  • Kopieren Sie die Ansicht, aber NSView nicht NSCopying unterstützt "out of the box". Dies scheint bisher das logischste zu sein. Es scheint auch die einzige Option zu sein, wenn Sie das NSView in einem storyboard statt einem xib behalten möchten.
  • Laden Sie eine Feder und senden Sie dann mehrmals die [nib instantiateNibWithOwner:self topLevelObjects:nil].
  • NSView unterstützt NSCoding aber die Verwendung fühlt sich eher wie ein Hack.

Weitere Ideen?

Ich entwickle eine Mac OS X App, keine iOS App.

Antwort

-1

Sie sind richtig, Implementierung NSCopying über NSCodinghat wie ein Hack fühlen, aber es ist prob'ly der schnellste und zuverlässigste Weg, es zu codieren.

Copy NSView in cocoa/objective-c „related Kopie/code Antwort“

Sie können Ihre Ansicht in dem Storyboard als Top-Level-Objekt von einer bestimmten Szene setzen. Stellen Sie sicher, dass Sie über den Controller/Lader dieser Szene eine Steckdose haben. Sie könnten es wahrscheinlich in eine NSData packen und für jede "Kopie", die Sie erstellen/nicht archivieren wollen, einfach daran festhalten.

+1

Wirklich? Sie denken, das ist besser als "Laden Sie eine Feder und senden Sie dann' [nib instantiateNibWithOwner: self topLevelObjects: nil] 'mehrere Male"? Ich meine, das ist, was eine Feder ist: eine Möglichkeit, eine ganze Reihe von Ansichten so oft zusammenzufassen, wie Sie möchten. Und es ist besser, sich die Mühe zu machen, die Ansichtshierarchie kopierbar zu machen? – matt

+0

I _do_ bevorzuge das 'nib? .instantiate (mitOwner: self, topLevelObjects: nil)' (um es willkürlich in Swift zu übersetzen). Ich bin mir nicht sicher über die tatsächlichen Einzelheiten der Implementierung. Wenn die betreffende Datei nicht zwischengespeichert wird, könnte diese Option erheblich langsamer sein. Während das Speichern Ihres Prototyps in einem 'Data'-Objekt garantiert ist, ist es im Speicher. Realistischerweise bezweifle ich, dass der Runtime-Hit auffällt. (Ich würde dies als gleich schnell und wahrscheinlich als zuverlässig qualifizieren.) – bshirley

+0

Ich könnte auch _nib? .instantiate (withOwner: ** nil **, topLevelObjects: ** objects **) _ verwenden und ein veränderbares Array übergeben, um das zurückzugeben anzeigen, ohne dass ein Eigentümer oder eine Verkaufsstelle innerhalb dieses Eigentümers benötigt wird, um eine Referenz auf die neu instanziierte Ansicht zu erhalten. – bshirley

Verwandte Themen