Enum के साथ @IBInspectable?


86

@IBInspectableजैसा कि आप नीचे दी गई तस्वीर में देखते हैं, मैं तत्व बनाना चाहता हूं :

यहाँ छवि विवरण दर्ज करें

मेरा विचार है कि एनुम जैसी किसी चीज़ का उपयोग किस प्रकार के लिए किया जाए @IBInspectable, लेकिन ऐसा लगता है कि यह मामला नहीं है, किसी भी विचार जैसे तत्व को कैसे लागू किया जाए?

संपादित करें:

ऐसा लगता है कि @IBInspectableकेवल इन प्रकारों का समर्थन करता है:

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

बहुत बेकार


एक वैकल्पिक हल, यह है कि आप जिस वैल्यू को सेट करना चाहते हैं उसके सामने एक इंस्पेक्टेबल कंप्यूटेड प्रॉपर्टी डालें। बेशक, यह अभी भी इंटरफ़ेस बिल्डर में प्रगणित मूल्यों के पॉप-अप मेनू के रूप में प्रकट नहीं होगा; लेकिन कम से कम आप एक निरीक्षण मूल्य को परिभाषित कर सकते हैं और इसका उपयोग एक एनम सेट करने के लिए कर सकते हैं।
मैट

8
इस साल WWDC में, मैंने डेवलपर टूल लैब में एक Apple इंजीनियर से इस बारे में पूछा। उन्होंने कहा कि वह सहमत हैं कि यह एक बड़ी विशेषता होगी, लेकिन वर्तमान में यह संभव नहीं है। उन्होंने सुझाव दिया कि मैंने Bugreport.apple.com पर एक राडार दायर किया जो मैंने किया। इसे 15505220 अंक के डुप्लिकेट के रूप में बंद किया गया था, लेकिन मैं लोगों को समान मुद्दों में डालने की अत्यधिक सलाह दूंगा। यदि पर्याप्त लोग शिकायत करते हैं तो इन बातों को अक्सर संबोधित किया जाता है।
विल क्लार्क



और स्विफ्टयूआई और Xcode 11 में नए कैनवस के साथ, ऐसा लगता है कि यह ऐपल के रोडमैप पर कभी नहीं होगा
बेन लेगिएरियो

जवाबों:


26

यह संभव नहीं है (अभी के लिए)। आप केवल उन प्रकारों का उपयोग कर सकते हैं जो आप उपयोगकर्ता परिभाषित रनटाइम अटेंडेस अनुभाग में देखते हैं ।

Apple के डॉक से :

आप किसी भी संपत्ति के लिए IBInspectable विशेषता को क्लास डिक्लेरेशन, क्लास एक्सटेंशन, या किसी भी प्रकार के लिए संलग्न कर सकते हैं जो कि इंटरफ़ेस बिल्डर द्वारा निर्धारित रनटाइम विशेषताओं द्वारा समर्थित है: बूलियन, पूर्णांक या फ्लोटिंग पॉइंट नंबर, स्ट्रिंग, स्थानीयकृत स्ट्रिंग, आयत, बिंदु, आकार। , रंग, रेंज और नील।


2
जब मैं एक एनम का उपयोग करना चाहता हूं, तो मैं एनम को स्पष्ट असाइनमेंट (= 1, = 2, आदि) देता हूं। और हैंडलर में, मैं जोर देता हूं यदि आईबी से मान एनम से मानों में से एक नहीं है। यह घोषणा करना कि एनम का समर्थन नहीं किया जाता है, लेकिन यह ट्रिक उन्हें कम से कम उपयोग करने योग्य बनाती है।
ज़ेव ईसेनबर्ग

एनम एक पूर्णांक है।
अमीन नेगम-अवध

23

इसके लिए एक और काम-काज को बदलना है कि कैसे एक एन्यूमरेशन प्रॉपर्टी इंटरफ़ेस बिल्डर को दिखाई देती है। उदाहरण के लिए:

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

यह एक Enum मानता है जिसे FontWeight कहा जाता है। यह इस तथ्य पर निर्भर करता है कि उद्देश्य और सी में उनके कच्चे पूर्णांक मानों का कुछ हद तक परस्पर उपयोग किया जा सकता है। ऐसा करने के बाद आप संपत्ति के लिए इंटरफ़ेस बिल्डर में एक पूर्णांक निर्दिष्ट करने में सक्षम हैं जो आदर्श नहीं है, लेकिन काम करता है, और उसी प्रकार की संपत्ति का उपयोग करते समय प्रोग्राम की थोड़ी मात्रा को बनाए रखता है।

एक अलग पूर्णांक संपत्ति घोषित करने की तुलना में यह एक बेहतर विकल्प है क्योंकि आपको दूसरे पूर्णांक संपत्ति को संभालने के लिए अतिरिक्त तर्क लिखने की आवश्यकता नहीं है जिसका उपयोग उसी चीज को पूरा करने के लिए भी किया जा सकता है।

हालाँकि, यह स्विफ्ट के साथ काम नहीं करता है क्योंकि हम एक पूर्णांक से एक एनम तक निहित करने में सक्षम नहीं हैं। सुलझाने पर कोई विचार जो सराहना की जाएगी।


2
मुझे वास्तव में लगा कि इसने स्विफ्ट में काम किया है, लेकिन आगे के परीक्षण में ... नहीं
डैन रोसेनस्टार्क

7

मैं एक निरीक्षण योग्य 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;
}

आप वैकल्पिक रूप से इसमें कुछ तर्क जोड़ सकते हैं ताकि यह सुनिश्चित हो सके कि इसे वैध मूल्य पर सेट किया जा रहा है


निश्चित नहीं कि यह मतदान क्यों हुआ था। समस्या के आसपास जाने के लिए एक अच्छा तरीका लगता है।
फोगमिस्टर

धन्यवाद @Fogmeister - मैं वास्तव में इस एप्लिकेशन का उपयोग इस समय एक ऐप के अंदर कर रहा हूं :)
मैथ्यू Cawley

4

सिखपोल सही है, एनमोज़ अभी तक समर्थित नहीं हैं 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
        }

    }

}

शानदार समाधान, स्विफ्ट 4 के साथ कार्यान्वित कोई समस्या नहीं। अगर आप इसे स्टोरीबोर्ड और xibs में वर्तनी के प्रकारों से सावधान करते हैं
MindBlower3

1

जैसा कि @sikhapol ने उत्तर दिया, यह संभव नहीं है। इसके लिए मैं जिस वर्कअराउंड का उपयोग करता हूं, वह है IBInspectableमेरी कक्षा में बस्ट्स का एक गुच्छा और इंटरफ़ेस बिल्डर में एक का चयन करना। अतिरिक्त सुरक्षा के लिए, जो एक से अधिक सेट नहीं हैं, NSAssertप्रत्येक के लिए सेटर में एक जोड़ें ।

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

यह थोड़ा थकाऊ और थोड़ा मैला IMO है, लेकिन यह इस तरह के व्यवहार को पूरा करने का एकमात्र तरीका है जिसके बारे में मैं सोच सकता हूं


1

मैं यह जोड़ना चाहता हूं कि enumऑब्जेक्टिव-सी में किसी के लिए रनटाइम पर पहचानकर्ता उपलब्ध नहीं हैं। इसलिए इसे कहीं भी प्रदर्शित करने की संभावना नहीं है।


1

मेरा समाधान यह करना था:

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

आईबी पर ही, आपको कीबोर्ड टाइप फील्ड में एक इंट सेट करना होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.