Re: [問題] 關於redo
※ 引述《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
05/07 16:57, 1F
討論串 (同標題文章)
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章
48
107