2012-02-25 54 views
1

我有一個帶有6到7個選項卡的tabbar控制器,允許自定義(意味着用戶可以更改選項卡欄的顯示順序)。並且選項卡1,3,5,7要求用戶在查看視圖中的任何內容之前先登錄訪問權限。iOS - 在UITabBarControler最佳實踐中登錄視圖

我不知道如何識別哪個tabbar需要登錄訪問(我們可以創建@protocal或其他東西)。用戶登錄成功後。我不知道如何選擇用戶觸摸過的最後一個tabbar。

我使用的appdelegate在AppDelegate中

-(BOOL)tabBarController:(UITabBarController *)aTabBar shouldSelectViewController:(UIViewController *)viewController { 

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
BOOL hasValidLogin = [standardUserDefaults boolForKey:@"hasValidLogin"]; 


if (hasValidLogin == NO && /* I don't know to find a controller which requires login access*/) { 
    [LoginView showModal:viewController delegate:self]; 
    return NO; 
} 
return YES; 
} 

編譯標誌confiming到UITabBarControllerDelegate - 編譯標誌LoginDelegate方法 -

-(void)loginViewController:(LoginView *)loginViewController didLoginSuccess:NSString *)userName { 
NSLog((@"%s [Line %d] "), __func__, __LINE__); 
NSLog(@"userName = %@", userName); 

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
[standardUserDefaults setBool:YES forKey:@"hasValidLogin"]; 
[standardUserDefaults synchronize]; 


[self.tabBarController setSelected:/* How do i find the last touched tabbar*/]; 
} 

任何良好做法,配方和代碼片斷,你能不能告訴我是讚賞。

我正在閱讀亞光的iOS食譜。但我找不到與此相關的任何內容。

回答

0

關注UITabBarDelegate didSelectItem。跟蹤之前選擇的選項卡項目。如果用戶未通過身份驗證,請彈出您的身份驗證屏幕並選擇之前選擇的選項卡項目。這是一個例子。

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { 


switch (item.tag) { 

    case ME_TAB_BAR_TAG: 

     if ([AppHelper checkAuthentication]) { 

      [self showMe:YES]; 

     } else if (previousItem) { 

      [tabBar setSelectedItem:previousItem]; 

      return; 

     } 

     break; 

    case ITEMS_TAB_BAR_TAG: 

     [self showMe:NO]; 

     break; 

    case CREATE_TAB_BAR_TAG: 

     if ([AppHelper checkAuthentication]) { 

      [self createNewItem]; 

     } else if (previousItem) { 

      [tabBar setSelectedItem:previousItem]; 

      return; 

     } 

     break; 

} 

previousItem = item; 


} 
+0

謝謝彼得!這是否是這樣做的首選方式?有沒有其他方法可以讓我們做到這一點? – mohan 2012-03-02 05:48:01

+1

謝謝彼得!這是否是這樣做的首選方式?有沒有其他方法可以讓我們做到這一點?而當我試圖按照你描述的方式,我得到 - 「'NSInternalInconsistencyException',原因:'不允許更改由標籤欄控制器管理的標籤欄的代理。 ***第一次投擲時調用堆棧:「 – mohan 2012-03-02 05:57:08

+0

我遇到了同樣的問題。任何人都可以幫忙 – VvDPzZ 2012-11-02 07:51:00