簡體   English   中英

如何對NSUndoManager + UITextInput的擊鍵進行分組

[英]How to group keystrokes for NSUndoManager+UITextInput

我有一個實現UITextInput的視圖,並且添加了對撤消的支持。 現在,每個單獨的按鍵或退格鍵都記錄為一個不可撤消的事件。

我知道我可以對事件進行分組,並且可以通過第一個按鍵來打開撤消組。 但是我要去哪里關閉小組? 如果當用戶搖動設備時該組處於打開狀態,我將獲得例外。 撤消操作時,您不能有一個開放的組。

我將需要在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:方法中,我知道需要啟動一個新的鍵入塊:

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

現在不需要太多額外的代碼,但是我希望不必為DTUndoManager使用自己的子類...所以我願意征求建議。

我的解決方案包含在問題的更新中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM