2009-08-13 15 views
0

タブが選択されていて、現在のものがアンロードされ、次のものがロードされて一度に1つしかロードされないとき、どうすればいいですか?それとも私はこれをしないのですか?私はルートVCとして、通常のUIViewControllerでそれを行うが、UITabBarControllerではわからない方法を知っている。また、あるタブから次のタブへの遷移をアニメーション化する方法はありますか?どんな助け?ありがとう!!iPhoneデベロッパー - Tab Barアプリケーションの読み込みが遅い

編集:私はビューコントローラをアンロードする場合は...、その後、タブバー上のアイコンは、多分私はちょうど自分の意見をアンロードします...なくなっている...

答えて

1

あなたが本当にunfortunaly UITabBarControllerを管理カントあなたは怠惰な読み込みを行うことはできません。あなた自身のTabBarを管理することで可能ですが、あなたはあなたがしなければならないのは、TabControllerのTabBarItemsを使ってUITabBarをセットアップしてから、主にTabBar Delegateプロトコルを実装することです。 - タブバー:didSelectItem:tabbarItemの選択が変更されるたびに、その項目IDに基づいて、あなたの新しいのViewControllerをロードするので、他のもの を解放することができますと呼ばれる方法:編集:このコードは、あなたの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 *)iteなどメートル { (item.tag == 0){ //この項目に関連のViewControllerをロードし、他の人 } を離すと...

} 
+0

しかし、uitabbarcontrollerを再作成する方法を知っていました。これは私自身のタブバーを管理するために必要なことです。たぶん私は試してみることができます.. – mk12

+1

それは全く難しくない、あなたはちょうど1つのメソッドを実装する必要がありますselectItemをし、選択した項目に応じて、非常にまっすぐ前方に設定し、怠惰な読み込み方法を行うことができます – Daniel

+0

そうです私は自分自身のuiviewcontrollerクラスを作成して、読み込みを遅延させ、タブバーを使うか、UITabBarControllerを使うべきだと言っていますか? didSelectItemメソッドを試しましたが、正しく動作するようにはできませんでした。 – mk12

-1

わからないあなたがしたいと思う理由これを行うには、メモリの問題がある場合は、現在のタブがアンロードされます。それは-viewWillAppear、-viewDidUnloadなどが対象です。

+0

私は知っていますが、あなたが見ていないとすぐには使用していないものをアンロードし、メモリ警告にプッシュしない方が良いと考えました。 – mk12

+0

私は2つのビューを持っているように、それらを切り替えるためにボタンを押して、次に、次のものをロードし、古いものを削除し、新しいものを追加して古いものをアンロードします。 – mk12

+0

メモリ警告のポイントに達すると、キャッシュされたSafariページなどを削除するなど、アプリに顕著な影響を与えるようなことが起こります。 – mk12

3

私はあなたがちょうどそうのようなメソッドを実装し、その後、UITabBarControllerデリゲートとして動作するクラスを必要とする1 ...

で両方の質問に答えることができます。

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

今、私のコードは単純になりますタブバーがフェードインまたはフェードアウトしますが、ここで作業して未使用のタブをアンロードすることもできます。場合によっては、タブの中に大量のメモリを使用すると良い考えです。

+0

トランジションをアニメートすることにした場合、私はそれを使用することがあります。 – mk12

-1

UITabBarControllerはすべてのView Controllerを遅延ロードします。タブがスイッチアウトされると、そのビューはメモリが不足した状態で割り当て解除されることがあります。 2回目に選択されると再作成されます。さらに、あなたのメモリヒットの大部分は、あなたのビューにあり、ビューコントローラにはありません。したがって、View Controllerからのメモリヒットを心配しないでください。ビューは賞賛です。

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

アンドリュー

+0

はい、私はそれが "メモリ緊密な状況"では知っているが、私は一度に1つのビュー、または1つのビューコントローラを割り当てることを好む。私はUITabBarControllerのインスタンスではなく、ルートビューコントローラとして独自のUIViewControllerサブクラス(UITabBarを使用)を使用することにしました。この方法ですべてを制御し、何が起きているのか、遅延ロードをより効率的に知ることができます。 – mk12

+0

また、ビューコントローラの割り当てを解除すると、ビューも割り当て解除されます。 – mk12

1

レイジーローディングはUITabBarControllerタスクではありません。代わりに、あなたのタブに関連付けられているviewControllerの責任があります。

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

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

明らかに、これはあなたのUIViewControllerに関連付けられているself.viewを削除します。ただし、コードが十分にスマートな場合、関連するすべてのオブジェクトが削除されます。 たとえば、あなたloadViewメソッドは次の通りであることとします。これは、contentViewとそのメモリresponsabilities内のすべてのオブジェクトは、contentViewに要求されていることがself.viewプロパティにリリースされ、装着されていることを意味

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

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

敬具

私は現在、これはタブバーで、非アクティブのビューコントローラをアンロードするために使用してい
-1

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

} }私は言わなかった

+0

これは、目標を達成するためのメソッドの現在の実装の副作用を使用して、悪いコーディングスタイルです。 didReceiveMemoryWarningの実装は、その動作についてのあなたの前提を変更し、壊す可能性があります。これは、動作がはっきりしていないため、デバッグすることも困難です。 – ikuramedia

関連する問題