2010-11-24 160 views
21

我想將NSAttributedString存儲到核心數據SQL存儲。存儲NSAttributedString核心數據

我把屬性設置爲「可變形」,它是可選的,它不是瞬態或索引,並且值轉換器名稱設置爲默認「NSKeyedUnarchiveFromData」。在.xcdatamodel併產生一個具有這種在.H管理對象類:

@property (nonatomic, retain) id Text; (I have tried changing id to NSAttributedString *Text) 

,這在.M:

​​

我看穿,並設置「的.text」屬性我的NSManagedObject的屬性串的就完成,當我做:

NSError *error = nil; 
[managedObjectContext save:&error]; 

這通過在輸出導致此錯誤:

[NSCFType encodeWithCoder:]: 無法識別的選擇發送到實例 0xc04edb0終止應用程序由於 未捕獲的異常 'NSInvalidArgumentException' 的,原因: '* - [NSCFType encodeWithCoder:]: 無法識別的選擇發送到實例 0xc04edb0'

我已經檢查了類我所存儲的財產,這是NSAttributedString也是我檢查responsesToSelector @selector(:)並且這是違背這個返回true,所以很迷茫到錯誤消息?

請指教。

感謝 詹姆斯

+0

我曾經這樣做過,但這是一個內存問題。嘗試使用NSZombieEnabled = YES – Alfonso 2010-11-24 11:30:45

+0

運行應用程序我們已經啓用了NSZombieEnabled。謝謝James – jodm 2010-11-24 11:33:21

+0

我是否需要有瞬態打勾?我在線上收到了衝突的消息? – jodm 2010-11-24 11:34:15

回答

6

我正在檢查蘋果開發者論壇,發現一個線程幾乎和這個問題完全一樣,一個人做了這個,但不幸的是沒有共享代碼。所有他們說的是以下幾點:。

「在覈心數據我有一個轉變的數據庫和我我們自己NSVauleTransformer這是NSValueTransformer一個子類,並從數據對象創建一個屬性串和背部

因此我創建了一個叫PersistableAttributedString的類,這個類是NSCoding compliant。這個類有一個字符串和一個屬性數組,並且構建了屬性字符串,我還爲可能的文本屬性創建了一個類,它們是NSCoding兼容。全部爲NSCoding兼容。

NSAttributedString也符合NSCoding,但屬性不是,這就是問題所在。「

希望這可能有幫助。

-1

OK ......有的那種突破的通過雖然不是一個好...

如果我們的NSLog的屬性串,然後我們可以看到在那裏有NSFont和NSParagraphStyle在。雖然這些代碼中不是NSFont和NSParagraphStyle,但它們是CTFontRef和段落樣式的CT字典......這些不是NS對象,雖然在NSLog中它們輸出爲這些,因此猜測這就是爲什麼我們不能執行「encodeWithCoder」選擇器在物體上。

如果在代碼中我們只是做「NSFont」;編譯器說「NSFont未聲明」,所以我們可以做什麼,因爲我們只有CT功能?

正如我的同事在上面的評論中所說,如果我們將「.text」屬性設置爲「NSAttrinutedString * string = [NSAttributedString alloc] initWithString:@」test「],它可以很好地保存,如果我們將所有樣式從我們希望一個保存它也可以!

必須有蓄光NSATTRIBUTED串式樣融入到核心數據的方式...... NO?

任何想法不勝感激。

-JM

0

這是給你悲傷的字體 - CTDictionary是免費橋接到NSDictionary,它實現NSCoding所以應該編碼罰款。

您可能需要處理的字體自己:( - 這裏是做這件事的蘇茨基方式

1)不是存儲NSAttributedString的,打破它,並把每一個它的組件集成到一個數組。

2)通過數組 - 如果看到字體引用,則必須存儲重新創建此字體所需的信息 - 查看CTFontCopyFontDescriptor函數,並使用CTFontDescriptorCopyAttribute函數讓字體屬性作爲字符串。把所有這些放到一個應該存儲在覈心數據中的NSDictionary中。

3)將這個數組存儲在覈心數據中 - 希望數組中的所有項都符合NSCoding,所以你應該沒問題。

...

要重新創建的字符串,當你從coredata加載,如果你看到一個NSDctionary代表字體屬性,你應該能夠重新創建fCTFontDescriptor,並從該字體。

然後,把你的弦放回去。

2

另一個想法是創建的NSAttributedString自定義類和地方使用enumerateAttributesInRange:options:usingBlock:來獲取字符串的所有屬性,然後保存NSDictionary與屬性和範圍,在以核心數據藏漢作爲剝奪它的屬性的屬性串。

然後,當再次加載字符串時,可以使用initWithString:attributes:將字典中的屬性應用於屬性字符串。

11

對於任何人遇到這個問題,我發現最簡單的解決方案:

在覈心數據添加一個屬性,我們稱之爲attributedText。然後將其類型定義爲Transformable。在創建.h文件後,將數據類型attributedTextNSDictionary更改爲NSAttributedString

現在您可以將NSAttributedString保存在覈心數據中,無需修改。

回顧它是那麼容易,因爲要:

myObject.attributedText 

將返回你NSAttributedString

希望這可以幫助別人。