2012-05-04 11 views
4

私のアプリケーション(ストーリーボードベース)全体で特定のサブビューを再利用するために、サブビューをペン先として構築し、ロードします。私は次のことを行っています:ストーリーボードでxibをインスタンス化するときのinitWithCoderへの無限再帰呼び出し

私はウィジェットと呼べるUIViewサブクラスを持っています。対応するxibファイルを作成し、File ownerプロパティを新しいサブクラスに設定し、IBOutletsを接続します。

次に、私のストーリーボードでは、ビューコントローラーの内部にuiviewがあり、作成したウィジェットクラスにクラスを設定しました。

ウィジェットクラスの中で、私はinitWithCoderをオーバーライドし、次のようにそこにペン先を読み込む:

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

アプリは、この時点でクラッシュし、ここにブレークポイントを設定するとinitWithCoderがオーバーと呼ばれていたことを明らかにしましたそしてもう一度。

この状況でペン先を使用する方法が2つ混じっているようですが、どこが間違っているのか不明です。私は必要に応じてスタックトレースをスローすることができますが、基本的に同じ関数へのネストされた呼び出しは無限です。

答えて

17

.xibファイルのビューの「カスタムクラス」を「ウィジェット」に設定したことがありますか? initWithCoder:はXIBからロードされたすべてのものの初期化子であるので、あなたが見ている動作を説明するだろう

、:

  1. あなたの親ビュー、ウィジェットオブジェクトを含む、XIBからロードされ
  2. ウィジェットのinitWithCoder:メソッドが呼び出され、ウィジェットXIB
  3. ウィジェットXIBカスタム クラスの「ウィジェット」とUIViewが含まれてロードしようとしますので、もう一度、ウィジェットオブジェクトが で初期化されていますなど

これが本当の場合は、ウィジェットのxibのUIViewの[カスタムクラス]エントリを削除するだけです。

+0

カスタムクラス値を削除した場合、IBOutletsとIBActionsを使用することはできません。 – nano

+0

@nanoもちろん、カスタムクラスをビューに使用できます。あなたはちょうど再帰を防ぐ必要があります。 –

+0

xibから「Custom Class」を削除せずに再帰を防ぐ最良の方法は? – Jaro

2

同じ問題がありました。私の間違いは空のFile's Ownerクラスにありました。 File's Ownerのカスタムクラスでは、空ではない(ウィジェット)必要があり、ルートビューは空でなければなりません。

IBActionsとIBOutletsは問題ありませんでした。

関連する問題