0

タブが選択され、現在のタブがアンロードされ、次のタブがロードされて一度に1つだけがロードされるようにするには、どうすればよいですか?それとも私もこれをすべきではありませんか?ルートVCとして通常のUIViewControllerを使用してそれを行う方法は知っていますが、UITabBarControllerを使用してそれを行う方法はわかりません。また、あるタブから次のタブへの遷移をアニメーション化する方法はありますか?何か助けはありますか?ありがとう!!

編集:...ビューコントローラーをアンロードすると、タブバーのアイコンが消えます...ビューをアンロードするだけかもしれません。

4

6 に答える 6

3

両方の質問に 1 つずつ答えることができます...

UITabBarController デリゲートとして機能するクラスが必要なだけで、次のようなメソッドを実装できます。

// Animate tab selections so they fade in and fade out
-(void)tabBarController:(UITabBarController*)tbc didSelectViewController:(UIViewController*)newSelection
{
    [UIView beginAnimations:@"TabFadeIn" context:nil];
    [UIView setAnimationDuration:0.6];
    for( UIViewController* vc in tbc.viewControllers )
        vc.view.alpha = (vc==newSelection) ? 1 : 0;
    [UIView commitAnimations];  
}

私のコードは単にタブバーをフェードインおよびフェードアウトさせるだけですが、ここで未使用のタブをアンロードすることもできます。一部のタブが大量のメモリを使用する場合、これは良い考えです。

于 2009-08-13T20:23:13.433 に答える
1

残念ながら UITabBarController を実際に管理することはできないため、遅延読み込みを行うことはできません。あなたはあなた自身のTabBarを管理することでできますが、あなたはすでにそれを知っていると言いました.

独自のタブ バーを管理するには、ViewController でその TabBarItems を使用して UITabBar をセットアップし、TabBar Delegate プロトコル、主に -tabBar:didSelectItem: tabbarItem の選択が変更されるたびに呼び出されるメソッドを実装するだけです。新しいViewControllerをロードして他のものを解放できるアイテムID:編集:このコードはUIViewControllerに入る

  -(void)addTabBar{
    NSMutableArray* items=[[NSMutableArray alloc] init];
    UITabBarItem *eventsItem= [[UITabBarItem alloc] initWithTitle:@"Events" image:nil   tag:0];
    UITabBarItem *albumItems=[[UITabBarItem alloc] initWithTitle:@"Album" image:nil tag:1]; //the tag is how you tell what was clicked
    [items addObject:homeItem];
    [items addObject:albumItems];
      //MyTabBar is of type UITabBar
    myTabBar=[[UITabBar alloc] initWithFrame:CGRectMake(0,411,320,49)];
    [myTabBar setItems:items];
    myTabBar.delegate=self; //you gotta implement the UITabBar delegate protocol
    [myTabBar setSelectedItem:eventItem]; //set the selected item
    [homeItem release];
    [eventsItem release];
    [albumItems release];
    [items release];
   [self.view addSubview:myTabBar]
}

プロトコル メソッドは次のようになります - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item { if(item.tag == 0 ) { //このアイテムに関連する ViewController をロードして解放しますその他 } ...etc

}
于 2009-08-13T19:00:19.637 に答える
1

遅延読み込みは UITabBarController タスクではありません。代わりに、タブに関連付けられた viewControllers の責任です。

各 UIViewControllers に関連付けられた UIView を解放するには、TabBarItem を変更するたびに、UITabBarController.viewControllers プロパティに関連付けられた各 UIViewController サブクラスに次のメソッドを実装する必要があります。

-(void)viewDidDisappear {
[self.view removeFromSuperview];
self.view = nil;
}

明らかに、これにより UIViewController に関連付けられた self.view が削除されます。ただし、コードが十分にスマートな場合、これにより関連するすべてのオブジェクトが削除されます。たとえば、loadView メソッドが次のようになっているとします。

-(void)loadView {
UIView *contentVew = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.view = contentView;
…
...
UILabel *aLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,50)];
…
…
[contentView addSubview:aLabel];
[aLabel release];
…

[contentView release];
}

これは、contentView 内のすべてのオブジェクトとそのメモリの責任が contentView に要求され、解放されて self.view プロパティにアタッチされることを意味します。

このシナリオでは、self.view (contentView への参照) を削除すると、すべてのオブジェクトがドミノ スタイルで解放されます。これが目標です。

よろしくお願いします

于 2010-11-30T22:39:55.747 に答える
-1

UITabBarControllerは、すべてのViewControllerを遅延ロードします。タブが切り替えられると、そのビューはメモリ不足の状況で割り当てが解除される可能性があります。その後、2回目に選択されたときに再作成されます。さらに、メモリヒットのほとんどはビューにあり、ビューコントローラにはありません。したがって、ViewControllerからのメモリヒットについて心配する必要はありません。ビューは散文です。

OSのv3で実行している場合は、-viewDidUnloadメソッドを使用して、メモリを最大限に削減できます。

アンドリュー

于 2009-08-14T03:05:13.013 に答える
-1

なぜこれを行う必要があるのか​​ わかりませんが、メモリの問題が関係している場合、現在のタブはとにかくアンロードされます. それが -viewWillAppear、-viewDidUnload などの目的です。

于 2009-08-13T19:17:13.607 に答える
-1

現在、これを使用して、タブバーで非アクティブなView Controllerをアンロードしています(Kendallの回答に基づく)

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:  (UIViewController *)viewController {
    // reload all inactive view controllers in the tab bar
 for (UIViewController *vc in tabBarController.viewControllers) {
  if(vc != viewController)
   [vc didReceiveMemoryWarning];

} }

于 2010-12-13T05:05:38.617 に答える