2016-10-31 39 views
43

使用版本8.1的Xcode。無效的自動代碼重新生成生成NSManagedObject子類Swift 3

在.xcdatamodeld文件中創建一個名爲「MapRegionObject」的實體。 enter image description here

使用自動代碼生成器,單擊導航欄上的編輯器 - >創建NSManagedOject子類...

有兩個文件:MapRegionObject + CoreDataClass.swift和MapRegionObject + CoreDataProperties

誤差在兩個文件中顯示在屏幕截圖: MapRegionObject + CoreDataClass.swift enter image description here

MapRegionObject + CoreDataProperties enter image description here

請幫我修復這個bug,非常感謝!

+1

如果您使用自動代碼生成:類定義,你的實體對象,你不應該創建自己的NSManagedOject子類。 XCode已經在DerivedData中爲你創建了它。如果你想創建你自己的子類,請在你的實體上指定另一個codegen。 檢查這塊主板:http://stackoverflow.com/questions/37905456/subclassing-nsmanagedobject-with-swift-3-and-xcode-8-beta –

回答

109

在Xcode中8.1,您使用自動代碼生成器在數據模型中選擇實體之前:

Entity

然後到數據模型Inspector選項卡:

Data Model Inspector

在「代碼生成」選擇「手動/節點」

之後,你可以創建一個NSManagedObject子類沒有錯誤。

或者,如果您已經使用過「類定義」,則可以進入現有的.xcdatamodeld文件,並將所有當前實體設置爲Codegen下的「手動/無」。確保保存您的項目(文件 - >保存),刪除您現有的派生數據,清理項目,然後構建。爲我解決了這個問題,而無需重新制作我的整個模型。

+5

如果您已經創建下選擇與'Class Definition'類'Codegen'並得到這個錯誤,首先刪除你的.xcdatamodeld文件並重新創建它。然後在'Codegen'下設置'Manual/None'並使用自動代碼生成器。 –

+10

或者,如果你已經使用「類定義」,你可以進入現有.xcdatamodeld文件,並設置所有當前實體代碼生成下的「手動/無」。確保保存你的項目(文件 - >保存),刪除你現有的派生數據,清理項目,然後構建。爲我解決了這個問題,而無需重新制作我的整個模型。 – DJB

+0

非常感謝! – coolcool1994

16

我發現這件事很混亂。您確實需要了解CoreData中的新增功能。基本上,默認情況下,在一個名爲「DerivedData」的地方爲您自動生成類和擴展名,這些地方被隱藏在代碼源之外的這些類及其擴展所在的位置。就我個人而言,無法打開並查看它們對我來說很奇怪,但有些東西可以使用它。

基本上,如果在CoreData模型中有一個名爲「AppSettings」的實體,您可以直接使用它,而無需親自生成代碼。如果您想要項目中的代碼,則將實體上的Codegen屬性設置爲Manual/None。然後做你以前做的事情:編輯器 - >創建NSManagedObject類等。這些文件將在您的項目中結束。

好消息是,如果您想製作自定義擴展名,只需在您的項目中進行。Xcode會將生成的文件從項目目錄外的其他位置混合到項目目錄中的文件中。

+0

謝謝,得票最多的答案固定我的問題,但這個解釋爲什麼它被擺在首位發生。現在我不需要擔心這個問題,或者需要在更改對象時不斷重新生成對象。 – robhasacamera

2

關閉該項目,並按照以下說明:

  1. 取景器中顯示數據庫.xcdatamodeld文件。
  2. on .xcdatamodeld file右鍵單擊 - >顯示包裝內容,如果(.xcdatamodel)在包裝中再次找到,請右鍵單擊並選擇「顯示包裝內容」。你應該得到'內容'文件。
  3. 在文本編輯中打開「內容」。
  4. Command-F(codeGenerationType =「class」)並將所有匹配字符串替換爲空字符串。

保存並再次打開Xcode項目。一切都應該很好。

+1

這不起作用。你的方法背後的任何理由。 –

+0

同意理由會有幫助。這對於一個同事來說很有效,所以想要明確地知道它在做什麼。 – dbreaux

2

問題是,您不需要手動生成NSManagedObjectModel子類。 REF:https://forums.developer.apple.com/thread/48988

Xcode中自動生成的類或類擴展爲 實體和屬性的核心數據的數據模型。自動代碼 每個實體都啓用和禁用代碼,並且使用Xcode 8文件 格式爲新模型中的所有實體啓用 。此功能可用於任何已升級到Xcode 8格式的數據模型 。您可以指定Xcode是否使用數據模型的文件 inspector爲數據模型生成 Swift或Objective-C代碼。爲實體啓用自動代碼生成時,Xcode將爲實體創建一個類或類擴展名 ,該實體的檢查器中指定:使用指定的類名稱 並將源放置在項目的派生數據中。對於 Swift和Objective-C,這些類都可以從 項目的代碼直接使用。對於Objective-C,爲模型中的所有生成實體創建一個附加頭文件 :文件名符合命名約定'DataModelName + CoreDataModel.h'的 。

1

不要在此和Xcode打,除非你真的需要更改生成的屬性,這樣做只會讓你感到沮喪。

將自動生成的類視爲應用程序中的任何其他類。如果您需要爲託管對象類添加功能,只需將您的類定義更改爲擴展名並擴展您的對象。

改變你的類:

class MyManagedObject : NSManagedObject { /* implementation*/ } 

到分機:

extension MyManagedObject { /* implementation */ } 
2

在Xcode中8.2.1,菜單 - 產品 - 乾淨,而且每一個是確定的,它是如此目前Verid 。

7

1)清理項目(CMD +移+ K)

2)在 「數據模型檢查器」 爲每創建的實體設置爲類屬性,正如在下面的截圖

screenshot

3)再次生成代碼(編輯器 - >創建NSManagedObject子類)

之後,一切都應該正常工作。