मैं Xcode 10, Objective-C, macOS NOT iOS पर हूं।
यदि लाइन नंबर दिया गया है तो क्या NSTextView
में प्रोग्रामेटिक रूप से एक लाइन का चयन करना संभव है? सामग्री की किसी भी विशेषता को बदलकर नहीं, बस इसे चुनें क्योंकि उपयोगकर्ता इसे ट्रिपल क्लिक करके करेगा।
मुझे पता है कि इसकी सीमा से चयनित टेक्स्ट कैसे प्राप्त करें लेकिन इस बार मुझे प्रोग्रामेटिक रूप से टेक्स्ट का चयन करने की आवश्यकता है।
मुझे selectLine:(id)
मिल गया है लेकिन ऐसा लगता है कि यह एक सम्मिलन बिंदु के लिए है। सही दिशा में एक संकेतक बहुत अच्छा होगा और इसकी बहुत सराहना की जाएगी।
1 उत्तर
यहाँ Apple दस्तावेज़ https://developer. आप जो करने का प्रयास कर रहे हैं उसके लिए apple.com/library/archive/documentation/Cocoa/Conceptual/TextLayout/Tasks/CountLines.html उपयोगी होना चाहिए।
लिपटे पाठ की पंक्तियों की गिनती के अपने उदाहरण में वे NSLayoutManager विधि lineFragmentRectForGlyphAtIndex:effectiveRange
https://developer.apple.com/documentation/appkit/nslayoutmanager/1403140-linefragmentrectforglyphatindex लाइन की प्रभावी रेंज का पता लगाने के लिए, फिर काउंटिंग इंडेक्स को उस रेंज के अंत तक बढ़ाएं (यानी अगले से शुरू करें) रेखा)। कुछ मामूली संशोधनों के साथ, आप इसका उपयोग उस लाइन की श्रेणी को खोजने के लिए कर सकते हैं जिसे आप चुनना चाहते हैं, फिर इसे चुनने के लिए NSTextView के setSelectedRange:
का उपयोग करें।
यहां इसे संशोधित किया गया है जहां मेरा मानना है कि यह संभवतः उस काम के लिए काम करेगा जिसे आप पूरा करने का प्रयास कर रहे हैं:
- (void)selectLineNumber:(NSUInteger)lineNumberToSelect {
NSLayoutManager *layoutManager = [self.testTextView layoutManager];
NSUInteger numberOfLines = 0;
NSUInteger numberOfGlyphs = [layoutManager numberOfGlyphs];
NSRange lineRange;
for (NSUInteger indexOfGlyph = 0; indexOfGlyph < numberOfGlyphs; numberOfLines++) {
[layoutManager lineFragmentRectForGlyphAtIndex:indexOfGlyph effectiveRange:&lineRange];
// check if we've found our line number
if (numberOfLines == lineNumberToSelect) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self.testTextView setSelectedRange:lineRange];
}];
break;
}
indexOfGlyph = NSMaxRange(lineRange);
}
}
तब आप इसे कुछ इस तरह से कॉल कर सकते हैं:
[self selectLineNumber:3];
ध्यान रखें कि हम इंडेक्स 0 से शुरू कर रहे हैं। यदि आप एक लाइननंबर टू सेलेक्ट में पास करते हैं जो कि नंबरऑफलाइन से अधिक है, तो यह सिर्फ एक नो-ऑप होना चाहिए और चयन वहीं रहना चाहिए जहां यह है।