1. ホーム
  2. objective-c

[解決済み] 複数のサブクラスで1つのストーリーボードuiviewcontrollerを使用する方法

2022-08-06 11:22:38

質問

例えば、以下のようなストーリーボードがあるとします。 UINavigationController を初期ビューコントローラーとして含むストーリーボードがあるとします。そのルートビューコントローラは UITableViewController のサブクラスであり、これは BasicViewController . これは IBAction があり、これはナビゲーションバーの右のナビゲーションボタンに接続されています。



そこから、私は追加のストーリーボードを作成することなく、他のビューのテンプレートとしてストーリーボードを使用したいと思います。これらのビューは全く同じインターフェイスを持ちますが、ルートビューコントローラがクラス SpecificViewController1SpecificViewController2 のサブクラスである BasicViewController .

これら2つのビューコントローラーは、同じ機能とインターフェイスを持ちますが IBAction メソッドを除いては、同じ機能とインターフェースを持っています。

以下のような感じでしょうか。

@interface BasicViewController : UITableViewController

@interface SpecificViewController1 : BasicViewController

@interface SpecificViewController2 : BasicViewController

というようなことができるでしょうか?

のストーリーボードをインスタンス化すればいいのでしょうか? BasicViewController をサブクラスとするルートビューコントローラが必要です。 SpecificViewController1SpecificViewController2 ?



ありがとうございます。

どのように解決するのですか?

素晴らしい質問ですが、残念ながらいい加減な回答しかできません。 UIStoryboardには、初期化時にストーリーボード内のオブジェクトの詳細で定義されたストーリーボードに関連するビューコントローラをオーバーライドできる初期化子が存在しないため、あなたが提案するようなことは現在不可能だと考えています。 ストーリボード内のすべてのUI要素がビューコントローラのプロパティにリンクアップされるのは、初期化時なのです。

デフォルトでは、ストーリーボードの定義で指定されたビューコントローラーで初期化されます。

ストーリーボードで作成した UI 要素を再利用する場合、ビューコントローラにイベントを伝えるために、それらを使用するビューコントローラのプロパティにリンクまたは関連付ける必要があります。

ストーリーボードレイアウトをコピーすることは、特に3つのビューで同様のデザインが必要な場合、それほど大きな問題ではありませんが、そうする場合、以前の関連付けがすべてクリアされていることを確認する必要があります。 ログ出力でKVOエラーメッセージとしてそれらを認識することができます。

あなたが取ることができるいくつかのアプローチ。

  • UI要素をUIViewに格納します - xibファイルで、あなたのベースクラスからそれをインスタンス化し、メインビューのサブビューとして追加します、典型的にはself.viewです。それから、ストーリーボードのレイアウトに、基本的に空白のビューコントローラを配置し、正しいビューコントローラサブクラスを割り当てて使用することができます。 それらはベースから継承されるので、そのビューを取得することになります。

  • コードでレイアウトを作成し、ベースのビューコントローラからそれをインストールします。明らかにこのアプローチはストーリーボードを使用する目的を破っていますが、あなたのケースでは行くべき方法であるかもしれません。 もし、アプリの他の部分にストーリーボードのアプローチの恩恵を受ける部分があるのなら、適切であれば、あちこちで逸脱してもかまいません。 この場合、上記のように、サブクラスを割り当てたバンクビューコントローラを使用し、ベースビューコントローラにUIをインストールさせるだけでしょう。

Appleがあなたの提案するような方法を考え出したらいいのですが、グラフィック要素がコントローラのサブクラスとあらかじめリンクされているという問題はまだ残っています。

良いお年をお迎えください お元気で