2

ここで、私が求めているものに到達しているように見えるいくつかの答えを見てきましたが、それらのどれも機能させることができません.

MyViewでレイアウトおよびスタイル設定されMyView.xib、IBOutlets にバインドされた少数の画像とテキスト フィールドを持つ UIView サブクラスMyView.(h|m)です。File's OwnerXIB には設定されていませんが、MyView は最上位オブジェクトのクラスです。実行時に、さまざまな MyView を を介して特定のビュー コントローラーに動的にロードしますNSBundle's loadNibNamed。すべてが順調に進みます。

しかし、別のビュー コントローラー がMyVCあり、設計時に MyView のいくつかのインスタンスを設定したいと考えています。MyVC.xib直感に従って、MyView と同じサイズの UIView オブジェクトを に配置し、その型を に設定しMyView、 に IBOutlet 宣言を追加MyVC.hし、接続をフックしました。

実行すると、MyVCno が表示されMyViewます。しかし、デバッグは接続が確立されたことを示し、ビューは実際にMyViewであり、MyView's awakeFromNib実行されます。MyVC's MyView背景を素敵な明るい赤に設定したので、階層の一番上にあると確信しています。では、悪魔はどこにいるのMyViewでしょう?

4

2 に答える 2

1

最も簡単な解決策はMyView、単一のサブビューを作成することです。これは、残りの子孫ビューのコンテナーです。MyVC.xibこれにより、 にあるものと にあるものとの間の単一の接点が得られMyView.xib、両方の xib のアウトレットを接続できます。

MyVC.xib、各プレースホルダ ビューのクラスを に設定しMyViewます。

MyView.xib、最上位ビューのクラスを に設定しUIViewます。File's Owner のクラスを に設定しMyViewます。MyViewで接続されていたコンセントが にあるMyView.xib場合は、最上位ビューにそれらのコンセントがなくなっているため、それらをファイルの所有者に再接続する必要があります。

で、最上位ビューをサブビューとして-[MyView initWithCoder:]ロードして追加します。MyView.xibテストされていない例:

+ (UINib *)nib {
    static dispatch_once_t once;
    static UINib *nib;
    dispatch_once(&once, ^{
        nib = [UINib nibWithNibName:NSStringFromClass(self) bundle:[NSBundle bundleForClass:self]];
    });
    return nib;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        NSArray *contents = [[self.class nib] instantiateWithOwner:self options:nil][0];
        UIView *containerView = contents[0];

        // Make sure the container view's size tracks my size.
        containerView.frame = self.bounds;
        containerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        self.autoresizesSubviews = YES;
        if ([self respondsToSelector:@selector(setTranslatesAutoresizingMaskIntoConstraints:)]) {
            self.translatesAutoresizingMaskIntoConstraints = YES;
            containerView.translatesAutoresizingMaskIntoConstraints = YES;
        }
        // If you're using autolayout in both xibs, you should probably create
        // constraints between self and containerView here.

        [self addSubview:containerView];
    }
    return self;
}

MyViewこれには、のアウトレットを のモノと のモノにMyVC.xib接続できるという効果がありMyView.xib、 の他のオブジェクトのアウトレットとMyVC.xibMyView.xibインスタンスに接続できますMyViewMyVC.xibただし、他のオブジェクトのアウトレットを他のオブジェクトに、MyView.xibまたはその逆に接続することはできません。

于 2013-03-20T21:40:31.760 に答える
0

ORIGINAL: initWithCoder をオーバーライドします。以下のコメントにあるように、悪い考えです。

新しい提案:

  • 現在の手法を使用して MyVC ビューを作成します (MyView インスタンスは基本的に空のビューになります)。

次に、MyVC の viewDidLoad: メソッドで:

  • ペン先を使用して、MyView のインスタンスごとに 1 つずつ、新しい MyView インスタンスを作成します。

  • フレームが適切に設定されていることを確認して、空の (つまり、プレースホルダー) MyViews のそれぞれを、作成したばかりのものに置き換えます (任意のプロパティ/ivar を設定し、'- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2 を使用します)。 ' サブビュー配列内の古いビューを新しいビューに置き換える)

于 2013-03-19T21:50:37.310 に答える