2010-07-19 53 views
1

我一直在嘗試使用NSUndoManager類在我的一個應用程序中設計撤銷/重做功能,並且看到一些設計困難。 在我的應用程序,我只是有一個方法在iPhone SDK中使用NSUndoManager撤消/重做

-(IBAction) addLastBall:(Ball *)ball 

因此,當用戶在UI選擇一個按鈕,我添加了一個球對象,以我的數組列表。但是,我沒有任何操作按鈕來移除球,這是UI工作流程的設計,無法更改。 因此,實施撤銷我叫addLastBall方法

[undoManager registerUndoWithTarget:self selector:@selector(removeBall:) object:ball]; 

內部下面的代碼完成此操作後,當用戶試圖執行撤消removeBall方法得到球對象調用。一切都很好。 但是,我不知道如何處理重做部分,當用戶嘗試重做時,我不確定哪個方法會被調用,因爲我需要添加用戶剛剛使用撤消操作移除的球對象。 任何見解都會非常有幫助。

非常感謝。

回答

1

重做只是簡單地執行撤銷操作,而撤銷操作是在相應的撤銷執行時執行的。因此,最直接的解決方案是簡單地在removeBall:方法中註冊撤銷操作。

- (void)removeBall:(Ball *)ball { 
    [undoManager registerUndoWithTarget:self 
           selector:@selector(addLastBall:) 
           object:ball]; 
    ... 
} 

注意,有時更清晰的使用prepareWithInvocationTarget:註冊撤消操作:

[[undoManager prepareWithInvocationTarget:self] addLastBall:ball]; 

順便說一句,一定要保持保持在removeBall:方法零以上的球數 - 的撤消管理器不會爲你保留球,如果它被取消分配,那麼撤消移除將會崩潰。

0

沒有方法被調用。 NSUndoManager只是保存撤銷操作(重做)的反向操作,如果用戶選擇重做,則會執行該操作。

它都在NSUndoManager中實現,所以你不必擔心它。 如果你想要重做你的方法,你應該考慮創建你自己的撤銷管理器,但我不會建議你。它可以變得非常複雜,而且NSUndoManager完美地處理所有事情。

+0

這是真的嗎?撤消管理者在重做時似乎沒有做任何事情。 – ebi 2014-07-01 17:08:51

相關問題