2017-04-06 8 views
8

मैं प्रोग्राम के रूप में अपने विचार से एक के लिए एक UITapGestureRecognizer जोड़ रहा में चयनकर्ता रहे हैं:पासिंग तर्क Swift3

let gesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(modelObj:myModelObj))) 

self.imageView.addGestureRecognizer(gesture) 

func handleTap(modelObj: Model) { 
    // Doing stuff with model object here 
} 

पहली समस्या मैं का सामना करना पड़ा था, " '#selector' का तर्क एक '@Objc का उल्लेख नहीं करता 'विधि, संपत्ति, या प्रारंभकर्ता

कूल, तो मैं handleTap हस्ताक्षर करने के लिए @objc कहा:।

@objc func handleTap(modelObj: Model) { 
    // Doing stuff with model object here 
} 

अब मैं त्रुटि मिल रही है "विधि क्योंकि Ty @objc चिह्नित नहीं किया जा सकता पैरामीटर का पे उद्देश्य-सी में प्रदर्शित नहीं किया जा सकता है।

यह सिर्फ एक इमारत के मानचित्र की एक छवि है, जिसमें कुछ पिन छवियां ब्याज के बिंदुओं को इंगित करती हैं। जब उपयोगकर्ता इन पिनों में से किसी एक को टैप करता है, तो मैं जानना चाहता हूं कि किस बिंदु की रुचि उन्होंने टैप की है, और मेरे पास एक मॉडल ऑब्जेक्ट है जो रुचि के इन बिंदुओं का वर्णन करता है। मैं इस मॉडल ऑब्जेक्ट का उपयोग पिन छवि को मानचित्र पर निर्देशांक देने के लिए करता हूं, इसलिए मैंने सोचा कि मेरे लिए इशारा हैंडलर को ऑब्जेक्ट भेजना आसान होगा।

+0

के साथ एक और फ़ंक्शन को कॉल आपको लगता है कि जैसे एक चयनकर्ता के मूल्यों पारित नहीं कर सकते हैं। आप उस मान को आवृत्ति चर में क्यों नहीं रख सकते और इसे चयनकर्ता विधि से एक्सेस नहीं कर सकते? –

+4

http://stackoverflow.com/questions/35635595/sending-a-parameter-argument-to-function-through-uitapgesturerecognizer- चयनकर्ता का संभावित डुप्लिकेट। –

उत्तर

20

ऐसा लगता है कि चीजों में से एक जोड़े को गलत समझ रहे हैं।

जब target/action का उपयोग कर, समारोह हस्ताक्षर एक निश्चित रूप है करने के लिए है ...

func doSomething(sender: Any) 

या

func doSomething(sender: Any, forEvent event: UIEvent) 

जहां ...

sender पैरामीटर नियंत्रण वस्तु भेजने है कार्रवाई संदेश

आपके मामले में, इस UITapGestureRecognizer

भी है, #selector() समारोह हस्ताक्षर शामिल करना चाहिए, और पारित पैरामीटर शामिल नहीं है।तो के लिए ...

func handleTap(sender: UIGestureRecognizer) { 

} 

आप होना चाहिए ...

let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 

समारोह और इशारा मान लिया जाये कि एक दृश्य नियंत्रक के भीतर हैं, जिनमें से modelObj एक संपत्ति/इवर है, साथ इसे पारित करने की आवश्यकता नहीं है इशारा recogniser, तो आप सिर्फ यह करने के लिए handleTap

1

मुझे लगता है कि आपको विधि बनाना चाहिए जो handleTap(modelObj:myModelObj) पर कॉल करे।

@objc func someMethod() { // name this properly! 
    handleTap(modelObj: myModelObj) 
} 

तो फिर तुम एक चयनकर्ता के रूप में इस पारित कर सकते हैं:

#selector(someMethod) 
0

में इस प्रकार की सीधे handleTap कॉल करने के लिए कोशिश कर के उल्लेख कर सकते हैं:

#selector(self.handleTap(modelObj:myModelObj)) 

फिर आप एक समारोह बना सकते हैं मापदंडों

#selector(anyName) 

func anyName() { 
    let model = Model() 
    handleTap(modelObj: model) 
} 

func handleTap(modelObj: Model) { 
    // Doing stuff with model object here 
} 
संबंधित मुद्दे