2015-03-15 8 views
14

Verfügbar geschachtelte Klassen SuperView und NestedView.Wie verschachtelte benutzerdefinierte Ansichtsklasse angeben?

class SuperView : UIImageView { 

    class NestedView : UIImageView { 
     var text : String = "Nested View" 
    } 

    var text : String = "Super View" 
    var nested : NestedView? 

} 

Ich würde gern eine UIImageView die Eigenschaft festlegen namens „Custom Class Name“ auf den Wert „NestedView“ innerhalb des Inspektors der Storyboard-Szene. Aber der Interface Builder konnte die Klasse "NestedView" nicht finden.

enter image description here

+1

Meine Erwartung, basierend darauf, wie verschachtelte Typen woanders arbeiten, wäre, dass Sie die Klasse SuperView.NestedView zuweisen könnten, aber der Interface Builder erlaubt dies nicht. Ich denke, das wäre ein großartiges Feature für den Namespacing kleiner, speziell angefertigter Subviews. –

Antwort

11

Zu diesem Zeitpunkt denke ich, dass Interface Builder nur die Namen der Objective-C-Klassen erkennt. Sie können nach wie vor Interface Builder eine verschachtelte Klasse mit dem Schlüsselwort @objc finden machen:

class SuperView: UIView { 
    @objc(SVNestedView) class NestedView: UIImageView { 
    } 
} 

Dann im Interface Builder an, dass th Ansicht der Klasse SVNestedView ist. Da Objective-C nicht Namespaced ist, müssen Sie immer noch eindeutige Namen für jede verschachtelte Klasse auswählen, aber zumindest die Swift-Seite ist korrekt Namespaced.

+0

Danke, das ist so praktisch! –

+3

Dies scheint nicht mit Swift 3 in Xcode 8.1 zu arbeiten. "SVNestedView" kann in IB immer noch nicht angezeigt werden – oleynikd

0

In Swift, eine Instanz einer inneren Klasse ist unabhängig von jeder Instanz der äußeren Klasse. Es ist so, als ob alle inneren Klassen in Swift mit der statischen Java-Klasse deklariert würden.

Ich glaube nicht, dass dieses Klassen-Design zu Ihrer Anforderung passt. Was Sie tun müssen, ist, müssen Sie eine neue Klasse außerhalb Ihre Ansicht erstellen, und erstellen Sie eine Art von Zusammensetzung. Dies wird sicherlich für Sie funktionieren.

Hier einige Änderungen an Ihrem Code ist:

class SuperView : UIImageView { 
    var text : String = "Super View" 
    var nested : NestedView = NestedView() 
} 

class NestedView : UIImageView { 
    var text : String = "Nested View" 
} 
Verwandte Themen