NSTextView में प्रमुख ईवेंट कैप्चर करने का सबसे अच्छा तरीका?

मैं धीरे-धीरे उद्देश्य-सी और कोको सीख रहा हूं, और पाठ दृश्यों में महत्वपूर्ण घटनाओं को कैप्चर करने के लिए अब तक एकमात्र तरीका प्रतिनिधिमंडल का उपयोग करना है, लेकिन मुझे ऐसे समाधान को कार्यान्वित करने के तरीके पर उपयोगी दस्तावेज और उदाहरण खोजने में परेशानी हो रही है। क्या कोई मुझे सही दिशा में इंगित कर सकता है या कुछ पहली हाथ की मदद कर सकता है?

0
ro fr bn

4 उत्तर

मैंने कुछ कठिन खुदाई की है, और मुझे अपने स्वयं के प्रश्न का उत्तर मिला। मैं इसे नीचे प्राप्त करूंगा, लेकिन उत्तर देने वाले दो फेलो के लिए धन्यवाद। मुझे लगता है कि स्टैक ओवरफ्लो पहले से ही एक शानदार साइट है - मुझे आशा है कि बीटा खत्म होने के बाद अधिक मैक डेवलपर्स अपना रास्ता खोज लेंगे - यह अन्य डेवलपर्स के लिए मंच पर संक्रमण की तलाश में एक बड़ा संसाधन हो सकता है।

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

- (void)textDidChange:(NSNotification *)aNotification;

मैं संपादित किए जा रहे पाठ का जवाब दे सकता हूं। निश्चित रूप से, अन्य विधियां उपलब्ध हैं, और मैं उनके साथ खेलने के लिए उत्साहित हूं, क्योंकि मुझे पता है कि मैं पूरी तरह से सीखूंगा जैसा मैं करता हूं। फिर से धन्यवाद, दोस्तों।

0
जोड़ा

यह बताना महत्वपूर्ण है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं? एक उच्च स्तरीय लक्ष्य जो आपको लगता है कि एक NSTextView में प्रमुख घटनाओं को कैप्चर करना संबोधित करेगा।

उदाहरण के लिए, जब कोई मुझसे पूछता है कि एनएसटीएक्स्ट फ़ील्ड में महत्वपूर्ण घटनाओं को कैप्चर करना है, तो वे वास्तव में जानना चाहते हैं कि फ़ील्ड में इनपुट को कैसे सत्यापित किया जाए। यह फ़ील्ड के फॉर्मेटर को NSFormatter (चाहे कोको या कस्टम एक में शामिल स्वरूपकों में से एक) के उदाहरण पर सेट करके किया जाता है, न कि कीस्ट्रोक को सीधे प्रोसेस करके।

तो उस उदाहरण को देखते हुए, आप वास्तव में क्या करने की कोशिश कर रहे हैं?

0
जोड़ा

आम तौर पर, जिस तरह से आप इसे कार्यान्वित करते हैं, वह केवल आपके दृश्य के नियंत्रक को आवश्यक फ़ंक्शन जोड़ना है, और इसके प्रतिनिधि को सेट करना है। उदाहरण के लिए, यदि आप दृश्य लोड होने पर कोड चलाने के लिए चाहते हैं, तो आप केवल अपने दृश्य को नियंत्रक को सौंपें, और awakeFromNib फ़ंक्शन को लागू करें।

इसलिए, टेक्स्ट व्यू में एक महत्वपूर्ण प्रेस का पता लगाने के लिए, सुनिश्चित करें कि आपका नियंत्रक टेक्स्ट व्यू का प्रतिनिधि है, और फिर इसे कार्यान्वित करें:

- (void)keyUp:(NSEvent *)theEvent

ध्यान दें कि यह एक विरासत में NSResponder विधि है, न कि NSTextView विधि।

0
जोड़ा
यदि आप इसे प्रतिनिधि में डालते हैं तो keyUp को नहीं बुलाया जाता है। आपको NSTextView को उपclass करना होगा और उसे वहां रखना होगा।
जोड़ा लेखक Bob Murphy, स्रोत

सिंटैक्स हाइलाइटिंग के लिए बस एक टिप:

पूरे पाठ दृश्य को एक बार में हाइलाइट न करें - यह बहुत धीमा है। -editedRange का उपयोग करके अंतिम संपादित टेक्स्ट को भी हाइलाइट न करें - यदि उपयोगकर्ता टेक्स्ट व्यू में टेक्स्ट के बड़े हिस्से को चिपकाता है तो यह बहुत धीमा है।

इसके बजाय आपको इस तरह के दृश्यमान पाठ को हाइलाइट करने की आवश्यकता है:

NSRect visibleRect = [[[textView enclosingScrollView] contentView] documentVisibleRect];
NSRange visibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];

फिर आप अपने हाइलाइटिंग कोड पर visualRange फ़ीड करते हैं।

0
जोड़ा