0

How can I make it so when a tab is selected, the current one is unloaded, and the next one is loaded so only one loaded at a time? 或者我什至不应该这样做?我知道如何使用普通的 UIViewController 作为根 VC,但不确定使用 UITabBarController。另外,有没有办法动画从一个选项卡到下一个选项卡的过渡?有什么帮助吗?谢谢!!

编辑:...如果我卸载视图控制器,那么他们在标签栏上的图标就消失了......也许我会卸载他们的视图..

4

6 回答 6

3

我可以同时回答这两个问题...

您只需要一个充当 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 委托协议,主要是 -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 并释放其他 } ...等

}
于 2009-08-13T19:00:19.637 回答
1

延迟加载不是 UITabBarController 任务。相反,它是与您的选项卡关联的视图控制器的责任。

要释放与每个 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

不知道为什么要这样做,如果涉及内存问题,当前选项卡无论如何都会被卸载。这就是 -viewWillAppear、-viewDidUnload 等的用途。

于 2009-08-13T19:17:13.607 回答
-1

UITabBarController 确实延迟加载其所有视图控制器。当一个选项卡被关闭时,它的视图会在内存紧张的情况下被释放。然后在第二次选择它时重新创建它。此外,您的大部分内存命中都在您的视图中,而不是视图控制器中。因此,不必担心视图控制器会影响内存。观点是问题。

如果您在操作系统的 v3 上运行,那么您可以使用 -viewDidUnload 方法来确保最大程度地减少内存。

安德鲁

于 2009-08-14T03:05:13.013 回答
-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];

} }

于 2010-12-13T05:05:38.617 回答