@IBInspectable与枚举?

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

在这里输入图像说明

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

编辑:

它看起来像@IBInspectable只支持这些types:

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

长号

这是不可能的(现在)。 您只能使用在“ 用户定义的运行属性”部分中看到的那些types。

从苹果的文档 :

您可以将IBInspectable属性附加到类接口生成器定义的运行时属性所支持的任何types的类声明,类扩展或类别中的任何属性:布尔值,整数或浮点数,string,本地化string,矩形,点,大小,颜色,范围和零。

解决此问题的另一个解决方法是更改​​枚举属性如何显示为接口构build器。 例如:

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

这假定一个名为FontWeight的枚举。 它依赖于枚举和它们的原始整数值在Objective-C中可以相互交换使用的事实。 这样做后,您可以指定一个在接口构build器中的一个整数的属性,这是不理想的,但工作,并保持less量的types安全性,当编程方式使用相同的属性。

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

然而,这不适用于Swift,因为我们无法隐式地从一个整数转换为一个枚举。 任何想法解决这个将不胜感激。

我使用Inspectable NSInteger值执行此操作,并覆盖setter以允许它设置枚举。 这有没有使用popup列表的限制,如果你改变你的枚举值,那么接口选项将不会更新以匹配。

例。

在头文件中:

 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; } 

你可以select添加一些逻辑,以确保它被设置为一个有效的值

正如@sikhapol回答,这是不可能的。 我使用的解决方法是在我的课堂上有一堆IBInspectable ,只需在界面构build器中select一个。 为了增加安全性,没有设置多个,在每个setter中添加一个NSAssert

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

这是一个单调乏味,有点草率的海事组织,但这是我能想到的完成这种行为的唯一方法

我想补充一点,一个enum的标识符在运行时对Objective-C中的任何人都是不可用的。 所以不可能在任何地方显示。

我的解决办法是做:

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

在IB本身,您将需要在keyboardType字段中设置一个int