2012-01-22 1 views
1

私は、TabBarControllerに5つのタブを持つアプリケーションを持っています。簡単にするために、タブA、B、C、D、Eであると言うことができます。各タブは、ナビゲーションコントローラに埋め込まれたTableViewControllerにユーザを連れて行きます。各タブには固有の.hと.mファイルもあります。大部分のコードは、5つのタブ間で非常に似ています。私はこの5つのクラスファイルを取り除き、1つのセットだけを使いたいと思っています。これにより、アプリケーションを変更するのがはるかに簡単になります(5か所ではなく1か所で)。単一の実装ファイルでどのタブが選択されたかを検出するにはどうすればよいですか?いったん私は、特定のタブが選択されたテーブルビューを具体的にレンダリングするロジックを置くことができることを知った...TabViewController内からTabBarControllerでどのタブが選択されたかを検出する - コードの再利用

私が言及すべきもう一つのことは、TableViewControllerで選択したタブを検出する必要があるということです。 TabBarControllerはアプリケーションのエントリポイントで、私はTabBarControllerサブクラスを持っていません。

私はこのコードをTableViewControllerで試しましたが、アクセスしたり使用したりしませんでした。

@interface MyController : UITableViewController <UITabBarDelegate> 

の.mファイルに:

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item 
{ 
    //NSLog(@"selectedIndex: %d", self.tabBarController.selectedIndex); 

    NSLog(@"didSelectItem: %d", item.tag); 
} 
+0

同様のコードをクラスに入れて、A、B、C、D、E VCの5回サブクラス化してみてください。 –

答えて

3

簡単に解決策があります。

tabBarController

タブバーコントローラである親や祖先。 (読み取り専用)

@property(読み取り専用非アトミック、保持)UITabBarController * tabBarController

議論受信機がタブバーコントローラに追加された場合、このプロパティは、タブバーコントローラです。受信者の ナビゲーションコントローラがタブバーコントローラに追加されている場合、このプロパティ はナビゲーションコントローラのタブバーコントローラです。タブバーが表示されていない場合は、 、受信者はモーダル表示です。このプロパティはnilです。

つまり、タブバーコントローラに追加するviewControllerは、このプロパティがシステムによって設定されています。

次にタブの希望のビューコントローラで使用すると、コメントに照らしてviewWillAppear

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    NSUInteger selectedIndex = self.tabBarController.selectedIndex; 
    switch (selectedIndex) { 
     case 0: 
      //configure me 
      break; 
     case 1: 
      //configure me differently!! 
      break; 

     default: 
      break; 
    } 
}  

を実装tabBarControllerのこの特性は、信頼性ではないようです。

あなたが言う問題は、サブクラス化によって解決できるもののように思えます。それぞれのタブと共通のコード用のUIViewControllerのサブクラスを作成し、各タブのサブクラスをサブクラス化してviewControllerのタブを変更します。

また、同じタブで異なるxibを持つ各タブを読み込むこともできます。インターフェース・ビルダーの「ユーザー定義の実行時属性」セクションで、View Controllerのプロパティーを設定できます。次に、viewWillAppearブロックで、そのインスタンスのxibによって設定されたプロパティをチェックします。

+0

OK!私たちはほとんどそこにいると思うが、一つの問題がある。私はこのコードをViewWillAppearに持っています: 'NSUInteger selectedIndex = self.tabBarController.selectedIndex; NSLog(@ "選択されたインデックス:%d"、selectedIndex); '私は、インデックスを一貫していないアプリケーションを実行します。例:アプリケーションが読み込まれ、タブAはデバッガで 'Selected Index:0'を表示し、タブBをクリックすると' Selected Index:1'、タブCは 'Selected Index:2'を表示し、タブAをクリックすると' Index:2'、タブBは 'Selected Index:0'と表示します。これは非常に奇妙です!助言がありますか? – ElasticThoughts

+0

更新 - プロパティを追加するのを忘れてしまった!今、私はこのファイルを.hファイル '@property(nonatomic、readonly、retain)UITabBarController * tabBarController;'と.mファイルの前のコメントのコードに入れています。結果は各タブの 'Selected Index:0'の出力となります - 言い換えれば、それらはすべてプロダクトa 0 ...任意の提案? – ElasticThoughts

+0

Hmmm。これは、タブ・バー・コントローラーの選択が変更される前にビューが表示されるという競合状態に見えます。私はこれもデバイス上で発生することを確認しました。初めて正しく動作するので(おそらく最初にクラスを設定する必要があるだけです)、BOOLを保存して前に設定が完了しているかどうかを確認できます。 – jackslash

0

私が正しくあなたを理解している場合、あなたは多くの選択肢があります.hファイルで


- あなたはinitメソッドをオーバーライドすることもできますあなたのmファイルでは、UITableViewCOntrollerを初期化し、どのタブに応じてそれに追加のパラメータを渡します。

  • このクラスには、tabidプロパティを追加して、各タブ(タブが表示されていることを示すもの)にプロパティを設定することもできます。

  • あなたはマットも通知を使用する(ただし、使用しない正当な理由がない限り、それは文句を言わない、最も簡単または最善の解決策になる最初の2)

  • 私は他の方法がたくさんあると確信しています。

+0

Ali、はいtabIdやtabNameを追跡するためのプロパティを作成することを考えていましたが、タブ名を「キャプチャ」する方法がわかりません...コード例を私に提供できますか?前もって感謝します! – ElasticThoughts

関連する問題