Ios 内存警告后,如何重新加载内置故事板的searchDisplayController?
此项目适用于使用ARC和Core数据的iOS5 iPhone 所有内置的Xcode情节串连板,我有一个带有几个选项卡的Ios 内存警告后,如何重新加载内置故事板的searchDisplayController?,ios,memory-management,uitableview,uisearchdisplaycontroller,uistoryboard,Ios,Memory Management,Uitableview,Uisearchdisplaycontroller,Uistoryboard,此项目适用于使用ARC和Core数据的iOS5 iPhone 所有内置的Xcode情节串连板,我有一个带有几个选项卡的UITabBarController。其中三个视图是带有UISearchDisplayController附件的UITableViewController。如果我在iPhone模拟器中模拟内存警告,任何未激活的视图都会被转储,当我使用searchDisplayController点击其中一个视图的选项卡时,NSZombieEnabled会告诉我-[UISearchDisplayC
UITabBarController
。其中三个视图是带有UISearchDisplayController
附件的UITableViewController
。如果我在iPhone模拟器中模拟内存警告,任何未激活的视图都会被转储,当我使用searchDisplayController点击其中一个视图的选项卡时,NSZombieEnabled会告诉我-[UISearchDisplayController retain]:发送到解除分配实例的消息
这是我的-didReceiveMemoryWarning
:
- (void)didReceiveMemoryWarning
{
[(PahAppDelegate *)[[UIApplication sharedApplication] delegate] saveContext];
// Release any cached data, images, etc that aren't in use.
self.searchWasActive = [self.searchDisplayController isActive];
self.savedSearchTerm = [self.searchDisplayController.searchBar text];
self.savedScopeButtonIndex = [self.searchDisplayController.searchBar selectedScopeButtonIndex];
self.fetchedResultsController.delegate = nil;
self.fetchedResultsController = nil;
self.searchFetchedResultsController.delegate = nil;
self.searchFetchedResultsController = nil;
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
}
我最好的猜测是,UITableViewController
也会转储子视图,无论出于何种原因,当我返回到其他选项卡时,它不会重新创建它们。由于所有这些功能都内置在故事板中,我不太确定如何请求它重新加载所讨论的searchDisplayController
注意:我从未见过应用程序在现实世界中在设备上这样做
(我的测试人员也没有),但我不想让苹果拒绝
因此批准应用程序;再加上修好它看起来就像
做正确的事
searchDisplayController
是一个只读属性,所以我不确定应该采取什么策略来加载它们。这显然像是一个可能是情节提要的bug。正如这里所提到的:,一个使用故事板和UISearchDisplayController的全新项目可以复制这个特性,而无需将UISearchDisplayController的插座连接到您的控制器中。该线程中的建议似乎是合理的,在代码中创建UISearchDisplayController。我无法保证解决方案的有效性,因为我没有测试它,但我很好奇,确实复制了新的project=crash索赔,并看到了完全相同的事情。我得出了相同的结论。我自己构建了一个示例测试项目,只是在故事板中进行布局,没有添加任何自定义代码,它仍然可以复制。请看,似乎这可能是一个错误的故事板。通过在代码中创建UISearchDisplayController
暂时解决了这个问题,正如Brian Cooke在下面建议的那样。