2015-11-19 7 views
6

मैंने एक वर्ग "DeletableImageView" (.swift + .xib) बनाया है जो प्रोटोकॉल का उपयोग करता है जिसे मैंने "DeletableImageViewDelegate" के रूप में परिभाषित किया है जिसे मैंने प्रतिनिधि कहा है। स्पष्टता के लिएxib में कस्टम क्लास से प्रतिनिधि को कैसे कनेक्ट करें?

उदाहरण:

DeletableImageView.swift

protocol DeletableImageViewDelegate { 
    func deleteImageWithTag(tag: Int!) -> (Bool) 
    func addImageOnViewWithTag(tag: Int!) -> (Bool) 
    ... 
} 

class DeletableImageView: UIView { 

    var view: UIView! 
    var delegate: DeletableImageViewDelegate? 

    // Some random methods + some use of the delegate protocol's methods 
    ... 
} 

मेरे समस्या यह है कि अब, जब मैं जुड़े .xib फ़ाइल से एक नियंत्रक में मेरी कक्षा का उपयोग करने के (कोशिश जो इसका मतलब है कि मैं इंटरफ़ेस बिल्डर में एक दृश्य खींच और छोड़ देता हूं और इस दृश्य में DeletableImageView क्लास असाइन करता हूं) मैं प्रतिनिधि संपत्ति को लिंक नहीं कर सकता (भले ही मैं इस संपत्ति को आईबीओलेट के रूप में घोषित करता हूं)।

मैं क्या करने में सक्षम होना चाहता हूँ "फाइल के मालिक" को सीधे लिंक को देखने के प्रतिनिधि आउटलेट .xib में करने के लिए

सटीक एक ही बात आप करते हैं जब आप एक से डेटा स्रोत और प्रतिनिधि लिंक सीधे .xib फ़ाइल में tableview।

लेकिन जब मैं नियंत्रण-खींचता हूं तो वे एक साथ लिंक नहीं करेंगे।

क्या किसी के पास क्या हो रहा है इसका कोई विचार है?

बहुत बहुत धन्यवाद।

@objc protocol DeletableImageViewDelegate { 
    ... 
} 

आप क्यों आप ऐसा करने की जरूरत है पूछ सकते हैं: इतना है कि यह की तरह लग रहा

+0

क्या फ़ाइल स्वामी प्रोटोकॉल के अनुरूप है? – luk2302

+0

हां फ़ाइल स्वामी प्रोटोकॉल के अनुरूप है ... –

+0

यहां एक वीडियो है जिसे मैंने आपकी समस्या को समझने में आपकी सहायता के लिए बनाया है: https: // youtu।हो/clYFj6dkaWk –

उत्तर

1

पहली बात तुम क्या करने की जरूरत है, अपने प्रोटोकॉल परिभाषा के से में @objc जोड़ना है। ऐसा इसलिए है क्योंकि आप स्टोरीबोर्ड में प्रतिनिधि संपत्ति जोड़ना चाहते हैं, और स्टोरीबोर्ड द्वारा दिखाई देने वाली कुछ संपत्ति सेट करने के लिए, इसमें @IBOutlet उपसर्ग होना चाहिए, और उस उपसर्ग के लिए इसे उद्देश्य सी प्रोटोकॉल होना आवश्यक है।

तो अगली बात आप क्या करना चाहते है, तो आप सही इंटरफ़ेस बिल्डर में देखने के लिए, कि हम अपने प्रतिनिधि संपत्ति उजागर जिसका मतलब है कि आप कुछ इस तरह मिल जाएगा पर क्लिक करें अब

@IBOutlet var delegate: DeletableImageViewDelegate? 

करने के लिए परिवर्तन var delegate: DeletableImageViewDelegate? है इंटरफेस बिल्डर के लिए। Exposed property

आप मालिक दायर करने के लिए यह कनेक्ट करने का प्रयास है (उदाहरण के UIViewController के लिए), यह क्योंकि अपनी फ़ाइल मालिक अभी भी उस प्रोटोकॉल को लागू नहीं करता है काम नहीं करेगा। इसे लागू करने के लिए आप लिखने की ज़रूरत:

extension UIViewController : DeletableImageViewDelegate { 
    // Implementation 
} 

के बाद आप ऐसा करते हैं, आप, दृश्य नियंत्रक के लिए प्रतिनिधि संपत्ति कनेक्ट करने के लिए इस प्रकार प्रतिनिधि विधि संदेशों को प्राप्त करने में सक्षम होना चाहिए। प्रत्येक मामले में आपके फ़ाइल स्वामी को प्रोटोकॉल को लागू करना होगा।

+0

मैंने कोशिश की लेकिन यह अभी भी काम नहीं कर रहा है, मुझे आश्चर्य है कि यह एक्सकोड का एक बग हो सकता है क्योंकि नया संस्करण मेरे .xib (ओं) के साथ बहुत सी समस्या है या शायद यह मेरे मैक पर बस है। .. अभी भी फ़ाइल को ओवर से लिंक करना संभव नहीं है ... मैं सटीक करना चाहता हूं कि ** ** स्टोरीबोर्ड का उपयोग न करें !!! **, शायद यही कारण है कि यह काम नहीं कर रहा है? –

+0

यहां एक वीडियो है जो मैंने आपकी समस्या को समझने में आपकी सहायता के लिए किया है: https://youtu.be/clYFj6dkaWk –

+0

अब मैं देखता हूं कि आपका डिलीट करने योग्य दृश्य xib में मुख्य दृश्य का एक सबव्यूव है। 'UIView' में एक्सटेंशन जोड़ें और आपको अच्छा होना चाहिए। –

0

मैंने टिप्पणियों के समान समाधान बनाया है। लेकिन मैं हर बार प्रतिनिधि को नहीं डालना चाहता था और प्रोटोकॉल कार्यान्वयन की जांच करना चाहता था।

weak var delegate: MenuViewDelegate? 
@IBOutlet weak var _delegate: AnyObject? { 
    didSet { 
     if let d = _delegate { 
      if let d = (d as? MenuViewDelegate) { 
       delegate = d 
      } else { 
       print("ERROR: delegate does not implement \(d) MenuViewDelegate protocol") 

       d as! MenuViewDelegate 
      } 
     } 
    } 
} 
संबंधित मुद्दे