複雑な画面(View Controller)では、全体を小さな断片に分割していました(ウィジェットと呼びます)。これらのウィジェットは基本的にMyWidget.h
およびMyWidget.m
ファイルとMyWidget.xib
ファイルで構成されます。ルート要素はUIView
で、MyWidgetクラスはUIViewのファイル所有者です。このウィジェットの初期化で、loadNibNamed
を実行します。
次に、View Controllerで[[MyWidget alloc] init]
を実行します。これは、ViewのControllerメインビューにサブビューとして追加します。これは、これまでのところ、完全に機能します。
私はストーリーボードで同じことをする方法を不思議に思っています。なぜなら、UIView
で実際にドラッグを開始することはできないため、常にUIViewController
で開始する必要があるからです。
ストーリーボードでこれを行う方法がない場合、メイン画面とセグエにストーリーボードを使用し、別の.xibファイルを使用してカスタムビューを定義することにより、古い方法で単純に実行できますか?
ウィジェット/ビューを別の.xibファイルに配置することは機能します。特に、複数のView Controllerから同じビューを参照する場合に適しています。
ただし、同じストーリーボード内で追加のビュー/ウィジェットを表示したい場合がありますが、それは可能です。方法は次のとおりです。
IBでView Controllerを選択し(ビューの下の黒いバーをクリックします)、UIViewをオブジェクトライブラリから黒いバーにドラッグします。
ビューが黒いバーにある場合、それはIBの他のビューのようにインスタンス化されますが、コードでそうするまでビュー階層に追加されません。必要に応じて、独自のサブクラスに一致するようにビューのクラスを変更します。
他のビューを接続するのと同じように、View Controllerに接続できます。
追加されたビューはドキュメントアウトラインに表示され、そこにアクションと参照をフックすることもできます。
さて、残っている問題は、何度クリックまたはダブルクリックしようとしても、実際にビューを見ることができないということです。これにより、同じストーリーボードに入れるという目的全体が無効になります。幸いなことに、私が知っている2つの回避策があります。
最初の回避策は、ビューを黒いバーからView Controllerのビューにドラッグして戻し、編集し、完了したら黒いバーにドラッグして戻すことです。これは面倒ですが、信頼できます。
他の回避策はより細かいですが、すべてのビューを同時に表示できるため、私はそれを好みます:
次に、UITableViewCellをそのUITableViewにドラッグします。
これを行うと、ビューが魔法のように横に飛び出しますが、不要なUITableViewがあります。サイズを0x0に変更するか、削除してもUIViewは(通常)表示されたままになります。
2番目の方法はUIViewsでは機能しますが、UIToolbarsではあまりよくなく、UIButtonsでは不可能です。したがって、多くの異なるサブビューを含める必要があるときに見つけた最もクリーンなソリューションは、単一のセカンダリUIViewをコンテナーとしてビューコントローラーに接続することです表示されることはなく、すべてのセカンダリビューをそこに配置し、UITableViewCellトリックを使用してすべてを表示します。ダミーのUITableViewのサイズを0x0に変更して、見えないようにします。これがすべて一緒に見える様子のスクリーンショットです:
あなたのView Controllerを他の場所(ストーリーボードではなく)にしたいだけなら、これを達成するための非常に簡単な方法があります:
1)通常どおり、個々のCustomViewController
sでabcdController
s(試したコードのxib
)を作成します。
2)UIViewController
(またはCustomViewController
のスーパークラスであったもの)をストーリーボードに追加します。
3)次に示すように、CustomClassをCustomViewController
ではなくUIViewController
に設定します。
4)最後に、viewDidLoad
で、カスタムxib
をロードして完了です。
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
// Do any additional setup after loading the view from its nib.
}
Storyboardから特定のViewControllerのインスタンスを取得し、その上でビューを使用するには、このようなことを行うことができると思います。
ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.
お役に立てれば
ありがとうビジェイ