2010-11-18 24 views

उत्तर

80

प्रतिनिधियों संदेश संदेश भेजें।

उदाहरण के लिए: यदि आप एक्सेलेरोमीटर प्रतिनिधि का उपयोग करते हैं, तो आपको एक्सेलेरोमीटर के बारे में संदेश मिलेंगे।

यदि आप उस नए न्यूट्रीनो-डिटेक्शन प्रतिनिधि का उपयोग करते हैं, तो आपको क्षेत्र में पाए गए किसी भी न्यूट्रीनो के बारे में संदेश मिलेंगे।

यदि आप पॉपयूप्स का उपयोग करते हैं, तो पॉपूप्स आपको संदेश भेजते हैं। और जिस तरह से किया जाता है, पॉपअप के प्रतिनिधि के साथ है। कई सारे उदाहरण हैं।

तो, प्रतिनिधि संदेश भेजते हैं।

यह इतना आसान है।

आप पूछ सकते हैं, "यह संदेश कहां भेजता है?"

उत्तर यह है: यह संदेश भेजता है जहां आपने ".delegate" चीज़ सेट की है।

जब आप "प्रतिनिधि सेट करते हैं," आप जो कर रहे हैं वह कह रहा है कि आप कहां जाना चाहते हैं।

इसलिए,

blah.delegate = amazingPlace संदेशों को "amazingPlace" भेज देंगे।

blah.delegate = कहीं और संदेश "कहीं और" संदेश भेज देंगे।

blah.delegate = स्वयं आप को संदेश ...... भेज देंगे।

अक्सर आप संदेश "आप" में आने के लिए है, तो आप सिर्फ कहते हैं कि "blah.delegate = स्व"

यह एक बहुत ही आम गलती है, कोड की है कि रेखा को भूल जाना चाहते हैं।

यदि आप कोड की उस पंक्ति को भूल जाते हैं, तो आप भरे हुए हैं। संदेश कहीं भी पर जाते हैं, और आप यह पता लगाने की कोशिश कर रहे हैं कि क्या गलत हुआ है, आप अपने सिर को खरोंच कर रहे हैं।जब आप एक प्रतिनिधि का उपयोग करें, आपको लगता है कि आप प्रतिनिधि का उपयोग करना चाहते कहना है:

कुछ वरना आप क्या करना है। उद्देश्य-सी के साथ पुराने दिनों में, तुम सिर्फ यह करने के ...

@interface AppDelegate_Pad : NSObject <UIApplicationDelegate> 
@interface BigTop : UIViewController <ASIHTTPRequestDelegate, UIPopoverControllerDelegate> 
@interface Flying : UIViewController <UIAccelerometerDelegate> 

आप देख सकते हैं कि 'BigTop' दो प्रतिनिधियों, अर्थात् ASIHTTPRequestDelegate और UIPopoverControllerDelegate उपयोग करना चाहता है। जबकि 'फ्लाइंग' केवल एक प्रतिनिधि का उपयोग करना चाहता है - यह एक्सेलेरोमीटर का उपयोग करना चाहता है।

स्विफ्ट में, यह आसान नहीं हो सकता - तुम सिर्फ एक अल्पविराम तो प्रोटोकॉल है:

class YourClass:UIViewController, SomeDelegate, AnotherDelegate 

आप वास्तव में iPhone पर ज्यादा कुछ नहीं कर सकते हैं हर जगह प्रतिनिधियों का उपयोग किए बिना।

प्रतिनिधियों हर जगह और हमेशा आईओएस में किया जाता है।

यह पूरी तरह से सामान्य है कि एक वर्ग एक दर्जन से अधिक प्रतिनिधियों का उपयोग कर सकते है।

"फ़्लाइंग" ऊपर, "फ़्लाइंग" के लिए कोड में कहीं के उदाहरण में यह ASIHttpRequests के लिए कहीं न कहीं प्रतिनिधि सेट करना होगा कहने के लिए [[UIAccelerometer sharedAccelerometer] setDelegate:self];

