![](/img/trans.png)
[英]How to use NSUndoManager with a UIImageView or CGContext
[英]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.