enum
不是Interface Builder定义的运行时属性。
以下内容未在Interface Builder的属性检查器中显示:
enum StatusShape:Int {
case Rectangle = 0
case Triangle = 1
case Circle = 2
}
@IBInspectable var shape:StatusShape = .Rectangle
从文档中: 您可以将IBInspectable属性附加到类声明,类扩展或类别中的任何属性,以用于Interface Builder定义的运行时属性支持的任何类型:布尔值,整数或浮点数,字符串,本地化字符串,矩形,点,大小,颜色,范围和零。
问:如何在Interface Builder的属性检查器中看到enum
?
答案 0 :(得分:67)
@IBInspectable var shape:StatusShape = .Rectangle
仅在Interface Builder中创建一个空白条目:
使用适配器,它将充当Swift和Interface Builder之间的桥接器
IB可以检查shapeAdapter
:
// IB: use the adapter
@IBInspectable var shapeAdapter:Int {
get {
return self.shape.rawValue
}
set( shapeIndex) {
self.shape = StatusShape(rawValue: shapeIndex) ?? .Rectangle
}
}
与条件编译方法(使用#if TARGET_INTERFACE_BUILDER
)不同,shape
变量的类型不随目标而变化,可能需要进一步更改源代码以应对shape:NSInteger
vs 。shape:StatusShape
变体:
// Programmatically: use the enum
var shape:StatusShape = .Rectangle
@IBDesignable
class ViewController: UIViewController {
enum StatusShape:Int {
case Rectangle
case Triangle
case Circle
}
// Programmatically: use the enum
var shape:StatusShape = .Rectangle
// IB: use the adapter
@IBInspectable var shapeAdapter:Int {
get {
return self.shape.rawValue
}
set( shapeIndex) {
self.shape = StatusShape(rawValue: shapeIndex) ?? .Rectangle
}
}
}
►在GitHub上找到此解决方案。
答案 1 :(得分:20)
我不记得swift语法,但这就是我在obj-c
中解决它的方法#if TARGET_INTERFACE_BUILDER
@property (nonatomic) IBInspectable NSInteger shape;
#else
@property (nonatomic) StatusShape shape;
#endif
答案 2 :(得分:4)
这是当今所有语法的典型完整示例
import UIKit
@IBDesignable class ClipLabels: UILabel {
enum Side: Int { case left, right }
var side: Side = .left {
didSet {
common()
}
}
@available(*, unavailable, message: "IB only")
@IBInspectable var leftRight01: Int {
get {
return self.side.rawValue
}
set(index) {
self.side = Side(rawValue: index) ?? .left
}
}
只是一个使用示例...
switch side {
case .left:
textColor = .red
case .right:
textColor = .green
}
对于这个关键的Swift / iOS质量检查,
•@SwiftArchitect的非常老的答案是完全正确的,但
•我刚刚对其进行了更新,并添加了关键的“不可用”内容,现在在Swift中可以实现。
答案 3 :(得分:3)
这是一个旧线程,但很有用。我已经调整了我对swift 4.0和Xcode 9.0的答案--Swift 4对这个问题有自己的小问题。我有一个带有枚举类型的@IBInspectable变量,并且Xcode 9.0不满意,向我显示这个"属性不能标记为@IBInspectable,因为它的类型不能在Objective-c"中表示。
@Eporediese部分回答了这个问题(对于swift3);使用故事板的属性,但使用其他代码的直接枚举。下面是一个更完整的代码集,它为您提供了在两种情况下都可以使用的属性。
enum StatusShape: Int {
case Rectangle = 0
case Triangle = 1
case Circle = 2
}
var _shape:StatusShape = .Rectangle // this is the backing variable
#if TARGET_INTERFACE_BUILDER
@IBInspectable var shape: Int { // using backing variable as a raw int
get { return _shape.rawValue }
set {
if _shape.rawValue != newValue {
_shape.rawValue = newValue
}
}
}
#else
var shape: StatusShape { // using backing variable as a typed enum
get { return _shape }
set {
if _shape != newValue {
_shape = newValue
}
}
}
#endif
答案 4 :(得分:1)
Swift 3 基于the declarations
的解决方案keyboardDistanceFromTextField
答案 5 :(得分:-1)
I just removed @IBInspectable keyword
//MARK:- Not confirm its will work for other or not but easy way once you can try it
出现该错误的位置(对我来说这是两次)。这将要求您 解锁VHBoomMenuButton库,以便您进行更改。
and its work