web-dev-qa-db-ja.com

ストーリーボードを使用したカスタムビュー

複雑な画面(View Controller)では、全体を小さな断片に分割していました(ウィジェットと呼びます)。これらのウィジェットは基本的にMyWidget.hおよびMyWidget.mファイルとMyWidget.xibファイルで構成されます。ルート要素はUIViewで、MyWidgetクラスはUIViewのファイル所有者です。このウィジェットの初期化で、loadNibNamedを実行します。

次に、View Controllerで[[MyWidget alloc] init]を実行します。これは、ViewのControllerメインビューにサブビューとして追加します。これは、これまでのところ、完全に機能します。

私はストーリーボードで同じことをする方法を不思議に思っています。なぜなら、UIViewで実際にドラッグを開始することはできないため、常にUIViewControllerで開始する必要があるからです。

ストーリーボードでこれを行う方法がない場合、メイン画面とセグエにストーリーボードを使用し、別の.xibファイルを使用してカスタムビューを定義することにより、古い方法で単純に実行できますか?

96
znq

ウィジェット/ビューを別の.xibファイルに配置することは機能します。特に、複数のView Controllerから同じビューを参照する場合に適しています。

ただし、同じストーリーボード内で追加のビュー/ウィジェットを表示したい場合がありますが、それは可能です。方法は次のとおりです。

  1. IBでView Controllerを選択し(ビューの下の黒いバーをクリックします)、UIViewをオブジェクトライブラリから黒いバーにドラッグします。

    enter image description here

  2. ビューが黒いバーにある場合、それはIBの他のビューのようにインスタンス化されますが、コードでそうするまでビュー階層に追加されません。必要に応じて、独自のサブクラスに一致するようにビューのクラスを変更します。

    enter image description here

  3. 他のビューを接続するのと同じように、View Controllerに接続できます。 enter image description here

  4. 追加されたビューはドキュメントアウトラインに表示され、そこにアクションと参照をフックすることもできます。

    enter image description here


さて、残っている問題は、何度クリックまたはダブルクリックしようとしても、実際にビューを見ることができないということです。これにより、同じストーリーボードに入れるという目的全体が無効になります。幸いなことに、私が知っている2つの回避策があります。

最初の回避策は、ビューを黒いバーからView Controllerのビューにドラッグして戻し、編集し、完了したら黒いバーにドラッグして戻すことです。これは面倒ですが、信頼できます。

他の回避策はより細かいですが、すべてのビューを同時に表示できるため、私はそれを好みます:

  1. UITableViewをオブジェクトライブラリから新しく追加したビューにドラッグします。
  2. 次に、UITableViewCellをそのUITableViewにドラッグします。

    enter image description here

  3. これを行うと、ビューが魔法のように横に飛び出しますが、不要なUITableViewがあります。サイズを0x0に変更するか、削除してもUIViewは(通常)表示されたままになります。

  4. セカンダリビューがIBで再び非表示になる場合があります。 UITableViewを削除した場合、またはUITableViewがまだ階層にある場合は、UITableViewCellをクリックするだけで上記の手順を繰り返すことができ、ビューが再び表示されます。

2番目の方法はUIViewsでは機能しますが、UIToolbarsではあまりよくなく、UIButtonsでは不可能です。したがって、多くの異なるサブビューを含める必要があるときに見つけた最もクリーンなソリューションは、単一のセカンダリUIViewをコンテナーとしてビューコントローラーに接続することです表示されることはなく、すべてのセカンダリビューをそこに配置し、UITableViewCellトリックを使用してすべてを表示します。ダミーのUITableViewのサイズを0x0に変更して、見えないようにします。これがすべて一緒に見える様子のスクリーンショットです:

enter image description here

188
nioq

あなたのView Controllerを他の場所(ストーリーボードではなく)にしたいだけなら、これを達成するための非常に簡単な方法があります:

1)通常どおり、個々のCustomViewControllersでabcdControllers(試したコードのxib)を作成します。

2)UIViewController(またはCustomViewControllerのスーパークラスであったもの)をストーリーボードに追加します。

3)次に示すように、CustomClassをCustomViewControllerではなくUIViewControllerに設定します。

enter image description here

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.
}
11
tipycalFlow

Storyboardから特定のViewControllerのインスタンスを取得し、その上でビューを使用するには、このようなことを行うことができると思います。

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

お役に立てれば

ありがとうビジェイ

1
vijay_hrd