gpt4 book ai didi

cocoa - NSTextView:如何禁用单击但仍允许选择复制和粘贴?

转载 作者:行者123 更新时间:2023-12-03 16:11:48 26 4
gpt4 key购买 nike

我有基于 NSTextView 的组件,我想禁用对其的单击,以便其插入点不受这些单击的影响,但仍然能够选择文本片段进行复制和粘贴工作:

  1. 单击一次不会执行任何操作
  2. 可以进行复制粘贴,并且不会影响插入点

我想要的正是我们在默认终端应用程序中所拥有的:有插入点,并且无法通过鼠标单击更改它,但仍然可以选择用于复制和粘贴的文本。

我尝试查看 - (void)mouseDown:(NSEvent *)theEvent 方法,但没有发现任何有用的内容。

最佳答案

我找到了一种巧妙的解决方法来实现这种行为。我创建了demo project ,相关类有TerminalLikeTextView 。这个解决方案工作完美,但我仍然希望有一个更好的解决方案:更少的 hacky 和更少的依赖 NSTextView 的内部机制,所以如果有人有这样的请分享。

关键步骤是:

1) 在鼠标按下之前将 mouseDownFlag 设置为 YES,在按下鼠标后将 mouseDownFlag 设置为 NO:

@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 仍会更改,因此我们需要跟踪它:

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) 如果需要,尝试使用按键进行打印可恢复位置:

- (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)];
}

关于cocoa - NSTextView:如何禁用单击但仍允许选择复制和粘贴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36138607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com