23

NSAttributedString を Core Data SQL ストアに保存しようとしています。

プロパティを「変換可能」に設定しています。これはオプションであり、一時的またはインデックス付きではなく、値トランスフォーマー名はデフォルトの「NSKeyedUnarchiveFromData」に設定されています。.xcdatamodel で、.h にこれを持つマネージド オブジェクト クラスを生成します。

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

そしてこれは.mにあります:

@dynamic Text;

NSManagedObject の「.text」プロパティを調べて属性付きの文字列に設定し、完了したら次のようにします。

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

これにより、出力に次のエラーが発生します。

[NSCFType encodeWithCoder :]: 認識されないセレクターがインスタンス 0xc04edb0 に送信されました キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。

私はプロパティに保存しているもののクラスをチェックしましたが、それNSAttributedStringもチェックresponsesToSelector @selector(:)しましたが、これは true を返すので、これはエラーメッセージに反しているので非常に混乱していますか?

お知らせ下さい。

ありがとうジェームズ

4

7 に答える 7

6

Apple Developer Forumsをチェックしていたところ、この質問とほぼ同じスレッドが見つかりました。1 人がこれを実行しましたが、残念ながらコードを共有していませんでした。彼らが言ったのは次のことだけでした:

「コアデータでは、データベースに変換可能なものがあり、独自の NSVauleTransformer を使用しています。これはサブクラスでNSValueTransformerあり、データオブジェクトから属性付きの文字列を作成して返します。

したがって、準拠しPersistableAttributedStringているというクラスを作成しました。NSCodingこのクラスには、文字列と属性の配列があり、属性付き文字列を構築します。NSCoding準拠している可能性のあるテキスト属性のクラスも作成しました。一緒に文字列と属性はすべてNSCoding準拠しています。

クラスNSAttributedStringNSCoding準拠していますが、属性は準拠していません。それが問題です。」

それが役立つことを願っています。

于 2010-11-24T17:11:31.527 に答える
2

別のアイデアは、のカスタムクラスを作成し、NSAttributedStringどこか enumerateAttributesInRange:options:usingBlock:で文字列のすべての属性を取得してからNSDictionary、属性と範囲をコアデータに保存し、属性を取り除いた属性付き文字列を保存することです。

次に、文字列が再度読み込まれると、 を使用して、辞書にある属性を属性付き文字列に適用できますinitWithString:attributes:

于 2010-11-25T17:08:45.313 に答える
0

それはあなたに悲しみを与えているフォントです.CTDictionaryはNSCodingを実装するNSDictionaryに無料でブリッジされているので、うまくエンコードするはずです.

自分でフォントを処理する必要があるかもしれません:( -これはそれを行う厄介な方法です.

1) NSAttributedString を格納する代わりに、それを分割して、各コンポーネントを配列に入れます。

2) 配列を調べます - フォント ref が表示された場合は、このフォントを再作成するために必要な情報だけを保存する必要があります - CTFontCopyFontDescriptor 関数を見てください。これらすべてを NSDictionary に入れ、コアデータに問題なく保存する必要があります。

3) この配列をコア データに保存します。配列内のすべての項目が NSCoding に準拠していることを願っています。

...

文字列を再作成するには、coredata からロードするときに、フォント属性を表す NSDctionary が表示されている場合、fCTFontDescriptor を再作成し、そこからフォントを作成できるはずです。

次に、紐を元に戻します。

于 2010-11-24T15:36:45.830 に答える
-1

わかりました...良いものではありませんが、ある種の突破口...

属性付きの文字列を NSLog すると、そこに NSFont と NSParagraphStyle が含まれていることがわかります。これらはコードでは NSFont と NSParagraphStyle ではありませんが、段落スタイルの CTFontRef と CT 辞書です...これらは NS オブジェクトではありませんが、NSLog ではこれらとして出力されるため、オブジェクトで「encodeWithCoder」セレクターを実行できないのはそのためだと推測されます。

コード内で「NSFont;」を実行するだけです。コンパイラは「NSFont undeclared」と言っていますが、CT関数しかないので何ができますか?

私の同僚が上記のコメントで言ったように、「.text」プロパティを単に「NSAttrinutedString *string = [NSAttributedString alloc] initWithString:@"test"] に設定すると、問題なく保存され、必要なものからすべてのスタイリングを削除するとそれを保存することもできます!

コア データへのスタイリングを伴う NSATTRIBUTED 文字列の保存方法が必要です... いいえ?

どんなアイデアでも大歓迎です。

-JM

于 2010-11-24T15:18:13.310 に答える