2016-03-21 6 views
6

मेरे पास NSTextView- आधारित घटक है और मैं उस पर एकल क्लिक अक्षम करना चाहता हूं, ताकि उसका प्रविष्टि बिंदु इन एकल क्लिकों से प्रभावित न हो, लेकिन फिर भी कॉपी-एंड-पेस्ट कार्य के लिए टेक्स्ट के टुकड़े चुनने में सक्षम होना चाहिए:NSTextView: एकल क्लिक को अक्षम करने के लिए कैसे करें लेकिन फिर भी कॉपी-एंड-पेस्ट के लिए चयन की अनुमति दें?

  1. एकल क्लिक के लिए कुछ नहीं कर
  2. प्रति-और-चिपकाएं संभव है और सम्मिलन बिंदु को प्रभावित नहीं करता

क्या मैं चाहता हूँ कि वास्तव में क्या हम डिफ़ॉल्ट टर्मिनल अनुप्रयोग में है: सम्मिलन बिंदु है और माउस क्लिक के माध्यम से इसे बदलना संभव नहीं है, लेकिन कॉपी-एंड-पेस्ट के लिए अभी भी टेक्स्ट का चयन है मुमकिन।

मैंने - (void)mouseDown:(NSEvent *)theEvent विधि को देखने का प्रयास किया है लेकिन कुछ भी उपयोगी नहीं मिला।

+0

संपादन योग्य = नहीं, चयन = हाँ पर्याप्त होगा:

static const NSUInteger kCursorLocationSnapshotNotExists = NSUIntegerMax; @property (assign, nonatomic) NSUInteger cursorLocationSnapshot; #pragma mark - <NSTextViewDelegate> - (NSRange)textView:(NSTextView *)textView willChangeSelectionFromCharacterRange:(NSRange)oldSelectedCharRange toCharacterRange:(NSRange)newSelectedCharRange { if (self.mouseDownFlag && self.cursorLocationSnapshot == kCursorLocationSnapshotNotExists) { self.cursorLocationSnapshot = oldSelectedCharRange.location; } return newSelectedCharRange; } 

4) कुंजियों का उपयोग स्थान को पुनर्स्थापित करता है मुद्रित करने के लिए यदि आवश्यक हो तो प्रयास? या आपको कुछ अलग चाहिए? क्या आप स्पष्ट कर सकते हो? – Remizorrr

+0

यह पर्याप्त हो सकता है 'insertText: replacementRange: '' संपादन योग्य = NO' के साथ काम करेगा लेकिन यह कोई भी पाठ नहीं जोड़ता है। –

+0

@StanislavPankevich चिपकने से पहले बस YES के लिए संपादन योग्य सेट हो सकता है और फिर NO पर वापस जा सकता है? – faviomob

उत्तर

1

मुझे इस तरह के व्यवहार को प्राप्त करने के लिए हैकी कामकाज मिला है। मैंने demo project बनाया है, प्रासंगिक वर्ग TerminalLikeTextView है। यह समाधान पूरी तरह से काम करता है लेकिन मैं अभी भी एक बेहतर समाधान करना चाहता हूं: NSTextView के आंतरिक यांत्रिकी पर कम हैकी और कम निर्भर है ताकि अगर कोई ऐसा साझा कर सके।

कुंजी कदम हैं:

1) सेट mouseDownFlag को हां नीचे माउस से पहले और के लिए नहीं के बाद:

@property (assign, nonatomic) BOOL mouseDownFlag; 

- (void)mouseDown:(NSEvent *)theEvent { 
    self.mouseDownFlag = YES; 

    [super mouseDown:theEvent]; 

    self.mouseDownFlag = NO; 
} 

2) updateInsertionPointStateAndRestartTimer विधि से जल्दी वापसी को अद्यतन करने से सम्मिलन बिंदु को रोकने के लिए:

- (void)updateInsertionPointStateAndRestartTimer:(BOOL)flag { 
    if (self.mouseDownFlag) { 
     return; 
    } 

    [super updateInsertionPointStateAndRestartTimer:flag]; 
} 

3) पहले दो चरण माउस के साथ नहीं जाने के लिए सम्मिलन बिंदु बनाएंगे हालांकि selectionRange अभी भी बदला जाएगा इसलिए हम n eed यह का ट्रैक रखने के:

- (void)keyDown:(NSEvent *)event { 
    NSString *characters = event.characters; 

    [self insertTextToCurrentPosition:characters]; 
} 

- (void)insertTextToCurrentPosition:(NSString *)text { 
    if (self.cursorLocationSnapshot != kCursorLocationSnapshotNotExists) { 
     self.selectedRange = NSMakeRange(self.cursorLocationSnapshot, 0); 
     self.cursorLocationSnapshot = kCursorLocationSnapshotNotExists; 
    } 

    [self insertText:text replacementRange:NSMakeRange(self.selectedRange.location, 0)]; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे