「Programming」カテゴリーアーカイブ

環境設定ファイルを読む

と言っても自分の環境設定ファイルでは無く他のプログラムのです。自分ので有れば NSUSerDefaults で出来ますから。NSString で読み込んで propertyList で NSDictionary にセットしようとプログラムを書いて実行してみると、なんと NSString での読み込み時にエラーとなってしまいます。あれ〜?環境設定ファイルって普通の XML 形式じゃぁ無かったっけ??

調べる為にネットの海へダイブ、じゃ無くサーフィン。10.3 迄は普通のテキスト XML だったらしい、が 10.4 からバイナリ plist だそうな、ふーん。どうすれば良いの??

テキスト形式とバイナリ形式を相互に変換するコマンドが有るそうです。plutil これでバイナリ形式からテキスト形式にして読み込めば当初の目的が実現できる。ただ plutil はコマンドツールなので NSTask と NSPipe を使って plutil の出力を標準出力に指定して実行し NSPipe で標準出力設定した pipe から読み込む、っと。

実際に実行してみると、小さい環境設定ファイルだと NSTask の waitUntilExit で終わるのを待ってから読み込めるのですが、大きい環境設定ファイルだと何時まで経っても処理が帰って来ません。とりあえず waitUntilExit をしないで実行すると読めたんですが、正しくはどうするんだろう?

いい加減なQuickLookの作成方法

iPalmMemo 1.2.0 をリリースしたので、ちょっと気分を変えて以前少しだけ書いた QuickLook の作成方法を書いてみます。ただ、適当な作成方法なので雰囲気を知るくらいです。

Apple のドキュメントに Quick Look Programming と言うのが有りますが、私には読むのは無理なので適当にソースを見ながら作成します。大体サンプルとして Sketch と言うのが難しすぎます。記述自体は少ないのですが、元の Sketch のソースが膨大だし、そんなのを引っ張ってこられても「なんのこってすか?」状態になります。
まぁ愚痴はほどほどにして、まず Xcode で新規プロジェクトを作成します。タイプは「Standard Apple Plug-ins」の「Quick Look Plug-in」を指定します。

続きを読む いい加減なQuickLookの作成方法

NSTextView に画像などのファイルを貼り付ける

NSTextView に画像を貼り付ける方法。
まず貼り付けるファイルを元に NSFileWrapper を作成します。

NSFileWrapper *wrap = [[NSFileWrapper alloc] initWithPath:path];

で、これから NSTextAttachment を作成します。

NSTextAttachment *attachment = [[NSTextAttachment alloc] initWithFileWrapper:wrap];

さらに貼り付ける画像の為の NSAttributedString を作成します。

NSAttributedString *attachChar = [NSAttributedString attributedStringWithAttachment:attachment];

一文字の貼り付けるファイルの為の NSAttributedString が出来ました。
この attachChar を NSTextView から取り出した NSAttributedString の貼り付けたい位置に挿入しても良いですし、これから NSTextView にセットする NSAttributedString の何処かに挿入しても良いです。

【例】文字列の最初に貼り付けます
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:@”画像ファイル”];
[attrString beginEditing];
[attrString insertAttributedString:attachChar atIndex:0];
[attrString endEditing];

[[mTextView textStorage] setAttributedString:attrString];

NSComboBox

今回初めて NSComboBox を使ったのですが、値を取得するのにちょっと手こずってしまいました。例によって数が 24 個も有るので IB では設定せず(コピペすれば良いじゃぁ無いかと言う意見もありますが)プログラムから Delegate で設定したまでは良かったのです。選択した値を少し変更する必要が有るので NSComboBox を使ったので、その選択して変更した値を取得するには??メソッドを探してテストしてみても怒られるし。うーん、そうだ! NSComboBox もコントロールなので stringValue とかで良いかも、と思いテストすると、取得出来ました。まぁ情けないと言えばそうなんですが、index がゼロのオブジェクトの値を取得するのかも、とか思ってしまったのが敗因でした。

モーションの編集でコンパイル?

モーションの編集で「コンパイル」と言うボタンが有るのですが、不思議でした。単に設定した値を羅列するだけだと思っていたからです。実際一つのモーションで色々な姿勢を設定して繋いでそれらの値を出力するだけだと「コンパイル」と言うより「コンバート」の方が近い気がします。しかし、条件に依ってジャンプしたり分岐処理が発生します。と言う事はプログラムで自動的に無条件ジャンプや終了のコードを出力してやる必要が有ります。その為、どの姿勢にジャンプするのかは分かりますが自動で出力したコードの為の飛び先変更や無条件ジャンプの飛び先を探す必要が有ります。うーむ、これはコンパイラーやアセンブラなどで行う名前解決と似ているなぁと。ボタンも「コンパイル」で良かったんだなぁ、と。改めて思うのでした。
現在はこんな感じです。