gpt4 book ai didi

macos - NSTextView 撤消/重做属性更改(当不是第一响应者时)

转载 作者:行者123 更新时间:2023-12-03 16:45:38 24 4
gpt4 key购买 nike

我正在构建一个带有自定义控件的基本文本编辑器。对于我的文本对齐控制,我需要涵盖两个用户场景:

  1. TextView 是第一响应者 - 将段落属性更改为 textView.rangesForUserParagraphAttributeChange

  2. TextView 不是第一响应者 - 将段落属性更改为全文范围。

方法如下:

- (IBAction)changedTextAlignment:(NSSegmentedControl *)sender
{
NSTextAlignment align;
// ....

NSRange fullRange = NSMakeRange(0, self.textView.textStorage.length);
NSArray *changeRanges = [self.textView rangesForUserParagraphAttributeChange];

if (![self.mainWindow.firstResponder isEqual:self.textView])
{
changeRanges = @[[NSValue valueWithRange:fullRange]];
}

[self.textView shouldChangeTextInRanges:changeRanges replacementStrings:nil];
[self.textView.textStorage beginEditing];

for (NSValue *r in changeRanges)
{
@try {
NSDictionary *attrs = [self.textView.textStorage attributesAtIndex:r.rangeValue.location effectiveRange:NULL];
NSMutableParagraphStyle *pStyle = [attrs[NSParagraphStyleAttributeName] mutableCopy];
if (!pStyle)
pStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];

[pStyle setAlignment:align];
[self.textView.textStorage addAttributes:@{NSParagraphStyleAttributeName: pStyle}
range:r.rangeValue];
}
@catch (NSException *exception) {
NSLog(@"%@", exception);
}
}

[self.textView.textStorage endEditing];
[self.textView didChangeText];

// ....

NSMutableDictionary *typingAttrs = [self.textView.typingAttributes mutableCopy];
NSMutableParagraphStyle *pStyle = typingAttrs[NSParagraphStyleAttributeName];
if (!pStyle)
pStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[pStyle setAlignment:align];
[typingAttrs setObject:NSParagraphStyleAttributeName forKey:pStyle];
self.textView.typingAttributes = typingAttrs;

}

因此,两种方案都工作正常...但是,当在“非第一响应者”方案中应用更改时,撤消/重做不起作用。撤消管理器将某些内容推送到其堆栈上(即“编辑”菜单中提供“撤消”功能),但调用撤消不会更改文本。它所做的只是明显地选择全文范围。

如何适本地更改 TextView 属性,以便无论 View 是否是第一响应者都可以进行撤消/重做?

提前谢谢您!

最佳答案

我不确定,但我有两个建议。一,检查 shouldChangeTextInRanges:... 的返回值,因为文本系统可能拒绝您建议的更改;无论如何都是个好主意。第二,我会尝试让非急救人员的情况更像急救人员的情况,以使其发挥作用;特别是,您可以首先选择完整范围,这样 rangesForUserParagraphAttributeChange 实际上就是您更改属性的范围。朝这个方向进一步迈出的一步是在更改期间实际上暂时使 TextView 成为第一响应者。在这种情况下,我认为这两个案例确实应该是相同的。完成后,您可以立即恢复第一响应者。不是最优的,但 AppKit 似乎在幕后做出了一些假设,您可能只需要解决这个问题。无需尝试重​​现问题并解决它,这就是我能提供的最好的...

关于macos - NSTextView 撤消/重做属性更改(当不是第一响应者时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106322/

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