【问题标题】:Regarding the UITabBarController, is there a way to force a view to be fully released when a new tab is selected关于UITabBarController,有没有办法在选择新选项卡时强制视图完全释放
【发布时间】:2014-02-08 06:23:07
【问题描述】:

我正在为 iPhone 创建一个标签栏应用程序,如果选择了一个新标签,我希望当前处于活动状态的任何视图都能完全卸载/释放。当重新选择任何选项卡时,我希望它必须重新加载所有内容。我寻求此功能的原因是因为所有视图都与单个数据库交互,并且可以修改数据库。构建视图时,它们是从当前数据库构建的,这意味着它们可以在不强制重新加载视图的情况下过期。

要查看我所指的内容,请在 iPhone 上加载“电话”应用程序,然后您可以在键盘上输入一个数字、切换选项卡、切换回键盘,然后您输入的数字就会保留在那里。这对于电话应用程序来说是一个理想的特性,但对于我正在设计的东西来说并不是那么重要。

有没有办法做到这一点?或者,我应该在切换选项卡时使用其他方法来更新我的视图吗?

【问题讨论】:

  • 将重载逻辑放入-(void)viewWillAppear。你绝对不需要释放视图。
  • 如何显示数据?您使用的是表格视图还是集合视图?
  • 我完全忘了问这个问题;生活对我很忙!是时候拿出我对这些问题的答案了。我使用 -(void)viewWillAppear 方法对其进行了测试,并且可能最终会在重新激活视图时使用它来重置视图。我还将它与 -(void) viewWillDisappear 函数结合使用来处理视图重置。

标签: ios iphone objective-c memory-management uitabbarcontroller


【解决方案1】:

我认为 Neil Galiaskarov 评论说您不应该考虑发布该视图。他将您当前的重新加载逻辑放入-(void)viewWillAppear 的想法是合理的:

-(void)viewWillAppear:(BOOL)animated{ 
   [super viewWillAppeared:animated]; 
   // Any code you are currently triggering in your init / viewDidLoad 
   // to reload your database and display the result
}

每次您通过标签栏返回时都会触发此事件,并且应该为您提供您想要的结果。但是,根据您接下来要执行的操作,有一些警告可能无法提供所需的功能:

  • 屏幕将在通过弹出堆栈到达时更新(根据您的描述,这可能没问题)。
  • 如果您开始使用滑动手势在堆栈中向后导航但中止导航,则屏幕也将更新。 (因为这会触发 viewWillAppearviewDidAppear)。

如果后者是一个问题,可以通过BOOL _shouldTriggerReload; 处理它:

viewWillAppear 逻辑包装在 if 中:

if (_shouldTriggerReload){
   _shouldTriggerReload = NO; // Preparing for the next round
   // Any code you are currently triggering in your init / viewDidLoad 
   // to reload your database and display the result
}

然后在你的viewDidDisappear:

- (void)viewDidDisappear:(BOOL)animated{
   [super viewDidDisappear:animated];
   _shouldTriggerReload = YES;
}

而且它还必须在你的 viewDidLoad 中为第一个条目设置:

- (void)viewDidLoad{
    _shouldTriggerReload = YES;
}

【讨论】:

    【解决方案2】:

    tabBarController 有一个viewControllers 属性。 你修改 viewControllers 属性来达到这样的效果。

    我会做的是,
    对于您想要重新加载其视图的view controller(say VC),当用户选择该选项卡时。 添加UITabBarControllerDelegate 委托给VC。并实现以下方法。

    – tabBarController:shouldSelectViewController:
    

    当用户在底部标签栏中选择这个时,tabBarController 调用这个方法是否应该显示这个 viewController。 在这里,change the tabBarController.viewControllers 属性并返回 YES。

    假设您的标签栏只附加了两个视图控制器,用户现在选择标签 2,您必须创建新的视图控制器并显示它。 所以,

    UITabBarController *tabBarController;
    NSMutableArray *array=[NSMutableArray arrayWithArray:tabBarController.viewControllers];
    UIViewController *viewController2; //init your viewController type 2
    [array replaceObjectAtIndex:1 withObject:viewController2];
    tabBarController.viewControllers =[NSArray arrayWithArray:array];
    

    【讨论】:

    • 这将如何导致从数据库重新加载内容?
    【解决方案3】:

    使用委托方法

    - (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item

    添加您每次选择 tabBarItem 时都可以触发的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多