2012-08-30 7 views
6

私はタブバーコントローラと同じタブの束を持っています。各タブは機能が異なりますが、UIはすべて同じです。ストーリーボードでは、1つのタブのフローとUIをデザインし、基本クラスを設定しました。その後、タブを作成すると、タブバーに追加する前にタイプキャストを試みましたが、機能しませんでした。 インスタンス化時にコードを使用してストーリーボードのカスタムクラスを変更します

は、ストーリーボードにビューコントローラがINDENTIFIED "TabViewは、" カスタムクラス "TabColor" TabColorでloadViewメソッドが呼び出されるしかし

TabRed *red = (TabRed *)[storyboard instantiateViewControllerWithIdentifier:@"TabView"]; 
TabBlue *blue = (TabBlue *)[storyboard instantiateViewControllerWithIdentifier:@"TabView"]; 

、ないTabRed/TabBlueがあります。期待

NSLog(@"%@", red) 

::私はそれ結果のNSLog場合も

はTabColorオブジェクトである

実際TabRed:TabColor

+0

Psh、初心者の質問:) –

+0

これは大きな質問です。いくつかのストーリーボードに存在するビューコントローラの既存のカップルの上にチュートリアルフローを作成する必要があるときに、私はあなたと同じことを考えていました。そう、はい、この質問+回答はストーリーボードにも適用されます。関連性:http://stackoverflow.com/questions/14111572/how-to-use-single-storyboard-uiviewcontroller-for-multiple-subclass – Jonny

答えて

6

TL; DR:

ストーリーボードとxibsはコレクションが含まれていますシリアライズされたオブジェクトのストーリーボードにクラスを指定すると、ストーリーボードをロードするときにそのクラスのインスタンスが取得されます。あなたが探している動作を得る方法は、ココア/ココアタッチで一般的な委任パターンを使用することです。あなたはそれに降りたときに

ロングバージョン

ストーリーボード、および同様XIB/nibファイルは、実際にエンコードされたオブジェクトのセットです。特定のビューがストーリーボード内のUICustomColorViewControllerであると指定すると、そのオブジェクトはそのクラスのインスタンスのシリアル化されたコピーとして表されます。ストーリーボードがロードされ、instantiateViewControllerWithIdentifier:が呼び出されると、ストーリーボードで指定されたクラスのインスタンスが作成され、返されます。この時点で、あなたは与えられたオブジェクトにこだわっていますが、あなたは運が出ていません。

さまざまなことをしたいように見えるので、その機能が委任を使用して別のクラスによって処理されるようにView Controllerを設計することができます。

2つのView Controller間で異なる機能を指定するためのプロトコルを作成します。

@protocol ThingDoerProtocol <NSObject> 
    -(void) doThing; 
@end 

あなたのViewControllerにデリゲートプロパティを追加します。その後、

@interface TabColor 
... 
@property (strong, nonatomic) thingDoerDelegate; 

そして、あなたの新しいオブジェクトがプロトコルを実装し、それらがしたい事をしています。

@implementation RedTabDoer 
    -(void) doThing { 
     NSLog(@"RedTab"); 
    } 
@end 

@implementation BlueTabDoer 
    -(void) doThing { 
     NSLog(@"BlueTab"); 
    } 
@end 

次に、ストーリーボードを読み込むときにこれらのオブジェクトを作成して接続します。

TabColor *red = [storyboard instantiateViewControllerWithIdentifier:@"TabView"]; 
red.thingDoerDelegate = [[RedTabDoer new] autorelease]; 

TabColor *blue = [storyboard instantiateViewControllerWithIdentifier:@"TabView"]; 
blue.thingDoerDelegate = [[BlueTabDoer new] autorelease]; 

これは、あなたは、コントローラのデリゲートスロットに割り当てられているオブジェクトの種類を変更することにより、ビューコントローラの機能をカスタマイズできるようにする必要があります。

+0

ありがとう!私はそれが連載されていたことを知らなかった、私はそれがコードを生成するようだったと仮定します。そして私はデリゲートをすることを考えましたが、代わりに各タブのために10回ペーストした私のストーリーボードをコピーします。それは混乱ですが、使用するコードが少なくて済みます。 –

