gpt4 book ai didi

iphone - 如何对 NSUndoManager+UITextInput 的击键进行分组

转载 作者:行者123 更新时间:2023-12-01 16:53:14 27 4
gpt4 key购买 nike

我有一个实现 UITextInput 的 View ,我添加了对撤消的支持。现在,每个单独的击键或退格键都被记录为一个可撤销的事件。

我知道我可以对事件进行分组,并且可以通过第一次击键打开一个撤消组。但是我该去哪里关闭群组呢?如果当用户摇动设备时该组是打开的,我会得到一个异常。撤消时不能打开组。

我会以某种方式需要在 NSUndoManager 实例显示操作菜单之前关闭打开的组。

我是否需要子类化 NSUndoManager 才能做到这一点?或者有人知道我如何在操作前及时关闭输入撤消组吗?

注意:第一响应者在显示撤消操作时不会辞职。

实际上,在我看来,正常的文本输入让打字组以某种方式打开,因为如果您取消撤消/重做警报,那么您可以继续打字,所有这些击键随后可以一起撤消。

我想我不明白何时对操作进行分组以及是否以及何时需要关闭一个组。

更新:我发现以下方法有效:我创建了 NSUndoManager 的子类,用于跟踪打开组的数量。在 -undo 上,我关闭所有打开的组以避免异常,然后调用 [super undo]

#import "DTUndoManager.h"

@implementation DTUndoManager
{
NSUInteger _numberOfOpenGroups;
}

- (void)beginUndoGrouping
{
_numberOfOpenGroups++;

[super beginUndoGrouping];
}

- (void)endUndoGrouping
{
_numberOfOpenGroups--;

[super endUndoGrouping];
}

- (void)closeAllOpenGroups
{
while (_numberOfOpenGroups>0)
{
[self endUndoGrouping];
}
}

- (void)undo
{
[self closeAllOpenGroups];

[super undo];
}

#pragma mark - Properties

@synthesize numberOfOpenGroups = _numberOfOpenGroups;

@end

每当开始新操作时,例如更改段落样式,我都会调用 [self.undoManager closeAllOpenGroups],这会关闭键入的撤消组。

-deleteBackward:-insertText: 方法中,我知道需要启动一个新的输入 block :

- (void)insertText:(NSString *)text
{
DTUndoManager *undoManager = (DTUndoManager *)self.undoManager;
if (!undoManager.numberOfOpenGroups)
{
[self.undoManager beginUndoGrouping];
}

现在没有太多额外的代码,但我希望不必为 DTUndoManager 使用我自己的子类...所以我愿意接受建议。

最佳答案

我的解决方案包含在问题的更新中。

关于iphone - 如何对 NSUndoManager+UITextInput 的击键进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13954372/

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