@Inspectable with enum?
다음을 생성합니다.@IBInspectable
아래 그림에 보이는 요소:
제 아이디어는 에 대한 유형으로 열거형과 같은 것을 사용하는 것입니다.@IBInspectable
하지만 그렇지 않은 것 같은데, 이런 요소를 어떻게 구현할 수 있을지 생각해 본 적 있나요?
편집:
처럼 보입니다.@IBInspectable
는 다음 유형만 지원합니다.
Int
CGFloat
Double
String
Bool
CGPoint
CGSize
CGRect
UIColor
UIImage
유감스러운
그건 불가능해요.사용자 정의 런타임 속성 섹션에 표시되는 유형만 사용할 수 있습니다.
Apple 문서에서:
Interface Builder 정의 런타임 특성(부울, 정수 또는 부동 소수점 번호, 문자열, 지역화된 문자열, 사각형, 점, 크기, 색상, 범위 및 0)이 지원하는 모든 유형의 클래스 선언, 클래스 확장 또는 범주의 속성에 IBInspectable 특성을 연결할 수 있습니다.
이에 대한 또 다른 해결 방법은 열거 속성이 인터페이스 작성기에 나타나는 방식을 변경하는 것입니다.예:
#if TARGET_INTERFACE_BUILDER
@property (nonatomic, assign) IBInspectable NSInteger fontWeight;
#else
@property (nonatomic, assign) FontWeight fontWeight;
#endif
FontWeight라는 열거형을 가정합니다.그것은 목표-C에서 열거형과 그 원시 정수 값이 다소 상호 교환적으로 사용될 수 있다는 사실에 의존합니다.이 작업을 수행하면 인터페이스 작성기에서 이상적이지는 않지만 작동하고 동일한 속성을 프로그래밍 방식으로 사용할 때 약간의 유형 안전을 유지하는 속성에 대한 정수를 지정할 수 있습니다.
이 방법은 별도의 정수 속성을 선언하는 것보다 더 나은 대안입니다. 동일한 작업을 수행하는 데 사용할 수 있는 두 번째 정수 속성을 처리하기 위해 추가 논리를 작성할 필요가 없기 때문입니다.
그러나 정수에서 열거형으로 암시적으로 캐스트할 수 없기 때문에 Swift에서는 작동하지 않습니다.그것을 해결하기 위한 어떤 생각도 감사할 것입니다.
검사 가능한 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;
}
선택적으로 논리를 추가하여 올바른 값으로 설정되었는지 확인할 수 있습니다.
Sikhapol이 맞습니다. xCode 9에서도 아직 열거형이 지원되지 않습니다.가장 안전한 방법은 열거형을 문자열로 사용하고 "섀도"(개인) IB 검사 가능한 변수를 구현하는 것이라고 생각합니다.다음은 Interface Builder(swift 4) 내부에서 사용자 지정 아이콘(PaintCode를 사용하여 수행됨)으로 스타일을 지정할 수 있는 막대 단추 항목을 나타내는 BarBtnPaintCode 항목의 예입니다.
인터페이스 빌드에서 문자열을 입력하기만 하면 됩니다(숫자를 입력하는 경우 아무도 의미를 알 수 없음).
class BarBtnPaintCode: BarBtnPaintCodeBase {
enum TypeOfButton: String {
case cancel
case ok
case done
case edit
case scanQr
//values used for tracking if wrong input is used
case uninitializedLoadedFromStoryboard
case unknown
}
var typeOfButton = TypeOfButton.uninitializedLoadedFromStoryboard
@IBInspectable private var type : String {
set {
typeOfButton = TypeOfButton(rawValue: newValue) ?? .unknown
setup()
}
get {
return typeOfButton.rawValue
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
init(typeOfButton: TypeOfButton, title: String? = nil, target: AnyObject?, action: Selector) {
super.init()
self.typeOfButton = typeOfButton
setup()
self.target = target
self.action = action
self.title = title
}
override func setup() {
//same for all
setTitleTextAttributes([NSAttributedStringKey.font : UIFont.defaultFont(size: 15)],for: UIControlState.normal)
//depending on the type
switch typeOfButton {
case .cancel :
title = nil
image = PaintCode.imageOfBarbtn_cancel(language: currentVisibleLanguage)
case .ok :
title = nil
image = PaintCode.imageOfBarbtn_ok(language: currentVisibleLanguage)
case .done :
title = nil
image = PaintCode.imageOfBarbtn_done(language: currentVisibleLanguage)
case .edit :
title = nil
image = PaintCode.imageOfBarbtn_edit(language: currentVisibleLanguage)
case .uninitializedLoadedFromStoryboard :
title = nil
image = PaintCode.imageOfBarbtn_unknown
break
case .unknown:
log.error("BarBtnPaintCode used with unrecognized type")
title = nil
image = PaintCode.imageOfBarbtn_unknown
break
}
}
}
@sikhapol이 대답했듯이, 이것은 불가능합니다.이 문제를 해결하기 위해 사용하는 해결 방법은 여러 가지가 있습니다.IBInspectable
우리 반에서 쿨하고 인터페이스 빌더에서 하나만 선택하세요. 보안을 는 여러개설추경보우를 합니다.NSAssert
한 사람 한 사람 세터에서.
- (void)setSomeBool:(BOOL)flag
{
if (flag)
{
NSAssert(!_someOtherFlag && !_someThirdFlag, @"Only one flag can be set");
}
}
이것은 약간 지루하고 약간 엉성한 IMO이지만, 제가 생각할 수 있는 이런 종류의 행동을 할 수 있는 유일한 방법입니다.
는 나는추고싶식별들자그것의 를 추가하고 싶습니다.enum
Objective-C에서는 런타임에 사용할 수 없습니다.그래서 어디에도 그것을 전시할 가능성이 있을 수 없습니다.
제 해결책은 다음과 같습니다.
@IBInspectable
var keyboardType = UIKeyboardType.default.rawValue {
didSet {
textField.keyboardType = UIKeyboardType(rawValue: keyboardType)!
}
}
IB 자체에서 키보드에 int를 설정해야 합니다.유형 필드
언급URL : https://stackoverflow.com/questions/28749598/ibinspectable-with-enum
'programing' 카테고리의 다른 글
메이븐 의존성의 순서가 왜 중요합니까? (0) | 2023.07.31 |
---|---|
IDLE 대화형 셸에서 파이썬 스크립트를 실행하는 방법은 무엇입니까? (0) | 2023.07.31 |
하나의 데이터베이스에만 파일 허용 (0) | 2023.07.31 |
1:1 연결 테이블 및 CTE(예: 사용자 및 그룹에 대한 권한)를 사용하여 다른 행과 연결된 SQL 행 찾기 (0) | 2023.07.31 |
Intellij Idea 경고 - "반환된 약속은 무시됩니다" 및 aysnc/wait (0) | 2023.07.31 |