1

我的應用程序的主要功能是安排對象的情節。整個事情基於核心數據,並且圖上的每個對象都由一個實體表示。對於這個例子,該實體將是「單元」,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。任何人處理過這樣的事情?有沒有更好的方法來解決這個問題?

+1

給你的託管對象引用視圖控制器是很奇怪的,爲什麼這是必要的?通常情況下,視圖控制器會持有對它所處理的模型對象的引用,但反向連接是非常不尋常的。 –

+0

這對我來說似乎有點奇怪,但它允許我在執行某些操作時很快地將消息發送到視圖控制器。視圖控制器都相互交流了很多,通過使用.viewController屬性,我使他們能夠非常有效地相互交流。 我也可以執行基於核心數據獲取結果的操作,該結果返回管理對象集合,而不是枚舉我的工作空間的所有childViewController並檢查它們是否符合某些條件。 –

+0

不過,缺點顯然超過了好處。您可以使用指向活動對象和視圖控制器的指針來保存簡單的集合(例如字典)。這不應該比你的解決方案複雜得多,這是有問題的。 – Mundi

回答

1

我最終提交支持票了蘋果,他們回來後立即用一個非常簡單的答案:覆蓋setter方法-setViewController:在Unit.m並使其空。 (或在單位+ LD.m,在我的情況,因爲我盡我所有的自定義的東西在一個類別,以避免當我更新我的數據模型來重新做。)

- (void)setViewController:(UnitViewController *)viewController { 

} 

我只設置屬性在代碼中幾次,而當我這樣做時,我只是使用-setPrimitiveValue:forKey:來代替。我仍然需要做一些測試來確保其他一切正常,但現在看來,它似乎像一種魅力。撤消管理器不會嘗試恢復該屬性,並且我不再發生崩潰。