ios - Enum के साथ @IBInspectable?
objective-c iphone (5)
इसके लिए एक और काम-काज को बदलना है कि कैसे एक एन्यूमरेशन प्रॉपर्टी इंटरफ़ेस बिल्डर को दिखाई देती है। उदाहरण के लिए:
#if TARGET_INTERFACE_BUILDER
@property (nonatomic, assign) IBInspectable NSInteger fontWeight;
#else
@property (nonatomic, assign) FontWeight fontWeight;
#endif
यह एक Enum मानता है जिसे FontWeight कहा जाता है। यह इस तथ्य पर निर्भर करता है कि उद्देश्य और सी में उनके कच्चे पूर्णांक मानों का आपस में कुछ हद तक उपयोग किया जा सकता है। ऐसा करने के बाद आप संपत्ति के लिए इंटरफ़ेस बिल्डर में एक पूर्णांक निर्दिष्ट करने में सक्षम होते हैं जो आदर्श नहीं है, लेकिन काम करता है, और उसी प्रकार की संपत्ति का उपयोग करते समय प्रोग्राम की थोड़ी मात्रा को बनाए रखता है।
एक अलग पूर्णांक संपत्ति घोषित करने की तुलना में यह एक बेहतर विकल्प है क्योंकि आपको दूसरे पूर्णांक संपत्ति को संभालने के लिए अतिरिक्त तर्क लिखने की आवश्यकता नहीं है जिसका उपयोग उसी चीज को पूरा करने के लिए भी किया जा सकता है।
हालाँकि, यह स्विफ्ट के साथ काम नहीं करता है क्योंकि हम एक पूर्णांक से एक एनम तक निहित करने में सक्षम नहीं हैं। सुलझाने पर कोई विचार जो सराहना की जाएगी।
जैसा कि आप नीचे दी गई तस्वीर में देखते हैं, मैं
@IBInspectable
तत्व बनाना चाहता हूं:
मेरे विचार में
@IBInspectable
लिए enum जैसे प्रकार का उपयोग करना है, लेकिन ऐसा लगता है कि यह मामला नहीं है, किसी भी विचार जैसे तत्व को कैसे लागू किया जाए?
संपादित करें:
ऐसा लगता है कि
@IBInspectable
केवल इन प्रकारों का समर्थन करता है:
-
Int
-
CGFloat
-
Double
-
String
-
Bool
-
CGPoint
-
CGSize
-
CGRect
-
UIColor
-
UIImage
बहुत बेकार
जैसा कि @sikhapol ने उत्तर दिया, यह संभव नहीं है।
इसके लिए मैं जिस वर्कअराउंड का उपयोग करता हूं,
IBInspectable
है मेरी कक्षा में
IBInspectable
का एक समूह होना और इंटरफ़ेस बिल्डर में एक का चयन करना।
अतिरिक्त सुरक्षा के लिए, जो एक से अधिक सेट नहीं हैं, प्रत्येक के लिए सेटर में एक
NSAssert
जोड़ें।
- (void)setSomeBool:(BOOL)flag
{
if (flag)
{
NSAssert(!_someOtherFlag && !_someThirdFlag, @"Only one flag can be set");
}
}
यह थोड़ा थकाऊ और थोड़ा मैला IMO है, लेकिन यह इस तरह के व्यवहार को पूरा करने का एकमात्र तरीका है जिसके बारे में मैं सोच सकता हूं
मैं एक निरीक्षण योग्य 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;
}
आप वैकल्पिक रूप से इसमें कुछ तर्क जोड़ सकते हैं ताकि यह सुनिश्चित हो सके कि इसे वैध मूल्य पर सेट किया जा रहा है
मैं जोड़ना चाहता हूं कि उद्देश्य-सी में किसी के लिए भी
enum
के पहचानकर्ता उपलब्ध नहीं हैं।
इसलिए इसे कहीं भी प्रदर्शित करने की संभावना नहीं है।
सिखपोल सही है, एनमोज़ अभी भी समर्थित नहीं हैं xCode 9 में। मेरा मानना है कि सबसे सुरक्षित तरीका यह है कि एनम का उपयोग स्ट्रिंग्स के रूप में किया जाए और एक "छाया" (निजी) IBInspectable var को लागू किया जाए। यहाँ एक BarBtnPaintCode आइटम का एक उदाहरण है जो एक बारबटन आइटम का प्रतिनिधित्व करता है जिसे इंटरफ़ेस बिल्डर (स्विफ्ट 4) के ठीक अंदर कस्टम आइकन (जो कि पेंटकोड का उपयोग करके किया जाता है) के साथ स्टाइल किया जा सकता है।
इंटरफ़ेस में आप केवल स्ट्रिंग दर्ज करते हैं (एनम मान के समान), जो इसे स्पष्ट रखता है (यदि आप संख्याओं में प्रवेश कर रहे हैं, तो कोई भी नहीं जानता कि उन्हें क्या पता है)
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
}
}
}