NSTextField - अलग-अलग कुंजी दबाए जाने पर अधिसूचनाएं

मैं एक ऐप बना रहा हूं जो कि कुंजीपटलों को ध्वनि जोड़ देगा क्योंकि उपयोगकर्ता NSTextField में टाइप करता है। मुझे कीस्ट्रोक को कैप्चर करने की आवश्यकता है और पता है कि प्रत्येक व्यक्तिगत कीप्रेस क्या है (जैसे "डी" या "स्पेस" या "6")। ऐप इस पर निर्भर करता है। इसके चारों ओर कोई दूसरा रास्ता नहीं है।

प्रत्येक विंडो एक NSDocument फ़ाइल स्वामी है, और इसमें एक NSTextField है, जहां दस्तावेज़ डेटा पार्स किया गया है, और उपयोगकर्ता टाइप करेगा।

जवाब के लिए इंटरनेट को पार्स करने और कोड पर हैकिंग के घंटों के बाद, चार सबसे सामान्य बार-बार उत्तर दिए गए हैं:

  1. "यह नहीं है कि चीजें कैसे काम करती हैं, यहां है (अप्रासंगिक उत्तर)"
  2. "आप कोको के लिए नए हैं, यह एक बुरा विचार है, control: textView: doCommandSelector: " का उपयोग करें जो मुझे व्यक्तिगत कुंजी नहीं देता है, और कुछ कुंजियों को अपने अद्वितीय ध्वनि ट्रिगर की आवश्यकता होती है।
  3. " controlTextDidChange का उपयोग करें: या textView: shouldChangeTextInRange: replaceString: " controlTextDidChange मुझे व्यक्तिगत कुंजी नहीं देता है, और दूसरा केवल टेक्स्ट व्यू या UIKit के लिए काम करता है।
  4. लोग UIKit के बजाय UIKit के लिए अनुशंसाओं के साथ भ्रमित हो जाते हैं और उत्तर देते हैं, जो केवल आईओएस-केवल है।

अजीब चीज यह है कि अगर मैं NSTextField subclass करता हूं, तो यह -keyUp प्राप्त करता है। मुझे नहीं पता कि -keyDown जा रहा है।

तो मेरा अंतिम सवाल यह है: क्या आप मुझे NSTextField पर भेजे गए कुंजीडाउन को वास्तव में कैप्चर करने के लिए किसी प्रकार का चरण-दर-चरण तरीका बता सकते हैं? भले ही यह एक हैक है। भले ही यह एक भयानक विचार है।

मुझे इस समस्या को हल करना अच्छा लगेगा! मैं आपके पढ़ने के लिए बहुत आभारी हूं।

0
@ हुसैनशबीर मुझे यकीन नहीं है कि यह कैसे काम करेगा, क्या आप आगे समझा सकते हैं? एकमात्र विकल्प घटना के पहले और बाद में टेक्स्टबॉक्स के दोनों राज्यों को रिकॉर्ड करना प्रतीत होता है और उस परिवर्तन में कौन सी कुंजी दबाई गई थी। यह किसी भी अन्य मामलों में ट्रिगर करता है, हालांकि, बड़े ब्लॉक को चिपकाने या हटाने जैसे। इस दायरे से मूल्य का कुछ भी पास या संदर्भित नहीं लगता है।
जोड़ा लेखक brainbag, स्रोत
लेकिन अगर आप controlTextDidChange का उपयोग करते हैं तो आपको अलग-अलग अक्षर मिलेंगे।
जोड़ा लेखक Hussain Shabbir, स्रोत

3 उत्तर

इस तरह प्रयास करें यदि आप एनएसएलओएल प्रिंट करते हैं तो आपको अलग-अलग चरित्र रिकॉर्ड मिलेगा उदाहरण के लिए आप "ए" दबाएंगे, आपको कंसोल में वही मिलेगा: -

-(void)controlTextDidChange:(NSNotification*)obj
{
NSLog(@"%@",[yourTextfield stringValue]);

}

साथ ही, यह सुनिश्चित न करें कि यह केवल आपकी आवश्यकता है।

0
जोड़ा
धन्यवाद, लेकिन यह काम नहीं करेगा। यह टेक्स्ट फ़ील्ड की पूरी सामग्री है। आदर्श रूप में, यह घटना आपको बदले में डेटा देगी, लेकिन ऐसा नहीं है, यह आपको बताता है कि यह बदल गया है।
जोड़ा लेखक brainbag, स्रोत
ठीक है, लेकिन क्या आप इसे आजमा सकते हैं: - - (शून्य) keyDown: (NSEvent *) ईवेंट {NSString * str = [event characters]; NSLog (@ "% @", str); [सुपर कीडाउन: घटना]; }
जोड़ा लेखक Hussain Shabbir, स्रोत

NSTextField के लिए टेक्स्ट संपादन को NSTextView द्वारा विंडो द्वारा प्रदान किया जाता है, जिसे फ़ील्ड एडिटर कहा जाता है। NSWindow विधि fieldEditor: forObject: और NSWindowDelegate विधि windowWillReturnFieldEditor: toObject: देखें। मुझे लगता है कि आप इनमें से एक का उपयोग अपने स्वयं के उप-वर्गीकृत NSTextView को फ़ील्ड एडिटर के रूप में प्रदान करने के लिए कर सकते हैं। या, क्या आप बस NSTextField के बजाय NSTextView का उपयोग कर सकते हैं?

0
जोड़ा

controlTextDidChange is quite a good solution, but don't forget this 2 important things:

  1. टेक्स्ट फ़ील्ड के प्रतिनिधि बाध्यकारी को उस ऑब्जेक्ट पर सेट करें जहां आप ControlTextDidChange विधि को परिभाषित करते हैं। आम तौर पर, दस्तावेज़ आधारित ऐप्स में यह विंडो नियंत्रक होता है, अन्यथा आपका ऐप प्रतिनिधि होता है।

यहां छवि विवरण दर्ज करें

  1. विशेषता निरीक्षक अनुभाग
  2. में टेक्स्टफिल्ड का नियंत्रण "निरंतर" पर सेट करें

यहां छवि विवरण दर्ज करें

यदि आप उन बिंदुओं को याद करते हैं, तो आपके पास कोई परिणाम नहीं होगा।

0
जोड़ा