ios - स्विफ्ट में चयनकर्ता के तर्क पारित करना




swift uikit (2)

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

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
}

पहली समस्या जो मुझे मिली, वह थी '' # एलेक्टर 'का तर्क' 'ऑबजैक' पद्धति, संपत्ति या आरंभीकरण का उल्लेख नहीं करता है।

कूल, इसलिए मैंने @objc को हैंडलटैप हस्ताक्षर में जोड़ा:

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

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

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


ऐसा लगता है कि आप कुछ चीजों को गलत समझ रहे हैं।

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 और इशारा मानते हुए, एक दृश्य नियंत्रक के भीतर हैं, जिनमें से modelObj एक संपत्ति / ivar है, इसे handleTap साथ पारित करने की कोई आवश्यकता नहीं है, आप इसे केवल handleTap में handleTap


चरण 1: भेजने वाले की कस्टम ऑब्जेक्ट बनाएं।

चरण 2: उन गुणों को जोड़ें जिन्हें आप प्रेषक की एक कस्टम वस्तु में बदलना चाहते हैं

चरण 3: किसी कस्टम ऑब्जेक्ट में फ़ंक्शन प्राप्त करने के लिए प्रेषक को टाइप करें और उन गुणों तक पहुंचें

उदाहरण के लिए: यदि आप स्ट्रिंग या कोई कस्टम ऑब्जेक्ट भेजना चाहते हैं तो बटन पर क्लिक करें

चरण 1: बनाएँ

class CustomButton : UIButton {

    var name : String = ""
    var customObject : Any? = nil
    var customObject2 : Any? = nil

    convenience init(name: String, object: Any) {
        self.init()
        self.name = name
        self.customObject = object
    }
}

चरण 2-ए: एक कस्टम वर्ग के साथ उस बटन के IBOutlet को निम्नानुसार बनाएं

@IBOutlet weak var btnFullRemote: CustomButton!

चरण 2-बी: स्टोरीबोर्ड में कस्टम वर्ग को भी सेट करें

चरण 3: उन गुणों को जोड़ें जिन्हें आप प्रेषक की एक कस्टम वस्तु में बदलना चाहते हैं

btnFullRemote.name = "Nik"
btnFullRemote.customObject = customObject
btnFullRemote.customObject2 = customObject2
btnFullRemote.addTarget(self, action: #selector(self.btnFullRemote(_:)), for: .touchUpInside)

चरण 4: किसी कस्टम ऑब्जेक्ट पर फ़ंक्शन प्राप्त करने में प्रेषक को टाइप करें और उन गुणों तक पहुंचें

@objc public func btnFullRemote(_ sender: Any) {

var name : String = (sender as! CustomButton).name as? String

var customObject : customObject = (sender as! CustomButton).customObject as? customObject

var customObject2 : customObject2 = (sender as! CustomButton).customObject2 as? customObject2

}




selector