2014-07-03 11 views
14

मैं आईबी में एक कस्टम स्विफ्ट प्रतिनिधि को तार करना चाहता हूं। प्रतिनिधि एक वस्तु है जो तेजी से एक निश्चित प्रोटोकॉल लागू करता है।स्विफ्ट प्रोटोकॉल, आईबीओलेट संपत्ति में गैर-ऑब्जेक्ट प्रकार नहीं हो सकता

protocol ThumbnailTableViewCellDelegate { 
    func cellWasTouched(thumbnail: Bool, cell: UITableViewCell) 
} 

class ThumbnailTableViewCell: UITableViewCell { 
    @IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate? 
} 

दुर्भाग्य से, संकलक की शिकायत के साथ:

error: 'IBOutlet' property cannot have non-object type 'ThumbnailTableViewCellDelegate' 
    @IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate? 
    ^~~~~~~~~ 
+3

@ एंडी यह बिल्कुल ठीक है - आप कह रहे हैं कि यह एक ऐसा ऑब्जेक्ट है जो उस प्रोटोकॉल के अनुरूप है। –

उत्तर

27

आप घोषित करने के लिए है, तो अपने ThumbnailTableViewCellDelegate प्रोटोकॉल के रूप में @objc:

@objc protocol ThumbnailTableViewCellDelegate { 
    func cellWasTouched(thumbnail: Bool, cell: UITableViewCell) 
} 

इसका कारण यह है है @IBOutletweak के रूप में चर, वाणी जो केवल वस्तुओं के साथ काम करता है। मुझे यकीन नहीं है कि आप क्यों नहीं कह सकते कि प्रोटोकॉल AnyObject के अनुरूप है, शायद यह एक स्विफ्ट बग है।

+0

धन्यवाद नाट, यह काम किया!क्या यह एक अस्थायी कामकाज या अपेक्षित व्यवहार है? इस मामले में @objc की प्रासंगिकता क्या है? – pixbroker

+1

यह विधि अब मेरे लिए काम नहीं कर रही है (एक्सकोड 6 के जीएम बीज का उपयोग करके) – Ash

+9

यह संकलित करता है लेकिन मुझे वास्तव में स्टोरीबोर्ड में आउटलेट को कनेक्ट करने में समस्याएं हैं –

-1

आईबीओलेट्स एक निब (या स्टोरीबोर्ड) फ़ाइल में संग्रहीत ऑब्जेक्ट को पॉइंटर इंगित करना है। प्रोटोकॉल एक ऑब्जेक्ट नहीं है, इसलिए आपके पास निब फ़ाइल में कोई नहीं हो सकता है। आईबीओलेटलेट var का प्रकार nib में मौजूद वास्तविक ऑब्जेक्ट का प्रकार बनें।

0

प्रोटोकॉल प्रकार का एक चर एक वस्तु नहीं हो सकता है, क्योंकि structs और enums प्रोटोकॉल के अनुरूप भी हो सकते हैं। यह सुनिश्चित करने के लिए कि प्रोटोकॉल केवल कक्षाओं के अनुरूप हो, आप प्रोटोकॉल को @class_protocol के साथ घोषित कर सकते हैं। सुनिश्चित करें कि आपके objectTypeSomeProtocol या चीजों के अनुरूप विस्फोट हो जाएगा

0

आदर्श नहीं है, लेकिन एक विकल्प इस तरह कुछ करने के लिए है इस कामकाज के साथ। यह एक्सकोड के साथ एक ज्ञात मुद्दा है, इसलिए शायद एक दिन हल किया जाएगा। तब तक:

  1. प्रतिनिधि को किसी भी ऑब्जेक्ट के रूप में घोषित करें - @IBOutlet var प्रतिनिधि: AnyObject!
  2. इंटरफ़ेस बिल्डर
  3. में प्रतिनिधि से कनेक्ट करें आउटलेट के प्रकार को अपने प्रोटोकॉल में बदलें, उदा। @IBOutlet var प्रतिनिधि: MyDelegate

यह मेरे लिए काम करता है।

14

आप में आईबी में अपने स्वयं के प्रोटोकॉल कनेक्ट कर सकते हैं बनाने के लिए

@IBOutlet var objectType: NSObject! 

private var conformingObject: SomeProtocol { 
    return objectType as SomeProtocol 
} 

गॉट:

+0

क्या कोई ज्ञात रडार या रिलीज नोट है जहां यह दस्तावेज है? –

0

यह समझ में आता है कि आईबी को आपके विशेष प्रोटोकॉल की बजाय AnyObject की आवश्यकता है। वस्तु आप चाहते हैं शायद से कनेक्ट करने के लिए, लेकिन प्रोटोकॉल के जरूरी नहीं कि अनुरूप है और प्रोटोकॉल optionals हो सकता है - तो:

@objc public protocol HexViewDataSource: NSObjectProtocol { 
    @objc optional func dataAtOffset (_ hexView: HexView, offset: UInt64, length: Int)-> Data? 
    @objc optional func dataLength (_ hexView: HexView) -> UInt64 
} 

इस तरह से अपनी कक्षा में यह घोषित:

इस तरह से अपनी प्रोटोकॉल बनाओ उदाहरण के तौर पर:

@IBOutlet weak open var dataSource: AnyObject? 

और जब आप इसे उपयोग करने के लिए आते हैं, जांच करें कि यह प्रोटोकॉल के लिए और है कि अनुरूप optionals मौजूद - इस तरह:

if let dataSource = dataSource as? HexViewDataSource, let dfr = dataSource.dataAtOffset { 
    setRowData(offset: offset, data: dfr (self, offset, bytesPerRow)) 
} 
संबंधित मुद्दे