我有一個實現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自己的子類...所以我願意提供建議。
我對iOS並沒有太多的方便,用可可我只是做了一個撤銷和重做管理菜單項的出口,並禁用它們。在iOS中,用戶如何選擇撤消和重做? –