3

NSViewController を含むカスタム NSBundles をアップロードするプロジェクトを検討しています。私のメインプログラムでは、ロードされた後にバンドルを処理するためのこのコードがあります...

id principalClass = [loadedBundle principalClass];
id instance = [[principalClass alloc] init];
[localLabel setStringValue:[instance name]];
NSView *incomingView = [[instance viewController] view];
[localView addSubview:incomingView];
[localView display];

そして、バンドル内のプリンシパル クラスの init メソッドは次のようになります...

-(id) init {
    if(self = [super init]){
        name = @"My Plugin";
        viewController = [[ViewController alloc] initWithNibName:@"View" bundle:nil];
    }
    return self;
}

View.nib は bundles プロジェクトにある nib です。しかし、バンドルをロードするたびに、このエラーが発生します...

2010-05-27 09:11:18.423 PluginLoader[45032:a0f] という名前の nib が見つかりません: バンドル パスのビュー: (null) 2010-05-27 09:11:18.424 PluginLoader[45032:a0f] -[NSViewController loadView ] "View" nib をロードできませんでした。

[label setStringValue:[instance name]];行がラベル テキストを正しく設定しているので、すべてが接続されていることがわかります。さらに、バンドル内のすべてのクラスを取得してメイン アプリケーション プロジェクトにロードすると、すべてが期待どおりに機能します。バンドルで「ビュー」を正しく参照する方法について何か考えはありますか?

ありがとう!

4

2 に答える 2

2

メソッドでは、bundle パラメータにinit渡してはいけません。UIViewControllerのドキュメントにnilよると、渡すとメイン バンドル (アプリケーションのバンドル) で NIB ファイルが検索されますが、これは必要なものではありません。nil

次のような特殊なイニシャライザを使用して、回避できます。

- (id) initWithBundle:(NSBundle *)bundle {
    if(self = [super init]){
        name = @"My Plugin";
        viewController = [[ViewController alloc] initWithNibName:@"View" bundle:bundle];
    }
    return self;
}

そして、次のように使用します。

Class principalClass = [loadedBundle principalClass];
id instance = [[principalClass alloc] initWithBundle:loadedBundle];
于 2010-05-27T14:40:09.363 に答える
0

「View.xibはペン先です」? それはxibかnibのどちらかです。xib は nib ではありません。xib ファイルはインターフェイス ビルダーでのみ使用できます。展開アプリケーションでは、nib ファイルに変換する必要があります。それがibtoolがしていることです。Xcode は単に xib ファイルをコピーするだけではなく、ibtool を介してそれらを実行し、それらを nib ファイルに変換してから Resources フォルダーに配置します。

于 2010-05-27T14:37:18.777 に答える