2012-09-29 58 views
3

嗨我正在使用一個標籤欄的應用程序。如果用戶登錄,則標籤欄應該有5個選項卡,但如果用戶登出,則標籤欄應該只有3個。我在我的MainAppDelegate.m if語句看起來像這樣在那裏,如果用戶登錄或UID告訴不IOS標籤欄動態標籤

UIViewController *popular = [[[PopularViewController alloc] initWithNibName:@"PopularViewController" bundle:nil] autorelease]; 
UIViewController *upcoming = [[[UpcomingViewController alloc] initWithNibName:@"UpcomingViewController" bundle:nil] autorelease]; 
UIViewController *account = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease]; 
UIViewController *message = [[[MessageViewController alloc] initWithNibName:@"MessageViewController" bundle:nil] autorelease]; 
UIViewController *more = [[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil] autorelease]; 
self.tabBarController = [[[UITabBarController alloc] init] autorelease]; 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
if([prefs objectForKey:@"uid"]){ 
    self.tabBarController.viewControllers = @[popular, upcoming, account, message, more]; 
}else{ 
    self.tabBarController.viewControllers = @[popular, upcoming, more]; 
} 
self.window.rootViewController = self.tabBarController; 
[self.window makeKeyAndVisible]; 

當用戶登出我做它可以通過消除客戶帶我到三個選項卡下面和消息如果用戶在

NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]]; 
[tbViewControllers removeObjectAtIndex:2]; 
[tbViewControllers removeObjectAtIndex:2]; 
[self.tabBarController setViewControllers:tbViewControllers]; 

記錄現在更多的網頁上只應被看作是登錄,這樣,如果他們按他們被帶到一個新的視圖控制器登錄。如果他們成功登錄我做以下

回去標籤視圖

[[self presentingViewController] dismissModalViewControllerAnimated:YES]; 

然後在viewWillAppear中

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
if([prefs objectForKey:@"uid"]){ 
    NSMutableArray *tbViewControllers = [NSMutableArray arrayWithArray:[self.tabBarController viewControllers]]; 
    [tbViewControllers removeObjectAtIndex:2]; 
    UIViewController *account = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease]; 
    UIViewController *message = [[[MessageViewController alloc] initWithNibName:@"MessageViewController" bundle:nil] autorelease]; 
    UIViewController *more = [[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil] autorelease]; 
    [tbViewControllers addObject:account]; 
    [tbViewControllers addObject:message]; 
    [tbViewControllers addObject:more]; 
    [self.tabBarController setViewControllers:tbViewControllers]; 
} 

的問題是,他們更多的頁面已經這樣除去沉在對象上索引2將刪除更多頁面,從而導致應用程序崩潰,即使我看到5個選項卡顯示出來之前它崩潰。所以我的問題是我怎樣才能將兩個標籤添加到中間而不刪除更多的選項卡?

謝謝你的幫助!

回答

0

那麼我最終將代碼移動到viewWillAppear在第一個選項卡,然後當我需要刪除選項卡我設置所需的變量並跳轉到第一個選項卡編程,然後根據需要設置它,然後以編程方式我移回到最後一個甚至沒有實際顯示在手機上的標籤。

似乎有點兩輪牛車,但它的作品,我會繼續爲這個問題的開放,雖然現在看是否有更好的選擇,我相信有

0

如果你看一看this link,你可以找到示例代碼似乎是解決您的問題的正確途徑(在「運行時管理選項卡」下)。這是從,你需要給定鏈路信息的和平,這裏提供簡單:

...,消除在同一選項卡 響應於敲擊在特定的按鈕當前選定的選項卡的方法。該方法是由視圖控制器爲該選項卡實現的 。如果您想刪除不再需要的 標籤,您可以在自己的代碼中使用 類似的東西。例如,您可以使用它來刪除包含某些僅需要輸入一次的用戶特定數據的選項卡 。

- (IBAction)processUserInformation:(id)sender 
{ 
    // Call some app-specific method to validate the user data. 
    // If the custom method returns YES, remove the tab. 
    if ([self userDataIsValid]) 
    { 
     NSMutableArray* newArray = [NSMutableArray arrayWithArray:self.tabBarController.viewControllers]; 
     [newArray removeObject:self]; 

     [self.tabBarController setViewControllers:newArray animated:YES]; 
    } 
} 

還要注意(只是爲了回答完整性):

...如果要添加或者可能由 用戶看到的方式移除標籤,你可以動畫該選項卡使用setViewControllers:animated:方法更改爲 。

所以記住這一點,您可以創建您的登錄視圖控制器,並將其添加到標籤欄控制器。然後以編程方式選擇該登錄選項卡(並隱藏標籤欄本身),最後使用提供的方法添加/刪除所需的選項卡,並從其自己的視圖控制器中刪除登錄選項卡本身(如代碼所示)。

希望它有幫助;)

p.s.我沒有在代碼中驗證這一點...