유형 열거형의 IBInspectable을 작성하는 방법
enum
Interface Builder 정의 런타임 특성이 아닙니다.Interface Builder의 Attributes Inspector에는 다음 내용이 표시되지 않습니다.
enum StatusShape:Int {
case Rectangle = 0
case Triangle = 1
case Circle = 2
}
@IBInspectable var shape:StatusShape = .Rectangle
설명서에서:Interface Builder에서 정의한 런타임 특성(부울, 정수 또는 부동 소수점 번호, 문자열, 지역화 문자열, 직사각형, 점, 크기, 색상, 범위 및 0)을 클래스 선언, 클래스 확장 또는 범주의 속성에 연결할 수 있습니다.
Q: 어떻게 볼 수 있습니까?enum
Interface Builder's Attributes Inspector?
스위프트 3
@I inspectable var shape:StatusShape = .Rectangle
Interface Builder에 빈 항목만 만듭니다.
Swift와 Interface Builder 간의 브리지 역할을 하는 어댑터를 사용합니다.
shapeAdapter
IB에서 검사할 수 있습니다.
// 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
대.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에서 이 솔루션을 찾아보세요.
int로 검사 가능한 enum을 설정하는 대신 문자열로 설정할 수도 있습니다.드롭다운만큼 선호되지는 않지만, 적어도 이 옵션은 어느 정도의 가독성을 제공합니다.
스위프트 전용 옵션:
// 1. Set up your enum
enum Shape: String {
case Rectangle = "rectangle" // lowercase to make it case-insensitive
case Triangle = "triangle"
case Circle = "circle"
}
// 2. Then set up a stored property, which will be for use in code
var shape = Shape.Rectangle // default shape
// 3. And another stored property which will only be accessible in IB (because the "unavailable" attribute prevents its use in code)
@available(*, unavailable, message: "This property is reserved for Interface Builder. Use 'shape' instead.")
@IBInspectable var shapeName: String? {
willSet {
// Ensure user enters a valid shape while making it lowercase.
// Ignore input if not valid.
if let newShape = Shape(rawValue: newValue?.lowercased() ?? "") {
shape = newShape
}
}
}
열거형에 이니셜라이저를 추가하여 objective-c에서도 작동할 수 있습니다.그러나 컴파일러는 swift code에서 사용자의 IB 전용 속성에 대해 "사용 불가" 오류만 표시합니다.
Obj-C 호환성을 갖춘 Swift 옵션:
@objc enum Shape: Int {
case None
case Rectangle
case Triangle
case Circle
init(named shapeName: String) {
switch shapeName.lowercased() {
case "rectangle": self = .Rectangle
case "triangle": self = .Triangle
case "circle": self = .Circle
default: self = .None
}
}
}
var shape = Shape.Rectangle // default shape
@available(*, unavailable, message: "This property is reserved for Interface Builder. Use 'shape' instead.")
@IBInspectable var shapeName: String? {
willSet {
if let newShape = Shape(rawValue: newValue?.lowercased() ?? "") {
shape = newShape
}
}
}
빠른 구문은 기억나지 않지만 obj-c에서 이렇게 풀었습니다.
#if TARGET_INTERFACE_BUILDER
@property (nonatomic) IBInspectable NSInteger shape;
#else
@property (nonatomic) StatusShape shape;
#endif
2020년 - @SwiftArchitect 답변이 오늘 업데이트됨:
오늘의 모든 구문에 대한 전형적인 전체 예시가 있습니다.
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 QA가 중요한 경우,
• @SwiftArchitect의 아주 오래된 답변은 완벽하게 맞지만,
• 방금 업데이트하고 중요한 "이용 불가" 사항을 추가했는데, 이는 스위프트에서 가능합니다.
이것은 오래된 실이지만 유용합니다.저는 스위프트 4.0으로 답변을 수정했고 Xcode 9.0 - Swift 4는 이 문제와 관련하여 자체적으로 약간의 문제가 있습니다.열거형이 있는 @IBIinspectable 변수가 있는데 Xcode 9.0이 만족스럽지 않아 "Property는 Objective-c에서 해당 유형을 나타낼 수 없기 때문에 @IBIinspectable로 표시할 수 없습니다."라고 표시됩니다.
@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
Swift Architect 기반의 Swift 3 솔루션
enum StatusShape: Int {
case rectangle, triangle, circle
}
var statusShape: StatusShape = .rectangle
#if TARGET_INTERFACE_BUILDER
@IBInspectable var statusShapeIB: Int {
get {
return statusShape.rawValue
}
set {
guard let statusShape = StatusShape(rawValue: newValue) else { return }
self.statusShape = statusShape
}
} //convenience var, enum not inspectable
#endif
언급URL : https://stackoverflow.com/questions/27432736/how-to-create-an-ibinspectable-of-type-enum
'programing' 카테고리의 다른 글
Oracle PL/SQL Developer로 덤프를 만드는 방법은? (0) | 2023.09.25 |
---|---|
알 수 없는 초기 문자 집합 인덱스 '255'가 서버에서 수신됨 (0) | 2023.09.25 |
(푸쉬한) 잘못된 커밋 메시지를 init에서 편집하려면 어떻게 해야 합니까? (0) | 2023.09.25 |
어떻게 하면 유튜브 비디오의 음소거를 해제하고 자동 재생을 해제할 수 있습니까? (0) | 2023.09.25 |
프로젝트에 새 글꼴을 가져오는 방법 - Angular 5 (0) | 2023.09.25 |