4

私はUIViewをサブクラス化して、nibファイルからインターフェイスビルダーにドロップしたビューを読み込もうとしています。戻り行に次のエラーが表示されます。

キャッチされなかった例外'NSGenericException'が原因でアプリを終了しています、理由:'このコーダーでは、置き換えられたオブジェクトをinitWithCoderから返す必要があります:'

- (id)initWithCoder:(NSCoder *)aDecoder
{
    [super initWithCoder:aDecoder];
    NSArray *objects = [[NSBundle mainBundle]
                        loadNibNamed:@"MyView" 
                        owner:nil 
                        options:nil];
    if (self = [objects objectAtIndex:0])
    {
    }
    return [self retain];
}
4

2 に答える 2

14

あなたは非常に奇妙なことをしています)

loadNibNamed:owner:options:initWithCoder:xibからビューをインスタンス化するために呼び出します。loadNibNamed:owner:options:しかし、あなたはから呼び出していinitWithCoder:ます。無限再帰?

xibからビューをロードするには、次の操作を実行できます。

@implementation MyView

+ (MyView*) myView
{
  NSArray* array = [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil];
  return [array objectAtIndex:0]; // assume that MyView is the only object in the xib
}

@end
于 2010-11-05T21:07:49.400 に答える
0

そうするのではなくself = [objects objectAtIndex:0]、配列をループして、正しいオブジェクトを取得していることを確認する必要があります。次に例を示します。

for (id object in objects) {
    if ([object isKindOfClass:[YourClassName class]])
        self = (YourClassName*)object;
}   

そうは言っても、私は常にこれをレイヤーアップして、参照をから引き出してきましたUIViewController。ただし、ビューを使用したいだけのクラスは、Nibが何であるかを知る必要があるため、これは抽象化レイヤーを壊します。

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"MyView" bundle:nil];
YourClassName* view = (YourClassName*)vc.view;
[vc release];
于 2010-11-05T19:37:03.060 に答える