ios - ドキュメント - xcode 9.4 swift




列挙型で@IBInspectable? (5)

@sikhapolが答えたように、これは不可能です。 これに使用する回避策は、クラスに IBInspectable IBInspectable IBInspectable 用意し、インターフェイスビルダーで1つを選択することです。 複数のセキュリティが設定されていないセキュリティを NSAssert には、各セキュリティのセッターに NSAssert を追加します。

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

これは少し面倒で少しだらしないIMOですが、この種の動作を実現する唯一の方法です。

次の図に示すように、 @IBInspectable 要素を作成したいと思います。

私のアイデアは @IBInspectable 型としてenumのようなものを使用することですが、そうではないようです、このような要素を実装する方法はありますか?

編集:

@IBInspectable はこれらのタイプのみをサポートしているようです:

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

残念


Inspectable NSInteger値を使用してこれを行い、列挙子を設定できるようにセッターをオーバーライドします。 これには、ポップアップリストを使用しないという制限があり、列挙値を変更した場合、インターフェースオプションは一致するように更新されません。

例。

ヘッダーファイル:

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

...

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

実装ファイル内:

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

オプションでいくつかのロジックを追加して、有効な値に設定されていることを確認できます。


これに対する別の回避策は、列挙プロパティがインターフェイスビルダーに表示される方法を変更することです。 例えば:

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

これは、FontWeightという列挙型を想定しています。 これは、Objective-Cで列挙型とその生の整数値を多少交換可能に使用できるという事実に依存しています。 これを行った後、理想的ではないが機能し、同じプロパティをプログラムで使用するときに少量のタイプセーフを保持する整数を、Interface Builderでプロパティに指定できます。

これは、同じことを達成するために使用できる2番目の整数プロパティを処理するために追加のロジックを記述する必要がないため、個別の整数プロパティを宣言するよりも優れた代替手段です。

ただし、整数から列挙型に暗黙的にキャストできないため、これはSwiftでは機能しません。 解決することについてのどんな考えでも高く評価されるでしょう。


それは不可能です(今のところ)。 ユーザー定義のランタイム属性 セクションに表示されるタイプのみを使用できます。

Appleの doc から:

IBInspectable属性は、Interface Builderで定義されたランタイム属性でサポートされている任意のタイプのクラス宣言、クラス拡張、またはカテゴリのプロパティに添付できます。ブール、整数または浮動小数点数、文字列、ローカライズされた文字列、長方形、ポイント、サイズ、色、範囲、およびnil。


enum の識別子は、Objective-Cの誰でも実行時に利用できないことを付け加えます。 そのため、どこにでも表示することはできません。





swift