BigTop के मामले में होता है,

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostValue:gid forKey:@"gid"]; 
[request setPostValue:nom forKey:@"nom"]; 
[request setDelegate:self]; 

तैर साथ (साथ ऑब्जेक्टिव-सी पुराने दिनों में मत भूलना, x.delegate=self बिल्कुल [x setDelegate:self] के रूप में ही किया गया था।)

आजकल ift आप बस

x.delegate = self 

टाइप करें और है कि इसके लिए बस इतना है है।

ताकि आप क्या कर रहे है। प्रतिनिधियों संदेश भेजें। आप जहां आप संदेशों जाना चाहता हूँ कहना है। बहुत आम तौर पर, आप उन्हें "आप" पर जाना चाहते हैं, इसलिए उस स्थिति में आप बस x.delegate=self कहें।

उम्मीद है कि यह मदद करता है।

+5

संयोग से वास्तव में न्यूट्रिनो डिटेक्शन प्रतिनिधि नहीं है। आपको अपना खुद लिखना है। – Fattie

+1

धन्यवाद ... मैं वास्तव में इस पर उलझन में था। –

+1

सबसे अच्छा स्पष्टीकरण मैंने अब तक देखा है – SeanNieuwoudt

-3

यदि किसी भी मामले में बोर्न का जवाब मदद नहीं करता है .. एक प्रतिनिधि मूल रूप से किसी ऑब्जेक्ट पर किसी ईवेंट की प्रतिक्रिया करता है और कहता है ".delegate = self" का अर्थ है कि उन प्रोटोकॉल को स्वयं में अपनाया गया है ... उदाहरण के लिए। तालिका तालिका में एक पंक्ति का चयन करने पर क्या होता है जब टेबलव्यू के प्रतिनिधि विधि "didSelectRowAtIndexPath" ... और यदि व्यू कंट्रोलर के पास टेबलव्यू है .. और "didSelectRowAtIndexPath" केवल उस व्यू कंट्रोलर में परिभाषित किया गया है तो हम कहेंगे ... tableview .delegate = self "... और" self.anything "का उपयोग यह कहने के लिए किया जाता है कि" कुछ भी "स्वयं की संपत्ति है .. उदाहरण के लिए एनएसएसटींग * कुछ भी; @property (nonatomic, retain) NSString * कुछ भी ;

फिर "self.anything"

-1

Delegate का उपयोग डेटा/संदेश बी/डब्ल्यू कक्षाओं के दो वस्तुओं को पास/संचारित करने के लिए किया जाता है। इधर, tableView (भेजने वाले) viewController (रिसीवर) के लिए डेटा/संदेश भेजता है। कस्टम viewController में UITableView लागू करने के उदाहरण पर विचार करें, UITableViewDataSource & UITableViewDelegate वास्तव में प्रोटोकॉल हैं। दुर्भाग्यवश, UIKit Framework खुला स्रोत नहीं है। लेकिन मैं यह सुनिश्चित कर दूंगा कि कई लेखों का जिक्र करने के बाद आंतरिक रूप से क्या होता है।

प्रोटोकॉल बास्केटबॉल कोच की तरह कुछ आवश्यकताओं के साथ है। वह उन आवश्यकताओं का उपयोग करके कक्षा, संरचना, enum what to do? जैसे खिलाड़ियों को बताता है। लेकिन वह स्वयं द्वारा doesn't knowshow to do?। इसलिए, कक्षा या संरचना जो अनुरूप है कि प्रोटोकॉल को गेंद को डंक करने के दौरान उन आवश्यकताओं को कार्यान्वित करना चाहिए।

protocol UITableViewDelegate { 
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
} 

एक प्रोटोकॉल डेटा स्रोत प्रोटोकॉल तो यह हमेशा "वापसी प्रकार" के रूप में नीचे दिखाया गया है के साथ आवश्यक कार्यों में शामिल होने के लिए कहा गया है।

protocol UITableViewDataSource { 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
} 

कार्यान्वयन UITableView कस्टम ViewController अंदर

class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    let tableView = UITableView()  

    override func viewDidLoad { 
     tableView.delegate = self 
     tableView.dataSource = self 
    } 

