Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 关于UITabBarController,是否有办法在选择新选项卡时强制完全释放视图_Ios_Iphone_Objective C_Memory Management_Uitabbarcontroller - Fatal编程技术网

Ios 关于UITabBarController,是否有办法在选择新选项卡时强制完全释放视图

Ios 关于UITabBarController,是否有办法在选择新选项卡时强制完全释放视图,ios,iphone,objective-c,memory-management,uitabbarcontroller,Ios,Iphone,Objective C,Memory Management,Uitabbarcontroller,我正在为iPhone创建一个选项卡栏应用程序,如果选择了一个新的选项卡,我希望当前处于活动状态的任何视图都能完全卸载/释放。当重新选择任何选项卡时,我希望它必须重新加载所有内容。我之所以寻求此功能,是因为所有视图都与单个数据库交互,并且可以修改数据库。构建视图时,它们是基于当前数据库构建的,这意味着如果不强制重新加载视图,它们可能会过时 要查看我指的是什么,请在iPhone上加载“Phone”应用程序,您可以在键盘上键入一个号码,切换选项卡,切换回键盘,您键入的号码仍保留在那里。这对于手机应用来

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

要查看我指的是什么,请在iPhone上加载“Phone”应用程序,您可以在键盘上键入一个号码,切换选项卡,切换回键盘,您键入的号码仍保留在那里。这对于手机应用来说是一个令人向往的特性,但对于我正在设计的东西来说却不是这样


有没有办法做到这一点?或者,切换选项卡时是否应使用其他方法更新视图?

tabBarController具有
viewControllers
属性。 您可以修改viewControllers属性以实现这种效果

我要做的是,
对于要在用户选择该选项卡时重新加载其视图的
视图控制器(例如VC)
。 添加
uitabarcontrollerdelegate
委托给VC。并实现以下方法

– tabBarController:shouldSelectViewController:
当用户在底部选项卡栏中选择此选项时,
tabBarController
调用此方法,无论是否显示此viewController。 在这里,
更改tabBarController.viewControllers
属性并返回YES

假设选项卡栏上只有两个viewController,用户现在选择选项卡2,您必须创建新的viewController并显示它。 所以


tabBarController有一个
viewControllers
属性。 您可以修改viewControllers属性以实现这种效果

我要做的是,
对于要在用户选择该选项卡时重新加载其视图的
视图控制器(例如VC)
。 添加
uitabarcontrollerdelegate
委托给VC。并实现以下方法

– tabBarController:shouldSelectViewController:
当用户在底部选项卡栏中选择此选项时,
tabBarController
调用此方法,无论是否显示此viewController。 在这里,
更改tabBarController.viewControllers
属性并返回YES

假设选项卡栏上只有两个viewController,用户现在选择选项卡2,您必须创建新的viewController并显示它。 所以

使用委托方法

-(void)选项卡栏:(UITabBar*)选项卡栏didSelectItem:(UITabBarItem*)项

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

使用委托方法

-(void)选项卡栏:(UITabBar*)选项卡栏didSelectItem:(UITabBarItem*)项


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

我认为Neil Galiaskarov评论说您不应该考虑发布视图。他将当前重新加载逻辑放在
-(void)视图中的想法将出现
是正确的:

-(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
}
每次您通过选项卡栏返回时,都会触发此操作,并应提供您想要的结果。但是,根据您下一步的操作,有一些警告可能无法提供所需的功能:

  • 当弹出堆栈到达屏幕时,屏幕将被更新(根据您的描述,这可能是正常的)
  • 如果开始在堆栈中使用滑动手势向后导航,但中止导航,屏幕也将更新。(这会触发
    视图将出现
    视图显示
如果后者是一个问题,则应通过
BOOL\u触发重载来处理

如果出现以下情况,则将
视图包装到逻辑中:

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
}
然后在您的
视图中消失

- (void)viewDidDisappear:(BOOL)animated{
   [super viewDidDisappear:animated];
   _shouldTriggerReload = YES;
}
对于第一个条目,它还必须在viewDidLoad中设置:

- (void)viewDidLoad{
    _shouldTriggerReload = YES;
}

我认为Neil Galiaskarov评论说您不应该考虑发布视图。他将当前重新加载逻辑放在
-(void)视图中的想法将出现
是正确的:

-(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
}
每次您通过选项卡栏返回时,都会触发此操作,并应提供您想要的结果。但是,根据您下一步的操作,有一些警告可能无法提供所需的功能:

  • 当弹出堆栈到达屏幕时,屏幕将被更新(根据您的描述,这可能是正常的)
  • 如果开始在堆栈中使用滑动手势向后导航,但中止导航,屏幕也将更新。(这会触发
    视图将出现
    视图显示
如果后者是一个问题,则应通过
BOOL\u触发重载来处理

如果出现以下情况,则将
视图包装到逻辑中:

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
}
然后在您的
视图中消失

- (void)viewDidDisappear:(BOOL)animated{
   [super viewDidDisappear:animated];
   _shouldTriggerReload = YES;
}
对于第一个条目,它还必须在viewDidLoad中设置:

- (void)viewDidLoad{
    _shouldTriggerReload = YES;
}

将重新加载逻辑放入
-(void)视图将出现
。您肯定不需要释放视图。您如何显示数据?您使用的是表视图还是集合视图?我完全忘了问这个问题;生活在我身上变得忙碌起来!是时候把这些问题的答案拿出来了。我使用-(void)viewwillappearch方法对其进行了测试,当视图被重新激活时,可能会使用该方法重置视图。我还将此功能与-(void)viewwilldiscome函数结合使用,以处理视图重置。将重新加载逻辑放入
-(void)viewwilldiscome
。您肯定不需要释放视图。您如何显示数据?您使用的是表视图还是集合视图?我完全忘了问这个问题;生活在我身上变得忙碌起来!是时候把这些问题的答案拿出来了。我使用-(void)viewwillappearch方法对其进行了测试,最终可能会使用它来