[英]How can I get the selection direction of an NSTextView?
我正在嘗試在NSTextView
獲取所選范圍的NSTextView
。 換句話說,當您使用shift+leftarrow
和shift+rightarrow
時,所選范圍是否會更改其位置或長度。 我的第一個問題是selectionAffinity
表示方向,但它似乎只適用於多行選擇。
如何獲得所選范圍的方向?
第1步:聲明屬性
@property (nonatomic) NSRange lastRange;
第2步:在TextView Delegate中,添加以下內容:
- (void) textViewDidChangeSelection:(UITextView *)textView
NSRange currentRange = NSMakeRange(textView.selectedRange.location, textView.selectedRange.length);
if (currentRange.length == 0) {
NSLog(@"Nothing selected");
_lastRange = currentRange;
}
else {
if (currentRange.location < _lastRange.location) {
NSLog(@"Selecting LEFT");
}
else {
NSLog(@"Selecting RIGHT");
}
}
}
OSX具有所需的所有功能,需要更多的工作,但這就是我提出的一個可行的,一致的解決方案。 重命名是可選的,或者更確切地說......鼓勵......
第1步:對NSTextView進行子類化 在你的SubClass.h
:
#import "TheSelectionizer.h"
- (void)setSelectedRange:(NSRange)charRange affinity:(NSSelectionAffinity)affinity stillSelecting:(BOOL)stillSelectingFlag {
if (charRange.length == 0) {
_lastAnchorPoint = charRange;
}
[super setSelectedRange:charRange affinity:affinity stillSelecting:stillSelectingFlag];
}
@end
在你的SubClass.m
#import "TheSelectionizer.h" - (void)setSelectedRange:(NSRange)charRange affinity:(NSSelectionAffinity)affinity stillSelecting:(BOOL)stillSelectingFlag { if (charRange.length == 0) { _lastAnchorPoint = charRange; } [super setSelectedRange:charRange affinity:affinity stillSelecting:stillSelectingFlag]; } @end
第2步:實現NSTextViewDelegate
- (NSRange) textView:(NSTextView *)textView willChangeSelectionFromCharacterRange:(NSRange)oldSelectedCharRange toCharacterRange:(NSRange)newSelectedCharRange { if (newSelectedCharRange.length != 0) { TheSelectionizer * selectionizer = (TheSelectionizer *)textView; int anchorStart = (int)selectionizer.lastAnchorPoint.location; int selectionStart = (int)newSelectedCharRange.location; int selectionLength = (int)newSelectedCharRange.length; /* If mouse selects left, and then a user arrows right, or the opposite, anchor point flips. */ int difference = anchorStart - selectionStart; if (difference > 0 && difference != selectionLength) { if (oldSelectedCharRange.location == newSelectedCharRange.location) { // We were selecting left via mouse, but now we are selecting to the right via arrows anchorStart = selectionStart; } else { // We were selecting right via mouse, but now we are selecting to the left via arrows anchorStart = selectionStart + selectionLength; } selectionizer.lastAnchorPoint = NSMakeRange(anchorStart, 0); } // Evaluate Selection Direction if (anchorStart == selectionStart) { if (oldSelectedCharRange.length < newSelectedCharRange.length) { // Bigger NSLog(@"Will select right in overall right selection"); } else { // Smaller NSLog(@"Will select left in overall right selection"); } } else { if (oldSelectedCharRange.length < newSelectedCharRange.length) { // Bigger NSLog(@"Will select left in overall left selection"); } else { // Smaller NSLog(@"Will select right in overall left selection"); } } } return newSelectedCharRange; }
我發布了一個項目,萬一有人想嘗試或想看到它。
這里有完整的“項目”
假設聲明了NSRange yourPreviousRange。
//Check when NSTextView changed its value
@interface delegateAppDelegate : NSObject <NSApplicationDelegate, NSTextViewDelegate> {
NSWindow *window;
}
-(void)textDidChange:(NSNotification *)notification {
NSRange yourRange = notification.object.selectedRange;
if (yourRange.location == yourPreviousRange.location - 1 || yourRange.length == yourPreviousRange.length){
//left direction
} else if (yourRange.location == yourPreviousRange.location || yourRange.length == yourPreviousRange.length + 1){
//right direction
}
yourPreviousRange = yourRange;
}
使用NSTextViewDelegate
方法: -textView:willChangeSelectionFromCharacterRange:toCharacterRange:或-textView:willChangeSelectionFromCharacterRanges:toCharacterRanges:如果你想要多選擇支持。
請注意,如果您只實現-textView:willChangeSelectionFromCharacterRange:toCharacterRange:
將禁止多選。
例如,沒有多選:
- (NSRange)textView:(NSTextView *)aTextView willChangeSelectionFromCharacterRange:(NSRange)oldSelectedCharRange toCharacterRange:(NSRange)newSelectedCharRange
{
if (newSelectedCharRange.length == 0 && oldSelectedCharRange.length == 0)
{
/* move the insertion point */
if (newSelectedCharRange.location < oldSelectedCharRange.location)
NSLog(@"insertion point move left");
else
NSLog(@"insertion point move right");
}
else if (newSelectedCharRange.length == 0 && oldSelectedCharRange.length != 0)
{
/* end a selection and move insertion point */
if (newSelectedCharRange.location == oldSelectedCharRange.location)
NSLog(@"insertion point at start from previous selection");
else if (newSelectedCharRange.location < oldSelectedCharRange.location)
NSLog(@"insertion point move left");
else
NSLog(@"insertion point move right");
}
else if (oldSelectedCharRange.length == 0 && newSelectedCharRange.length != 0)
{
/* start a selection */
if (newSelectedCharRange.location == oldSelectedCharRange.location)
NSLog(@"start a selection at insertion point, move right");
else if (newSelectedCharRange.location < oldSelectedCharRange.location)
NSLog(@"start a selection, move left");
else
NSLog(@"start a selection, move right");
}
else
{
if (newSelectedCharRange.location < oldSelectedCharRange.location)
NSLog(@"selection move left");
else
NSLog(@"selection move right");
}
return newSelectedCharRange;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.