※ 引述《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
> -------------------------------------------------------------------------- <
作者: Devon22 () 看板: MacDev
標題: Re: [問題] 關於redo
時間: Tue May 8 00:52:08 2007
※ 引述《yllan (藍永倫)》之銘言:
: 直接用 [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 ];
^^^^^^^^^^^^^^^
另外請問如果這邊要傳的值不只一個的話
有沒有什麼方法可以傳複數的值?
我現在是用array把需要的東西放在一起再傳
不過感覺好像有點笨!?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.223.161.196
> -------------------------------------------------------------------------- <
作者: yllan (藍永倫) 看板: MacDev
標題: Re: [問題] 關於redo
時間: Tue May 8 01:50:32 2007
※ 引述《Devon22 ()》之銘言:
: ※ 引述《yllan (藍永倫)》之銘言:
: : - (void) setData: (id) newData {
: : [myUndoManager registerUndoWithTarget: self
: : selector: @selector(setData:)
: : object: oldData ];
: ^^^^^^^^^^^^^^^
: 另外請問如果這邊要傳的值不只一個的話
: 有沒有什麼方法可以傳複數的值?
: 我現在是用array把需要的東西放在一起再傳
: 不過感覺好像有點笨!?
改成 [[myUndoManager prepareWithInvocationTarget: self]
setData1: oldData1 data2: oldData2 data3: oldData3];
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.31.182