+0

これを更新しました。私は実際に代理人を使って、MVCのアイデアを出しました。特定のデリゲートを取っている同じビューコントローラの複数のタブ。私のモデルはビヘイビアをデリゲートとして埋めました。 –

+0

これらの質問と回答は、設計原則では「継承上の合成」と呼ばれていますか? – darksider

3
TabRed *red = (TabRed *)[storyboard instantiateViewControllerWithIdentifier:@"TabView"]; 
TabBlue *blue = (TabBlue *)[storyboard instantiateViewControllerWithIdentifier:@"TabView"]; 

キャストは、それだけでコンパイラがこれらの値を解釈する方法を変更する(そして、あなたが他の場所で型を使用する場合文句からそれを停止する)、値を変更しません。したがって、​​をTabRed*にキャストすると、最初のポインタがTabRedインスタンスを指しているが、ポインタが参照するオブジェクトがTabRedのインスタンスに変換されていないように見せかけるようコンパイラに指示します。

waltflanaganの説明からわかるように、storyboardsと.xibファイルには実際のオブジェクトが含まれており、ファイルを作成するときに各オブジェクトの種類が決まります。実行時に変更することはできません。ただし、いくつかのビュー・コントローラーのそれぞれに同じビュー階層をロードさせることができます。これを行うためのコードを書く必要はありません。適切.xibでビューコントローラのように右側の種類ごとのビューコントローラのタイプを設定してください

IB tab controller

:ちょうどあなたのタブコントローラと各タブのView Controllerを含む.xibファイルを作成します各タブのために作成されます。

IB custom class field

は、これらのコントローラが使用するビュー階層が含まれている.xibファイルを指定するには、各ビューコントローラ用の「NIB名」フィールドを設定します。あなたは、各コントローラに同じ.xibファイルを指定する場合は、各コントローラは、これらのビューの独自のコピーをインスタンス化します:すべてのビューコントローラが持つよう

IB NIB Name setting

はあなたのビューコントローラの共通のスーパークラスで任意のIBOutletsを指定します同じ店舗。共通の.xibファイルの "File's Owner"のタイプとしてスーパークラスを指定して、IBが使用できるアウトレットを知るようにすることができます。ファイルの所有者は実際に.xibをロードするオブジェクトのプロキシです。したがって、ビューコントローラの1つ(たとえばTabRed)が共通ビュー.xibをロードすると、そのコントローラは.xibのビューが接続されているコントローラになります。 TabBlueに.xibがロードされると、のオブジェクトはビューに接続されています。のオブジェクトになります。

これは最初は混乱しているように見えるかもしれませんが、それを試してみてください。これを理解することは、.xibファイル(そしてストーリーボード)を理解するのに役立ちます。彼らはあなたが初心者のように見えるよりもはるかに少ない魔法ですが、一度それを得ると、よりクールに見えるでしょう。

+0

私はビューコントローラを動的に作成できるようにしたかったのです。正確に何が必要なのかは分かっていますが、単純なループで手動でペン先を作成する方が簡単です。ペン先のマルチビューコントローラーについてはわかりませんでした。 –

+0

私たちは、2つの.xibファイルについてのみ言及しています。つまり、タブコントローラーとそれが管理するビューコントローラーを含むメイン.xibと、ビューのコレクション用です。ストーリーボードは素晴らしいですが、これはあなたの問題に対するもっと簡単な解決策だと思います。コードでビューコントローラを作成したい場合は、これも問題ありませんが、ループはそれぞれ異なるクラスのインスタンスであるため、おそらく役に立ちません。 – Caleb

+1

これは数年後ですが、フォローアップのために、私はタブを動的に作成しました。私は1つのストーリーボードを持っています.1つのタブの全体の流れは約20種類のビューコントローラとカスタムセルとビューのためのもっと多くのxibです。私はデリゲート/データソースパターンと一緒に行きました。すばらしく働いています。ビジネス要件ではさらに多くのタブが必要でしたが、新しいデータソースと1行を作成して新しいタブとして追加するには数分かかりました。その後、フローが変わると、コピー貼り付けを心配するのではなく、ストーリーボードに1回変更するだけでした。 –

関連する問題