मैं स्विफ्ट में अपना पहला मैको ऐप बना रहा हूं। मैंने मेनू बार अतिरिक्त आइकन में एक मेनू (NSMenu) जोड़ने में कामयाबी हासिल की है, लेकिन जब मेनू लोड होता है तो प्रत्येक मेनू आइटम निष्क्रिय के रूप में दिखाया जाता है। मैं समझता हूं कि यह स्वचालित व्यवहार है जब ऐप को मेनू आइटम के लिए #selector नहीं मिल रहा है।

लेकिन बात यह है कि मेरे पास प्रत्येक मेनू आइटम के लिए एक चयनकर्ता है। अगर मैं उन चयनकर्ताओं के लिए ऐपडिलेगेट में विधि घोषणाएं रखता हूं तो मेनू उन्हें ठीक देखता है और मेनू आइटम सक्रिय के रूप में दिखाता है। लेकिन अगर मैं एक समर्पित MenuManager कक्षा में रखता हूं, तो ऐसा लगता है कि उन्हें बिल्कुल भी नहीं दिख रहा है और मेनू आइटम को निष्क्रिय के रूप में सेट करता है। ध्यान दें, अजीब तरह से, संकलक उन्हें ठीक देख रहा है। अगर ऐसा नहीं होता तो यह एक कंपाइलर त्रुटि दिखाएगा। लेकिन रनटाइम पर मेनू उन तरीकों को खोजने में सक्षम नहीं होता है जब तक कि वे ऐपडिलेगेट में न हों।

यहां बताया गया है कि मैं मेनू आइटम कैसे घोषित कर रहा हूं (BarIconMenu नामक एक वर्ग में जो NSMenu को उपवर्गित करता है)

let short = NSMenuItem(
        title: "Short (20 words)",
        action: #selector(MenuManager.copyShortSnippetToClipboard),
        keyEquivalent: ""
    )

और यहाँ बताया गया है कि उस विधि को MenuManager वर्ग में कैसे परिभाषित किया जाता है

@objc func copyShortSnippetToClipboard() {
        clipboardManager.copyText(withLength: .short)
        ProgressHUD.showSuccessWithStatus("Copied to clipboard")
    }

मैंने वह सब कुछ करने की कोशिश की है जिसके बारे में मैं सोच सकता हूं, जिसमें 1) बिल्ड की सफाई, 2) @objc को MenuManager वर्ग के सामने जोड़ना, 3) मेनू को ऐपडिलेगेट के बजाय मेनूमैनेजर में शुरू करना - लेकिन कुछ भी नहीं है काम कर रहे।

मैं नहीं चाहता कि मेरा पूरा कोड ऐपडिलेगेट में रहे, तो मैं अपने मेनू आइटम चयनकर्ताओं को उन तरीकों को 'देखने' के लिए कैसे प्राप्त कर सकता हूं जिनकी मुझे उन्हें कॉल करने की आवश्यकता है?

0
thecloud_of_unknowing 22 पद 2019, 16:16

1 उत्तर

सबसे बढ़िया उत्तर

Init विधि सुविधा के रूप में कुछ गुण सेट करती है, लेकिन NSMenuItem वर्ग में कई गुण हैं अन्य। एक क्रिया चयनकर्ता कॉल करने के लिए विधि सेट करेगा, लेकिन लक्ष्य वह वस्तु है जिसे संदेश वास्तव में भेजा जाता है, इसलिए आप केवल मेनू इटैम के लक्ष्य को वांछित के रूप में सेट कर सकते हैं (अन्यथा ऐपडिलेगेट आमतौर पर डिफ़ॉल्ट के रूप में हवा देता है)।

0
red_menace 22 पद 2019, 14:45