2012-01-22 36 views
1

我有一個應用程序,它有一個TabBarController上的5個選項卡。爲了簡單起見,我們可以說它們是Tab A,B,C,D和E.每個選項卡都會將用戶導入嵌入到導航控制器中的TableViewController。每個選項卡也有其自己特定的.h和.m文件。大部分代碼在5個選項卡之間非常相似。我想取消這5套類文件,只使用1套。這將使我更容易對應用程序進行更改(在1個地方而不是5個地方)。如何在單個實現文件中檢測選中哪個選項卡?一旦我知道我可以把邏輯到位來呈現特定於哪個選項卡被選中的表...檢測TabBarController從TableViewController中選擇哪個Tab - 代碼重用

我應該提到的另一件事是,我需要檢測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分類五次。 –

回答

3

簡單,您已經有了解決方案!

tabBarController

父母或祖先即一個標籤欄控制器。 (只讀)

@屬性(非原子,只讀,保留)的UITabBarController * tabBarController

討論如果接收器被添加到標籤欄控制器,該屬性是標籤欄控制器。如果將接收機的導航控制器 添加到標籤欄控制器,則此屬性 是導航控制器的標籤欄控制器。如果沒有標籤欄 存在或接收器是模態視圖,則此屬性爲零。

這意味着您添加到選項卡欄控制器的任何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。您可以在界面構建器的「用戶定義的運行時屬性」部分的視圖控制器中設置屬性。然後在viewWillAppear塊中檢查該實例上由xib設置的屬性。

+0

好!我認爲我們差不多有這個問題。我在ViewWillAppear中有這樣的代碼:'NSUInteger selectedIndex = self.tabBarController.selectedIndex; NSLog(@「Selected Index:%d」,selectedIndex);'當我運行應用程序時,索引不一致。例如:應用程序加載和選項卡A在調試器中顯示「選定索引:0」,單擊選項卡B顯示「選定索引:1」,選項卡C顯示「選定索引:2」,然後單擊選項卡A應顯示0但顯示「選定索引:2',Tab B然後顯示'Selected Index:0'等等......這很奇怪!有什麼建議麼? – ElasticThoughts

+0

更新 - 我忘了添加屬性!現在,我在.h文件'@property(nonatomic,readonly,retain)UITabBarController * tabBarController;'中創建了這個代碼,以及我之前在.m文件中評論的代碼。結果現在是每個選項卡的「Selected Index:0」的輸出 - 換句話說,它們都產生0 ...任何建議? – ElasticThoughts

+0

嗯。這看起來是一種競爭狀態,其中視圖被告知它會在標籤欄控制器的選擇改變之前出現。我已經證實,這也發生在設備上。由於第一次正確運行(大概你只需要第一次配置這個類),你可以存儲一個BOOL來查看你之前是否已經完成了設置。 – jackslash

0

如果我理解正確的,你有很多選擇:

在.h文件中


- 你可能要重寫init方法在你的m文件中,我想初始化一個UITableViewCOntroller並傳遞一個附加參數給它,這取決於你在哪個標籤中。

  • 您可能還想爲此課程添加一個tabid屬性,並設置當您爲每個選項卡(顯示您所在的選項卡)創建它時。

  • 你墊還使用通知(但它不會是最容易或最佳的解決方案,除非你有很好的理由不使用前兩個)

  • 我相信有很多其他的方法。

+0

阿里,是的,我正在想創建一個屬性來跟蹤tabId或tabName(不管),但是我不知道如何「捕獲」這個標籤名稱......你能夠提供給我一個代碼示例嗎?提前致謝! – ElasticThoughts

相關問題