指令行設計模式:
指令設計模式将一個請求或行動作封裝為對象。這個封裝請求比原始的請求要靈活并且可以在對象之前被傳遞,存儲,動态修改或者放進隊列裡面。蘋果
蘋果公司實作這種模式使用Target-Action機制和Invocation。
你可以閱讀更多關于Target-Action機制在蘋果的文檔但是Invocation類可以包含一個目标對象,方法選擇器和一些參數。當需要的時候這個對象可以被動态的改變。
這是一個完美的指令模式的例子。它将發送對象從接收對象和對象和可以持續請求或一連串的請求。
怎麼使用指令設計模式?
在你進入invocation 操作之前。你需要設定framework來支援撤銷操作。你必須定義一個UIToolBar 和NSMutableArray 來作為撤銷棧。
在Viewcontroller實作檔案延展裡添加其他的執行個體變量:
UIToolbar *toolbar;
// We will use this array as a stack to push and pop operation for the undo option
建立一個toolbar 來展示按鈕和新的操作。以及一個數組作為指令隊列。
添加下面代碼在ViewDidLoad:
上面代碼建立一個toolbar帶兩個按鈕和在他們之間添加一個靈活的空間。它還建立一個空撤銷堆棧。這裡的撤銷按鈕被禁用,因為撤銷堆棧開始空了。
注意,工具欄沒有用坐标初始化,由于在ViewDidLoad設定的坐标大小不是最終的。是以最後的設定通過下面代碼:
您将添加三個ViewController方法。m處理專輯管理操作:添加、删除和撤銷。
第一個方法用來添加新專輯
在這裡你添加一個新專輯,并且設定為目前的索引,并且加載這個滑動視圖。
下面是删除方法:
對上面做下解釋:
1:讓這張專輯删除
2:定義一個NSMethodSignature 類型為了建立NSInvocation。為了撤銷删除操作。這個
NSInvocation需要知道三個事情:選擇器(什麼消息被發送),目标(誰發送這個消息)還有消息的參數。這個例子中一旦你撤銷删除
他消息發送删除的相反您需要添加删除專輯。
3:撤銷操作被建立後添加到空棧裡面。這個操作被調價到數組的組後,就像正常的棧。
4:
用libraryAPI來删除專輯從資料架構中并且加載滑動視圖。
5:自撤銷堆棧的操作,您需要啟用撤銷按鈕
注意:對于NSInvocation你需要注意下面幾點:
1:參數必須通過指針傳遞
2:參數從2的索引開始,指數0和1都保留在目标和選擇器。
3:果有機會,參數将被收回,那麼你應該叫retainArguments。
最後添加撤銷操作:
撤消操作“彈出”中的最後一個對象棧。這個對象總是NSInvocation類型,可以通過調用調用…調用。這張專輯删除時調用的指令很早被建立。并添加删除專輯專輯清單。因為你也删除最後一個對象在堆棧“彈出”時,你現在看看棧是空的。如果是,這就意味着沒有更多的行動取消。是以你禁用撤銷按鈕。建構和運作您的應用程式來測試你的撤銷機制,删除一個專輯(或兩個),點選取消按鈕看它的實際應用:
這也是一個不錯的測試是否保留更改相冊資料之間的會話。現在,如果你删除一個專輯,将應用程式發送到背景,然後終止應用程式,下次啟動應用程式顯示專輯清單應該反映删除。