Re: [問題] 關於redo

看板MacDev作者 (藍永倫)時間18年前 (2007/05/07 11:10), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/5 (看更多)
※ 引述《Devon22 ()》之銘言: : 請教一下yllan大關於redo的寫法 : undo的部份我是用registerUndoWithTarget:selector:object: : 那redo的部份應該要怎麼處理呢? : 文件裡面關於redo的部份好少,實在不曉得應該怎麼寫... 直接用 [NSUndoManager redo] 就可~怎麼說呢? NSUndoManager 是 這樣設計的: 假設你有個 Model Class, 叫做 MoneyBook,其中有個 method 叫做 setData: (id) newData 好了。現在我希望 MoneyBook 的 setData 能做 undo ,就這麼寫: - (void) setData: (id) newData { [myUndoManager registerUndoWithTarget: self selector: @selector(setData:) object: oldData ]; id temp = oldData; oldData = [newData retain]; [temp release]; } 假設一開始 MoneyBook 的 data 是 @"OLD" 好了,現在我們執行 [myMoneyBook setData: @"NEW"] 希望將來 undo 的時候可以恢復到 @"OLD",所以 register.... 的時 後注意黃字,我們是把舊的值存下來。 於是 NSUndoManager 就紀錄下來一個 undo 動作了,這個 undo 其實 就是把 (myMoneyBook, "setData:", @"OLD") 記錄下來,等到呼叫 [myUndoManager undo] 的時候,他就會找到最近紀錄的一群 undo ,invoke: [myMoneyBook setData: @"OLD"] 注意此時 setData: 裡的 oldData == @"NEW",newData == @"OLD"! 於是他又會再一次執行 register.... ,只是這次是紀錄 (myMoneyBook, "setData:", @"NEW") ,而且 NSUndoManager 會知道說 這次紀錄的東西是由 undo 所引發的,因此這個紀錄要記在 redo stack。 所以呼叫 [myUndoManager redo] 的時候,就會呼叫 [myMoneyBook setData: @"NEW"] 了。 所以說也不是這麼簡單隨便用 redo 就行,而是你必須遵循 Apple 的 implicit pattern 來設計程式。不過說穿了就是 MVC,你在 model 中 accessor/會改變狀態的地方,插入 register.... 敘述,並且要是 「自己這個 method with old data」,延用這個慣例就不用花腦筋了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.31.182

05/07 16:57, , 1F
原來redo也是同一段程式,不過看來似乎不太好改的樣子..
05/07 16:57, 1F
文章代碼(AID): #16FfYlek (MacDev)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 2 之 5 篇):
1
1
文章代碼(AID): #16FfYlek (MacDev)