読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【Xcode, Objective-C】メインバンドルの下にディレクトリーを作り中のファイルにアクセスする方法

Xcode Objective-C

.plistファイルなどのリソースファイルが増えてきて見た目にもプログラム的にも整理したくなってきました。
見た目に整理するだけならXcodeで適当にフォルダーを作ってファイルをぶち込めばいいのですが、それだとプログラムから見たときにはメインバンドル上にフラットに配置されてしまうようです。

プログラムから見てもサブフォルダー(サブディレクトリー)内にファイルを配置したいときは次の方法でフォルダーをXcodeにコピーします。

1. コピーしたいフォルダーをXcodeにドラッグ&ドロップする
f:id:takujidev:20131208124903p:plain
2. Copy items into destination group's folder (if needed)をチェック、Create folder references for any added foldersを選択してFinishボタンを押す
f:id:takujidev:20131208124944j:plain
以上で終了です。通常のフォルダーは黄色ですが、このようにして作ったフォルダーは青色になります。
f:id:takujidev:20131208125053j:plain:w300
追記:Xcode上の青色のフォルダーに対しFinderからドラッグドロップでファイルを追加したりすることはできません。Xcodeの青いフォルダーが参照しているフォルダー実体に対し、Finderでドラッグドロップしたりします。
上の例の場合はmotionというフォルダーがプロジェクトフォルダーのResourcesの下に作成されますので、その内容を更新すればXcodeの青いフォルダー内の表示がフォルダー実体の内容に合わせ自動的に更新されまます。注)ステップ1.でドラッグドロップした元のmotionフォルダーはコピーされるだけなのでXcodeとは無関係です。

例えば、メインバンドルの下にmotionというサブディレクトリーを作り、その中にある複数の.plistファイルのデータからレコードを順に読んで行くプログラムはこんな感じになります。

        NSBundle* bundle = [NSBundle mainBundle];
        NSArray* paths = [bundle pathsForResourcesOfType:@"plist" inDirectory:@"motion"];
        NSAssert(paths.count != 0, @"No motion data file found");
        
        for (NSString* path in paths) {
            NSArray* data = [NSArray arrayWithContentsOfFile:path];
            for (int i = 0; i < data.count; i++) {
                NSDictionary* record = [data objectAtIndex:i];
            }
        }