2011-03-22 53 views
1

我有撤消/重做在我的應用程序工作。如何確保「撤消」和「重做」菜單項添加了操作字符串?

我將撤消和重做菜單操作的目標設置爲我的應用程序委託來使用undoAction:和redoAction:方法實現操作。菜單項'已啓用的綁定綁定到我的撤消管理器的canUndo和canRedo屬性,並且這些屬性按預期工作。當我推入撤消堆棧時,我設置了一個操作名稱,但從未在菜單中看到它。

爲什麼我的菜單總是說撤銷或重做,而不是撤消移動到垃圾箱和重做移動到垃圾箱?菜單項通常是否被我繞過的魔法更新?我沒有使用響應者鏈,因爲我的應用程序委託不在響應者鏈中,因此從未看到這些操作。

撤消管理器是在我的應用程序委託中創建的。

更新:更改爲使用窗口的撤消管理器沒有區別。

-(void)undoableRemoveItemsFromListAtIndexes:(NSIndexSet*)itemIndexes; 
{ 
    NSArray *removedItems = [[self.listController arrangedObjects] objectsAtIndexes:itemIndexes]; 
    [[self.undoManager prepareWithInvocationTarget:self] undoableAddItems:removedItems toListAtIndexes:itemIndexes]; 
    [self removeItemsFromListAtIndexes:itemIndexes]; 
    [self.undoManager setActionName:@"Move to Trash"]; 
} 

回答

0

答案竟然是一個或多個以下的(從NSCoder晚上坎貝爾幫助):

  • 使用窗口的撤消管理器,而不是一個,我創建

  • 刪除綁定我和掛鉤的菜單項,急救員

  • 名稱在我的應用程序的委託方法撤消:和重做:

一旦我做了所有這一切都神奇地工作。

1

檢查撤銷管理器-isUndoing和交換字符串是否適當。

NSUndoManager * um = [self undoManager]; 
// ... 
[um setActionName:([um isUndoing]) ? @"Remove Foo" : @"Add Foo"]; 

記住重做是非常重要的是推到重做堆棧撤消。

+0

這將解決我沒有的問題:錯誤的菜單字符串。我根本沒有得到我的行動字符串。 – 2011-03-22 14:22:41

+0

啊。我懂了。抱歉沒有仔細閱讀。您的-undoableRemoveItemsFromListAtIndexes:方法是否被任何其他與撤消相關的方法包裝,導致撤消組? – 2011-03-22 15:41:05

+0

不是。我不明確創建任何組,並且您看到的調用是runloop中唯一的調用。 – 2011-03-23 00:54:22