यहाँ, डैलिगेटर (प्रेषक) के रूप में कार्य करता है tableView & प्रतिनिधि (रिसीवर) के रूप में viewController object i.e (self)

viewController में UITableView प्राप्त करने के लिए। इसे प्रोटोकॉल दोनों के अनुरूप होना चाहिए।

तो, viewController क्लास ऑब्जेक्ट ने प्रोटोकॉल दोनों के उन सभी आवश्यक कार्यों को लागू किया है। अब self का उपयोग UITableViewDelegate प्रकार या UITableViewDataSource प्रकार के रूप में किया जा सकता है क्योंकि प्रोटोकॉल को कक्षा के किसी ऑब्जेक्ट के प्रकार के रूप में उपयोग किया जा सकता है जो इसके अनुरूप है। अब, tableView i.e delegate & dataSource दोनों गुण self पर दिए गए हैं क्योंकि इसके समान प्रोटोकॉल प्रकार हैं।

दोनों प्रोटोकॉल के गैर वैकल्पिक कार्यों नीचे

प्रोटोकॉल के रूप में viewController वर्ग वस्तु में लागू UITableViewDelegate कार्यों

func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
// Do further processes like pushing or poping another viewController 
} 

प्रोटोकॉल UITableViewDataSource कार्यों

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 10 
} 

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    return UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell") 
} 

1) जब उपयोगकर्ता का चयन करें एक खंड में एक पंक्ति tableview (प्रेषक) यानी UItableView() कॉल वें पैरामीटर tableView & indexPath पर डेटा पास करके दिखाए गए नीचे UITableViewDelegate func viewController ऑब्जेक्ट (रिसीवर) में delegate संपत्ति के माध्यम से रहता है। अब viewController उन पारित डेटा का उपयोग करता है ताकि आगे की प्रक्रियाएं जैसे कि नए कस्टम व्यू कंट्रोलर को धक्का देना या पॉप करना। UITableViewDatasource प्रोटोकॉल के अंदर

tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

2) कार्य tableview (भेजने वाले के लिए कस्टम डेटा प्रदान करता है)। tableview मापदंडों tableView & indexPath जो अपने datasource संपत्ति के माध्यम से viewController वस्तु (रिसीवर) में रहता है के लिए डेटा गुजर साथ डेटा स्रोत कार्यों को फोन करके viewController वस्तु पूछता है। अब viewController उन उत्तीर्ण डेटा का उपयोग करता है & कस्टम डेटा वापस tableview देता है। अब tableview उन डेटा का उपयोग करता indexpath पर "सेल" का एक वर्ग & वस्तु के रूप में "10" कोशिकाओं को बनाने के लिए

tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10" 

tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell" 

अंत में, पूरे UIKit Framework का उपयोग करता है अपने सभी वर्गों में & डेटा स्रोत डिजाइन पैटर्न को सौंपने जैसे UIApplication, UITableView, UICollectionView , UITextField & डेटा संचार करने के लिए। दुर्भाग्यवश, UIKit Framework खुला स्रोत नहीं है।

+0

अरे वहाँ, मैं स्टैक ओवरफ्लो में एक नौसिखिया हूँ। मेरे ज्ञान के साथ कुछ ज्ञात क्यू का जवाब देने के लिए चारों ओर देख रहे हैं! –

+0

उत्तर सही है। इसे मत छोड़ो! बस becoz यह पहले से ही 8 साल पहले जवाब दिया गया है। –

+1

नीचे मतदान गलत है अगर जवाब गलत है। यदि आप नीचे वोट बटन पर होवर करते हैं तो आपको टूल टिप दिखाई देगी। मैं उन सवालों के जवाब देने का सुझाव दूंगा जो हाल ही में हैं और पहले से ही जवाब नहीं हैं। आप पसंदीदा टैग कर सकते हैं और यह आपके लिए अधिक प्रासंगिक होने के लिए प्रश्नों की सूची फ़िल्टर करेगा। इस तरह आप उत्तर देने के लिए नए प्रश्न पा सकते हैं। – Fogmeister

संबंधित मुद्दे