xcode '#selector' एक ऐसी विधि को संदर्भित करता है जो ऑब्जेक्टिव-सी के संपर्क में नहीं है




swift (3)

एक रैपर फ़ंक्शन के लिए चयनकर्ता बिंदु होने का प्रयास करें, जो बदले में आपके प्रतिनिधि फ़ंक्शन को कॉल करता है। मेरे लिए यही काम किया।

cell.commentButton.addTarget(self, action: #selector(wrapperForDidTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)

-

func wrapperForDidTapCommentButton(post: Post) {
     FeedViewController.didTapCommentButton(post)
}

AddTarget के माध्यम से पैरामीटर पास करने वाला नया Xcode 7.3 आमतौर पर मेरे लिए काम करता है लेकिन इस मामले में यह शीर्षक में त्रुटि को फेंक रहा है। कोई विचार? यह एक और फेंकता है जब मैं इसे @objc में बदलने की कोशिश करता हूं

धन्यवाद!

cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)

चयनकर्ता इसे बुला रहा है

func didTapCommentButton(post: Post) {
}

मेरे मामले में चयनकर्ता का कार्य private था। एक बार जब मैंने private हटाया तो त्रुटि हो गई थी। वही fileprivate लिए जाता है।

स्विफ्ट 4 में
आपको फ़ंक्शन घोषणा में @objc को जोड़ना होगा। स्विफ्ट 4 तक यह अनुमान लगाया गया था।


आपको didTapCommentButton(_:) साथ इसका उपयोग करने के लिए didTapCommentButton(_:) पर @objc विशेषता का उपयोग करने की आवश्यकता है।

आप कहते हैं कि आपने ऐसा किया लेकिन आपको एक और त्रुटि मिली। मेरा अनुमान है कि नई त्रुटि यह है कि Post एक प्रकार का नहीं है जो ऑब्जेक्टिव-सी के साथ संगत है। आप केवल ऑब्जेक्टिव-सी के लिए एक विधि का खुलासा कर सकते हैं यदि इसके सभी प्रकार के तर्क और इसके रिटर्न प्रकार, ऑब्जेक्टिव-सी के साथ संगत हैं।

आप Post को NSObject उपवर्ग बनाकर ठीक कर सकते हैं, लेकिन इससे कोई फर्क नहीं पड़ता, क्योंकि didTapCommentButton(_:) का तर्क वैसे भी Post नहीं होगा। एक्शन फंक्शन का तर्क एक्शन भेजने वाला होता है, और वह भेजने वाला commentButton होगा, जो संभवतः commentButton है। आपको इस तरह से didTapCommentButton घोषित करना चाहिए:

@objc func didTapCommentButton(sender: UIButton) {
    // ...
}

फिर आपको टैप बटन के अनुरूप Post प्राप्त करने की समस्या का सामना करना पड़ेगा। इसे प्राप्त करने के कई तरीके हैं। यहां एक है।

मैं इकट्ठा करता हूं (जब से आपका कोड cell.commentButton कहता है) कि आप टेबल व्यू (या संग्रह दृश्य) सेट कर रहे हैं। और जब से आपके सेल में एक गैर-मानक संपत्ति है जिसका नाम commentButton , मुझे लगता है कि यह एक कस्टम UITableViewCell उपवर्ग है। तो चलिए मान PostCell कि आपका सेल इस तरह घोषित किया गया एक PostCell :

class PostCell: UITableViewCell {
    @IBOutlet var commentButton: UIButton?
    var post: Post?

    // other stuff...
}

फिर आप PostCell को खोजने के लिए बटन से पदानुक्रम PostCell , और इससे पोस्ट प्राप्त कर सकते हैं:

@objc func didTapCommentButton(sender: UIButton) {
    var ancestor = sender.superview
    while ancestor != nil && !(ancestor! is PostCell) {
        ancestor = view.superview
    }
    guard let cell = ancestor as? PostCell,
        post = cell.post
        else { return }

    // Do something with post here
}




swift