2012-12-19 87 views
1

我有一個實現UITextInput的視圖,並且我添加了對撤消的支持。現在每個單獨的擊鍵或退格都記錄爲可撤銷事件。如何爲NSUndoManager + 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自己的子類...所以我願意提供建議。

+0

我對iOS並沒有太多的方便,用可可我只是做了一個撤銷和重做管理菜單項的出口,並禁用它們。在iOS中,用戶如何選擇撤消和重做? –

回答

0

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