我的應用程序的主要功能是安排對象的情節。整個事情基於核心數據,並且圖上的每個對象都由一個實體表示。對於這個例子,該實體將是「單元」,NSManagedObject的自定義子類。使NSUndoManager忽略一個NSManagedObject的屬性
當陰謀被打開,每個單元得到一個UnitViewController創建的,其志願,觀察更改單位的性質,如.positionX,.positionY和.angle。觸摸UnitViewController檢測到的手勢修改Unit對象,並且該視圖在觀察它們時通過移動來響應。這允許在沒有額外代碼的情況下輕鬆實現撤銷和重做,在數據庫更改時,單位會自行移動。
單元被刪除時出現問題。
單元具有的一個屬性是.viewController,它指向鏈接到它的UnitViewController。這是一個短暫的財產,因爲顯然我不需要它堅持;每當我打開劇情時,我都會重新創建它。 (UnitViewController有一個屬性.object,它指向它的Unit;本質上是一個反轉屬性。)問題是,當我撤銷刪除或重做撤銷創建時,Core Data嘗試恢復.viewController屬性,但該UnitViewController對象已被釋放。我得到一個EXC_BAD_ACCESS,直到我啓用了殭屍,這給了我這樣的:
*** -[UnitViewController retain]: message sent to deallocated instance 0x18365780
所以我的問題是:我怎麼能得到NSUndoManager完全忽略該屬性?我試着關閉撤銷登記修改之前,甚至在單位+ LD.m重寫setter方法(我的Unit.m範疇,它是NSManagedObject子類)的點:
- (void)setViewController:(UnitViewController *)viewController
{
[self.managedObjectContext.undoManager disableUndoRegistration];
[self willChangeValueForKey:@"viewController"];
[self setPrimitiveValue:viewController forKey:@"viewController"];
[self didChangeValueForKey:@"viewController"];
[self.managedObjectContext.undoManager enableUndoRegistration];
}
但但是,當我撤銷刪除時,它會嘗試恢復.viewController。任何人處理過這樣的事情?有沒有更好的方法來解決這個問題?
給你的託管對象引用視圖控制器是很奇怪的,爲什麼這是必要的?通常情況下,視圖控制器會持有對它所處理的模型對象的引用,但反向連接是非常不尋常的。 –
這對我來說似乎有點奇怪,但它允許我在執行某些操作時很快地將消息發送到視圖控制器。視圖控制器都相互交流了很多,通過使用.viewController屬性,我使他們能夠非常有效地相互交流。 我也可以執行基於核心數據獲取結果的操作,該結果返回管理對象集合,而不是枚舉我的工作空間的所有childViewController並檢查它們是否符合某些條件。 –
不過,缺點顯然超過了好處。您可以使用指向活動對象和視圖控制器的指針來保存簡單的集合(例如字典)。這不應該比你的解決方案複雜得多,這是有問題的。 – Mundi