6

アプリケーション (ストーリーボード ベース) 全体で特定のサブビューを再利用するために、サブビューを nib として構築し、読み込むことにしました。これを行うには、次のことを行いました。

Widget と呼べる UIView サブクラスがあります。対応する xib ファイルを作成し、File owner プロパティを新しいサブクラスに設定し、IBOutlets を接続します。

次に、ストーリーボードで、View Controller 内に uiview を作成し、そのクラスを作成した Widget クラスに設定します。

ウィジェット クラス内で、initWithCoder をオーバーライドし、そこに nib を次のようにロードします。

-(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 つの方法を混ぜ合わせたように見えますが、どこが間違っていたのかは不明です。必要に応じてスタック トレースをスローすることもできますが、基本的には、同じ関数への無限のネストされた呼び出しです。

4

2 に答える 2

19

.xib ファイルでビューの「カスタム クラス」を「ウィジェット」に設定していませんか?

これはinitWithCoder:、xib から読み込まれたすべてのものの初期化子であるため、表示されている動作を説明します。

  1. Widget オブジェクトを含む親ビューは、xib から読み込まれます
  2. ウィジェットのinitWithCoder:メソッドが呼び出され、ウィジェット xib をロードしようとします。
  3. Widget xib にUIViewはカスタム クラス「Widget」を持つ が含まれているため、Widget オブジェクトは initWithCoder:などで初期化されています。

その場合は、ウィジェットの xib で UIView の「カスタム クラス」エントリを削除するだけです。

于 2012-05-04T22:27:40.313 に答える
3

私は同じ問題を抱えていました。私の間違いは、空の File's Owner クラスにありました。File's Owner カスタム クラスは空 (Widget) ではなく、ルート ビューは空である必要があります。

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

于 2016-03-30T07:06:14.693 に答える