5

こんにちは私はタブバーを使用するアプリに取り組んでいます。タブバーには、ユーザーがログインしている場合は5つのタブがありますが、ユーザーがログアウトしている場合は3つだけです。ifMainAppDelegate.mに"uid"、ユーザーがログインしているかどうかを示す次のようなステートメントがあります。

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];

ユーザーがログアウトすると、次の操作を行い、ユーザーがログインしている場合にのみ表示されるアカウントとメッセージを削除して、3つのタブに移動します。

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

これで、より多くのページにログインが表示されるので、を押すと、新しいViewControllerに移動してログインします。彼らが正常にログインした場合、私は次のことを行います。

タブビューに戻る

[[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つのタブが表示されていても、アプリがクラッシュすることです。だから私の質問は、より多くのタブを削除せずに2つのタブを中央に追加するにはどうすればよいですか?

助けてくれてありがとう!

4

2 に答える 2

0

さて、私はコードを最初のタブのviewWillAppearに移動し、タブを削除する必要があるときに必要な変数を設定し、プログラムで最初のタブにジャンプします。次に、必要に応じて設定し、プログラムでに戻ります。電話に実際には表示されない最後のタブ。

少しハッカーのようですが、うまくいきます。今のところ、この質問を開いたままにして、より良いオプションがあるかどうかを確認します。

于 2012-09-29T19:30:40.293 に答える
0

このリンクを見ると、問題を解決するための正しいパスと思われるサンプルコードが見つかります(「実行時のタブの管理」の下)。これは、必要な特定のリンクからの情報の平和であり、簡単にするためにここに提供されています。

...同じタブ内の特定のボタンのタップに応答して、現在選択されているタブを削除するメソッド。このメソッドは、タブのViewControllerによって実装されます。不要になったタブを削除したい場合は、独自のコードで同様のものを使用できます。たとえば、これを使用して、一度だけ入力する必要のあるユーザー固有のデータを含むタブを削除できます。

- (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:メソッドを使用してタブの変更をアニメーション化できます。

したがって、これを念頭に置いて、ログインビューコントローラを作成し、それをタブバーコントローラに追加することができます。次に、プログラムでそのログインタブを選択し(そしてタブバー自体を非表示にし)、最後に提示された方法などを使用して、必要なタブを追加/削除し、ログインタブ自体を独自のビューコントローラー内から削除します(コードを参照)。

それが役に立てば幸い ;)

psコードでこれを確認していません...

于 2013-06-14T17:28:51.330 に答える