0

アプリのプロトタイピングを行っています。複数の.nibレイアウトファイルを用意して、友達がさまざまなレイアウトを試して、自分に最適なものを確認できるようにしたいと考えています。

既知の.nibファイルのハードコードされた配列を適​​切に切り替えるコードはすでにありますが、知識を全体的に広げたいので、バンドル内のすべての.nibファイルを見つけることができる一般的なシステムを書いてみようと思いました。新しい.nibレイアウトを追加する場合は、コードを変更する必要はありません。

特定のリソースのパスが実際にはフルパスであることがわかります。何かのようなもの:

/var/mobile/Applications/69B85DBB-3B79-43F0-B88E-FFFF/TestApp.app/en.lproj/some_asset.nib

フルパス名を使用して.nibをロードしようとしましたが、私が知る限り機能しません。動作しているように見える唯一のことは、パスと拡張子を取り除いて、リソース名にたどり着くことです。

もしそうなら、私は次のようになります:

NSArray *availableNibs = [[NSBundle mainBundle] pathsForResourcesOfType:@"nib"
                                                            inDirectory:nil];

// Just grab the first .nib as a test and remove the .nib extension
NSString *aNib = [availableNibs[0] stringByReplacingOccurrencesOfString:@".nib"
                                                             withString:@""];

// Start at the end of the string and find the first '/'
for (NSInteger index = [aNib length] - 1; index >= 0; --index) {
    if ([aNib characterAtIndex:index] == '/' ) {
        // Get us down to the resource name - return string starting after that '/'
        aNib = [aNib substringFromIndex:index + 1];
        break;
    }
}
// have resource name in 'aNib', so open
self.viewController = [[My_ViewController alloc] initWithNibName:aNib
                                                          bundle:nil];

たぶん私の期待は間違っていましたが、これは私が予想していたよりも不器用に思えますか?より少ないコードを使用して、リソース名を抽出する簡単な方法はありますか?

そして、一般的に、この種のことをしようとして私が知っているかもしれない他の落とし穴はありますか、それともこれはおおよそ正しいアプローチですか?

よろしくお願いします

4

1 に答える 1

2

試す

NSString *nibPath = availableNibs[0];
NSString *nibName = [[nibPath lastPathComponent] stringByDeletingPathExtension];
self.viewController = [[My_ViewController alloc] initWithNibName:nibName bundle:nil];
于 2012-10-29T03:19:22.540 に答える