2015-02-26 16 views
67

würde Ich mag @IBInspectable Element erstellen, wie Sie auf dem Bild sehen:@IBInspectable mit Enum?

enter image description here

meine Idee ist für @IBInspectable so etwas wie Aufzählungstyp zu verwenden, aber es sieht aus wie es nicht der Fall ist, jede Ideen, wie man Element wie das einführt?

EDIT:

Es ist wie @IBInspectable sieht unterstützt nur diese Typen:

  • Int
  • CGFloat
  • Double
  • String
  • Bool
  • CGPoint
  • CGSize
  • CGRect
  • UIColor
  • UIImage

doofer

+0

Umgehung des Problems der Sorten ein int im keyboard Feld gesetzt, ist eine prüfbare berechnete Eigenschaft setzen in vor dem Wert, den Sie festlegen möchten. Natürlich wird es immer noch nicht magisch als ein Popup-Menü mit aufgezählten Werten in Interface Builder erscheinen; aber zumindest können Sie einen inspizierbaren Wert definieren und damit eine Aufzählung festlegen. – matt

+4

Auf der WWDC in diesem Jahr fragte ich einen Apple-Ingenieur im Developer Tools-Labor darüber. Er sagte, dass er zustimmen würde, dass es ein großartiges Feature wäre, aber derzeit ist es nicht möglich. Er schlug vor, ich sollte ein Radar bei https://bugreport.apple.com einreichen, was ich tat. Es wurde als Duplikat der Ausgabe 15505220 geschlossen, aber ich würde Menschen, die ähnliche Probleme stellen, wärmstens empfehlen. Diese Dinge werden oft angesprochen, wenn sich genug Leute beschweren. –

+1

wie ist diese Frage unterscheidet sich von http://stackoverflow.com/questions/27432736/how-to-create-an-ibinspectable-of-type-enum – SwiftArchitect

Antwort

23

das nicht möglich ist (bis jetzt). Sie können nur die Typen verwenden, die Sie unter Benutzerdefinierte Laufzeitattribute finden.

Von Apple doc:

Sie können in einer Klassendeklaration, Klassenerweiterung oder eine Kategorie für jede Art der IBInspectable Attribut für jede Eigenschaft anhängen, die von dem Interface Builder definiert Laufzeit unterstützt wird Attribute: boolean, integer oder Gleitkommazahl, Zeichenfolge, lokalisierte Zeichenfolge, Rechteck, Punkt, Größe, Farbe, Bereich und Null.

+1

Wenn ich eine eNUM nutzen will, muss ich die eNUM-Werte explizite Zuweisungen geben (= 1, = 2, etc.). Und im Handler füge ich eine Assertion hinzu, wenn der Wert von IB nicht einer der Werte aus der Enumeration ist. Ärgerlich, dass Enums nicht unterstützt werden, aber dieser Trick macht sie zumindest brauchbarer. –

+0

Ein Enum ist eine ganze Zahl. –

+0

Immer noch nicht möglich in Xcode 6.3.1 Enum-Typen ... – matm

1

Wie @sikhapol antwortete, ist dies nicht möglich. Die Problemumgehung, die ich dafür verwende, ist eine Reihe von IBInspectable Bools in meiner Klasse und wählen Sie einfach eine in Interface Builder. Für zusätzliche Sicherheit, dass mehrere nicht gesetzt sind, fügen Sie einen NSAssert in den Setter für jeden.

- (void)setSomeBool:(BOOL)flag 
{ 
    if (flag) 
    { 
     NSAssert(!_someOtherFlag && !_someThirdFlag, @"Only one flag can be set"); 
    } 
} 

Dies ist ein wenig langweilig und ein wenig IMO schlampig, aber es ist der einzige Weg, diese Art von Verhalten zu erreichen, die ich mir vorstellen kann

1

ich hinzufügen möchte, dass die Kennungen eines enum nicht verfügbar zur Laufzeit für jeden in Objective-C. Es kann also nicht möglich sein, sie überall anzuzeigen.

6

Ich mache dies mit einem Inspectable NSInteger-Wert und überschreiben Sie den Setter, damit es die Enumeration festlegen kann. Dies hat die Einschränkung, dass keine Popup-Liste verwendet wird. Wenn Sie Ihre Enum-Werte ändern, werden die Schnittstellenoptionen nicht aktualisiert.

Beispiel.

In Header-Datei:

typedef NS_ENUM(NSInteger, LabelStyle) 
{ 
    LabelStyleContent = 0, //Default to content label 
    LabelStyleHeader, 
}; 

... 

@property LabelStyle labelStyle; 
@property (nonatomic, setter=setLabelAsInt:) IBInspectable NSInteger labelStyleLink; 

In der Implementierungsdatei:

- (void)setLabelAsInt:(NSInteger)value 
{ 
    self.labelStyle = (LabelStyle)value; 
} 

Sie optional eine gewisse Logik darin hinzufügen könnte, um sicherzustellen, dass es

+0

Nicht sicher zu verwenden, warum diese gestimmt war unten. Scheint wie ein guter Weg, um das Problem zu umgehen. – Fogmeister

+0

Danke @Fogmeister - Ich benutze diese Implementierung momentan in einer App :) –

18
auf einen gültigen Wert gesetzt wird

Eine weitere Problemumgehung dafür besteht darin, zu ändern, wie eine Aufzählungseigenschaft für den Interface Builder angezeigt wird. Beispiel:

#if TARGET_INTERFACE_BUILDER 
@property (nonatomic, assign) IBInspectable NSInteger fontWeight; 
#else 
@property (nonatomic, assign) FontWeight fontWeight; 
#endif 

Dies setzt eine Enum namens FontWeight voraus. Es beruht auf der Tatsache, dass Enums und ihre rohen Ganzzahlwerte in Objective-C etwas austauschbar verwendet werden können. Nachdem Sie dies getan haben, können Sie eine Ganzzahl im Interface-Builder für die Eigenschaft angeben, die nicht ideal ist, aber funktioniert und eine kleine Menge an Typsicherheit bei derselben Eigenschaft programmatisch beibehält.

Dies ist eine bessere Alternative als eine separate Integer-Eigenschaft zu deklarieren, da Sie keine zusätzliche Logik schreiben müssen, um eine zweite Integer-Eigenschaft zu behandeln, die auch dazu verwendet werden könnte, dasselbe zu erreichen.

Dies funktioniert jedoch nicht mit Swift, da wir nicht implizit von einer Ganzzahl auf eine Enumeration umwandeln können. Irgendwelche Gedanken zum Lösen würden geschätzt.

+1

Ich dachte wirklich, das hat in Swift funktioniert, aber in weiteren Tests ... nein –

0

Meine Lösung zu tun war:

@IBInspectable 
var keyboardType = UIKeyboardType.default.rawValue { 
     didSet { 
      textField.keyboardType = UIKeyboardType(rawValue: keyboardType)! 
     } 
} 

Auf der IB selbst, müssen Sie