4

我正在閱讀關於Objective-c的一本書並瞭解撤消管理器。這個概念看起來很簡單,但提供的例子似乎過於複雜。基本上,我有一個表視圖連接到一個NSArrayController,我添加或刪除人員到一個數組,我可以編輯他們的名字和東西。因爲該示例使用NSArrayController和綁定,所以添加和刪除是自動的,並且所有的編輯都是自動的。Objective-C撤消管理器問題

要使用撤消管理器,從我的理解,我需要實現我自己的方法來添加/刪除/編輯。

我實現做了添加和刪除,並得到應有的關鍵值編碼自動調用這些方法:

- (void)removeObjectFromEmployeesAtIndex:(int)index; 
- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index; 

然後進行編輯,我必須註冊類作爲觀察員,觀察變化編輯:

- (void)changeKeyPath:(NSString *)keyPath 
      ofObject:(id)obj 
       toValue:(id)newValue 

這裏是我的問題:

  1. 爲什麼我公頃有做這麼多?我的理解是,使用NSArrayController和綁定應該使添加/刪除/編輯項目變得更容易和更自動化。但是,如果我必須手動實現所有這些方法,只需添加撤銷支持,爲什麼要使用NSArrayController或綁定呢?

  2. 背後發生了什麼?在Interface Builder中,添加按鈕連接到NSArrayController上的add方法。那麼我的insertObject方法如何被調用?我知道這是通過關鍵的值編碼,但是什麼使得NSArrayController的add方法被重寫僅僅是b/c我的文檔實現了這個方法?

  3. 該解決方案是不對稱的。我使用一個概念來處理撤消添加/刪除以及另一個概念來處理撤消編輯。我不能只觀察對數組的更改嗎?我想這會使觀察值關鍵字方法複雜化,但是這會更有意義嗎?

+0

你使用的是核心數據? – 2011-06-12 18:35:42

+0

不,我還沒有了解到這一點,但 – JPC 2011-06-12 22:59:15

+1

你通過在Core Data之前學習這一點而節省了很多痛苦;那麼它會變得更有意義。我可以提供的一點建議是,你可以在Cocoa/Xcode中找到非常方便使用的東西,但是你經常需要解決。一個具體的例子是使用IB來創建GUI--做,複雜的事情會變得無用(對於動畫等),並且你必須得到幕後(IB在CoreData爲你的問題做了改進)。似乎你現在已經看到了其中一種情況。我的觀點是:如果你覺得自己在做一些艱難的事情,它可能仍然是最好的/正確的方式。Goodluck – Nektarios 2011-06-15 16:02:17

回答

2

1)近似但不完全。如果您將應用程序代碼劃分爲三個整體區域:模型,視圖和控制器(as documented here),那麼Cocoa/XCode環境爲您提供了一種「無代碼」的方式來處理視圖的基本知識:模型的核心數據和控制器的綁定/對象控制器。

撤銷管理主要關注模型,而不是視圖或控制器。所以它不是真正的Bindings或Object控制器的工作來管理這些東西。看起來你的問題是你使用數組作爲你的數據對象,這對於處理這些東西來說太輕了。如果你想撤銷支持,你將需要使用核心數據來處理模型,並免費提供這些東西,或者手動推出自己的模型對象(可能包含數組),它們處理這個邏輯。當你完成這些工作後,綁定將間接地讓你的生活變得更容易,因爲當撤銷命令將你的數據恢復到以前的狀態時,視圖會自動反映這些變化。

此外,NSArrayController的名稱有點誤導 - 它不是'控制數組'。它確實用於控制與其他數據對象具有多對多關係的數據對象。這讓我想起...

2)KVC allows you to treat a to-many relationship作爲數組或集合將對象與其他對象之間,無論實際如何實現關係。它通過要求您實施方法fitting a naming convention,其中very closely match the primitive methods of arrays and sets。當您撥打mutableArrayValueForKey:mutableSetValueForKey:時,符合KVC的對象將返回代理陣列或設置,這會將這些方法作爲陣列公開。粗略地說,這就是NSArrayController如何知道要調用什麼--- KVC在數組的原始對象與其從密鑰生成的鬃毛對象之間進行映射。既然你不想使用數組作爲你的數據對象,那麼能夠將任何多對多關係視爲僅僅是一個普通的集合,通常是非常有用的。

3)我認爲這與你在錯誤的地方處理撤銷有關。執行KVC-compliant methods以在您的數據對象中獲取/設置屬性,讓他們在設置數據的同時更新撤消管理器。您將需要一個特殊的方法讓管理員恢復更改,因爲您不想將撤銷記錄爲可撤銷記錄。或者你可以使用核心數據,並免費獲得所有這些東西...

+0

感謝您的回答。我剛剛開始閱讀關於Core Data的內容! – JPC 2011-06-15 15:20:46