NSBundle

NSBundle

Foundation - NSBundle

画像リソースを取り出す

Keywords: image resource

Cocoa における、画像リソースの取り扱いの話だ。Cocoa では、標準の画像リソースは TIFF なんだ。PICT じゃないぜ。Project Builder に、.tiff ファイルを加えると、自動的にリソースファイルとみなされる。Interface Builder の方には、自動的に現れるぜ。

さて、この加えた画像リソースを、プログラムの中で取り出すにはどうすればいいか?いちばん手っ取り早いのは、pathForImageResource: を使う方法だ。

Application Kit/NSImage.h

@interface NSBundle(NSBundleImageExtension)
- (NSString *)pathForImageResource:(NSString *)name;
@end

NSImage.h の中で拡張されているので、注意。これを使えば、画像ファイルの名前を指定すると、そいつへのパスが得られる。そこで NSImage の initByReferencingFile: を使って読み出してやればよろし。

NSBundle* mainBundle;
NSString* fileName;

mainBundle = [NSBundle mainBundle];

// リソースから画像を取得する
fileName = [mainBundle pathForImageResource:@"imageFileName"];
if(fileName) {
id image = [[NSImage alloc]
initByReferencingFile:fileName];
}

取り出した画像は、NSImage 型として使えるぜ。




Foundation - NSBundle

NSDictionary や NSArray 型のリソースを使う

Keywords: image resource

Cocoa には、NSDictionary や、NSArray といった Collection クラスがあるよな。これらの型を、リソースとして自由に読み書きできたら、便利だと思わないか?Property List を使えば、そんな感じのことができるぜ。Property List ってのは、ほら、アプリケーション・パッケージの中にある、Info.plist みたいなやつだ。アプリケーションの情報を表すだけじゃなくて、汎用のデータリソースとしても使えるんだ。

まず、データを作ろう!リソースとして登録するには、Property List の書式に従う必要がある。これは、XML フォーマットなんだ。素のテキストなので、手で書いてもいい。だけど、PorpertyList Editor を使った方が便利だ。これを使うと、GUI を使って Property List が編集できる。ちなみに、Property List に含めることができるデータ型は、Dictionary、Array、String、Data、Date、Number、Boolean だ。ここんとこ注意。Dictionary のデータを作りたいときは、Root を Dictionary に、Array のデータが欲しいときは、Root を Array に設定するんだ。

そうやって作ったリソースを、パッケージの中に入れてやると、NSBundle を使って取り出すことができる。まず、pathForResource:ofType: を使って、パスを取得する。そして、その中身を、Dictionary だったら NSDictionary の dictionaryWithContentsOfFile: を、Array だったら NSArray の arrayWithContentsOfFile を使えば、読み出して、インスタンスとして格納することができるんだ。

(sample)

NSBundle* mainBundle;
NSString* fileName;

mainBundle = [NSBundle mainBundle];

// リソースのパスを取得
fileName = [mainBundle pathForResource:@"sample"
    ofType:@"plist"];
if(fileName) {
  id dict = [NSDictionary dictionaryWithContentsOfFile:fileName];
}

上の例では、'sample.plist' っていうファイルに、Dictionary 型のデータが入ってる、っていうことを想定してるものなんだ。こういう感じで、Dictionary や Array のリソースを使えるぜ。



Foundation - NSBundle

.nib を名前と File's owner を指定して読み込む

Keywords: loadNibNamed:owner:

バンドルの中にある .nib を、File's owner を指定してプログラムから読み込みたいときは、loadNibNamed:owner: を使おう。NSNibLoading.h に定義してあるので注意。

Foundation/NSNibLoading.h

+ (BOOL)loadNibNamed:(NSString*)nibName owner:(id)owner;

クラスメソッドなんで、いきなり呼び出してオッケー。