複数のViewControllerで使用したいUIViewがあるので、ビュー(.h/.m)とそのnibファイルを作成しました。ストーリーボードでは、ビューはビューコントローラにサブビューとして追加されますが、nibで定義されているようにレイアウトをロードしていません。
ストーリーボードのビューコントローラー内で使用されるUIViewのペン先をロードすることは可能ですか?
ストーリーボードを編集するときにInterfaceBuilderで.xibコンテンツを表示するについて尋ねると、それは不可能です。ただし、実行時にロードする必要がある場合は、可能。
@property (strong, nonatomic) IBOutlet UIView* view;
を追加し、ViewコンテナをInterface Builderからこのフィールドに接続します(Ctrl + Viewのクリックとドラッグ.hの上記のview
プロパティへの接続
- (void)awakeFromNib {
NSString* nibName = @"Place here your Nib name without extension";
if ([[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]) {
[self.view setFrame:[self bounds]];
[self addSubview:self.view];
}
}
それで全部です。 ストーリーボードシーンに表示を移動し、カスタムクラスをFooViewに変更し、View Controllerコードに.hをインポートして、-を使用します。 IBOutlets必要に応じて。
幸せなコーディングを
[〜#〜]編集[〜#〜]
awakeFromNib
documentation によると、awakeFromNib
ではそのようなコードを避ける必要があることに注意してください。
ファイルの所有者オブジェクトとそれに関連するnibファイルの間で1対1の対応を維持することをお勧めします。同じファイルのOwnerオブジェクトで2つのnibファイルをロードすると、そのオブジェクトのawakeFromNibメソッドが2回呼び出され、一部のデータ構造が望ましくない方法で再初期化される可能性があります。また、awakeFromNibメソッドの実装から他のnibファイルをロードしないようにすることをお勧めします。
ビューにViewInNib
という名前を付けると、次のようになります。
ストーリーボードで、placeholder
UIViewコンポーネントをViewControllerに配置し、クラスViewInNib
を設定してから、ViewInNib.m
に設定することを忘れないでください。
static BOOL isReplaced = NO;
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
if (!isReplaced)
{
isReplaced = YES;
ViewInNib *replaced = [[[NSBundle mainBundle] loadNibNamed:@"ViewInNib" owner:nil options:nil] lastObject];
replaced.frame = self.frame;
replaced.translatesAutoresizingMaskIntoConstraints = NO;
return replaced;
}
isReplaced = NO;
return self;
}
この方法では、ストーリーボードのビューからペン先からロードされた実際のビューを置き換えます。それが役に立てば幸い。
xXNibBridgeを使用します。
https://github.com/sunnyxx/XXNibBridge
使い方はとても簡単で、Swiftでも動作します。完全なクレジットは@sunnyxxに送られます