|
HMDT - Special Issue / Sketch BP / Sketch に見る書類の読み込み |
- Case Study -
Sketch に見る書類の読み込み
■ NSDocument で書類を読み込む今度は書類の読み込みの方だ。NSDocument を使って書類を読み込む場合は、次の 3 つのメソッドのどれかを使うんだ。
引数の type には、書類のタイプが渡されてくるんだ。Sketch では、loadDataRepresentation: を使っているよ。 ■ Property list 表現を NSDictionary にするNSDictionary に description メソッドを使うと、その property list 表現が得られたよね。じゃ、それを戻すには?NSString の propertyList を使う。
返って来る型は、property list によって異なるんだ。NSDictionary の property list なら、NSDictionary が返って来るよ。 ■ Sketch に見る書類の読み込みSketch で書類の読み込みをするクラスは、NSDocument を継承した SKTDrawDocument だ。 ◆ 書類から読み込むもの書類から読み込むものは、当然ながら、保存したものだ。Sketch で書類に保存したものは次の 3 つだ。
これらが NSDictionary の property list の形で保存されているんだ。これを読み込むことになる。 ◆ 読み込むときの流れ読み込みに使われるのは、SKTDrawDocument の loadDataRepresentation:ofType: だ。ここから始まって、その流れはこんな感じ。
で、オッケー。 ◆ 読み込むフォーマットをチェックする(loadDataRepresentation:ofTyp:)それじゃエントリである loadDataRepresentation:ofType: から見ていこうか。ここでは、まず、書類のタイプをチェックする。SKTDrawDocumentType だったら次に進むぞ。
SKTDrwaDocumentType だった場合には、data から NSDictionary を作る。それが drawDocumentDictionaryFromData: っていうメソッド。次はそこから SKTGaphic を取り出してやる。それが graphicsFromDrawDocumentDictionary: メソッド。 ◆ Property list 表現から NSDictionary を取り出す(drawDocumentDictionaryFromData:)メソッド drawDocumentDictionaryFromData: では、property list 表現を NSDictionary に戻しているんだ。
まず、data を ASCII の NSString にしてやる。そして、それに対して propertyList メソッドを呼んでやるんだ。これで NSDictionary に戻せる。 ◆ SKTGraphic の配列を取り出す(graphicsFromDrawDocumentDictionary:)次にやることは、NSDictionary から SKTGraphic を取り出すことだ。まず、SKTGraphic が入っている NSArray を取り出す必要がある。
SKTGraphicsListKey を key に使えば、SKTGraphic の NSArray を取り出すことができるんだ。この配列には SKTGraphic を表す NSDictionary が入っている。そいつらを、1 個づつ戻してやればいいんだ。 ◆ SKTGraphic を取り出す(graphicWithPropertyListRepresentation:、loadPropertyListRepresentation:)戻すには SKTGraphic の graphicWithPropertyListRepresentation: を使う。 その前に、1 つ考えておかなければいけないことがある。ある SKTGraphic を表している NSDictionary があったとしよう。でも、これは実際には、SKTGraphic のサブクラスが実体なんだ。たとえば、SKTRectangle とか、SKTCircle とか。その実体のインスタンスを作って、元に戻してやらないといけない。 どのサブクラスであるかを調べるにはどうするか?SKTClassKey を key として、値を取り出すんだ。
SKTClassKey には、クラスの名前が NSString 型で入っている。それから NSClassFromString() を使えば、Class 型を取り出すことができるんだ。そしたら、そいつのインスタンスを allocWithZone: で作ってやって、loadPropertyListRepresentation: で中身を読み込むんだ。
これは簡単だね。各 key ごとに値を読み込んで、インスタンス変数に代入していけばいいんだ。 ■ 違う手段による書類の読み込みもちろん、違う方法で書類を読み込む手段も、Cocoa は提供している。initWithCoder: を使う方法だ。
これを SKTGraphic 実装させる、っていう手もあるよね。 |
|
Home | Link | Download | Back Number | Speciall Issue
|