@IBInspectable与enum?

ign*_*rum 80 iphone xcode objective-c ios swift

我想创建@IBInspectable元素,如下图所示:

在此输入图像描述

我的想法是使用枚举类似的东西@IBInspectable,但它看起来不是这样,任何想法如何实现这样的元素?

编辑:

看起来@IBInspectable只支持以下类型:

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

长号

yus*_*024 26

那是不可能的(现在).您只能使用在" 用户定义的运行时属性"部分中看到的那些类型.

来自Apple的文档:

您可以将IBInspectable属性附加到类声明,类扩展或类别中的任何属性,以用于Interface Builder定义的运行时属性支持的任何类型:布尔值,整数或浮点数,字符串,本地化字符串,矩形,点,大小,颜色,范围和零.

  • 当我想使用枚举时,我给枚举值显式赋值(= 1,= 2等).在处理程序中,如果来自IB的值不是枚举中的值之一,我会添加一个断言.令人讨厌的是枚举不受支持,但这个技巧至少使它们更有用. (2认同)

Ant*_*tox 22

另一种解决方法是改变枚举属性对界面构建器的显示方式.例如:

#if TARGET_INTERFACE_BUILDER
@property (nonatomic, assign) IBInspectable NSInteger fontWeight;
#else
@property (nonatomic, assign) FontWeight fontWeight;
#endif
Run Code Online (Sandbox Code Playgroud)

这假设一个名为FontWeight的枚举.它依赖于以下事实:在Objective-C中,枚举及其原始整数值可以在某种程度上互换使用.执行此操作后,您可以在"界面"构建器中为该属性指定一个不太理想的整数但可以工作,并且在以编程方式使用相同属性时保留少量类型安全性.

这是一个比声明一个单独的整数属性更好的选择,因为你不需要编写额外的逻辑来处理第二个整数属性,它也可以用来完成同样的事情.

但是,这不适用于Swift,因为我们无法从整数隐式地转换为枚举.任何有关解决问题的想法都将受到赞赏.

  • 我真的认为这确实可以在Swift中起作用,但是在进一步的测试中……不 (2认同)

Mat*_*ley 7

我使用Inspectable NSInteger值执行此操作并覆盖setter以允许它设置枚举.这具有不使用弹出列表的限制,如果更改枚举值,则接口选项将不会更新以匹配.

例.

在头文件中:

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

...

@property LabelStyle labelStyle;
@property (nonatomic, setter=setLabelAsInt:) IBInspectable NSInteger labelStyleLink;
Run Code Online (Sandbox Code Playgroud)

在实现文件中:

- (void)setLabelAsInt:(NSInteger)value
{
    self.labelStyle = (LabelStyle)value;
}
Run Code Online (Sandbox Code Playgroud)

您可以选择在其中添加一些逻辑,以确保将其设置为有效值