我遇到了这个问题,因为我正在构建一个使用UISearchController
及其UISearchBar
成员的基本用户界面。我的tableView是一个弱IBOutlet,就像Apple Docs演示一样,我将tableHeaderView属性设置为搜索栏成员。
//Snippet from viewDidLoad
UISearchController* searchController = [self createSearchController];
UISearchBar* searchBar = searchController.searchBar;
searchBar.userInteractionEnabled = NO;
self.tableView.tableHeaderView = searchBar; //The assignment in question
[NetworkStuff makeCall:^(Response *response) {
//handle success
searchBar.userInteractionEnabled = YES; //local variables
searchController.active = YES;
...
} failure:^(Response *response) {
//handle failure
...
}];
当我从堆栈中弹出视图时,即使我在viewWillDisappear:
中将tableHeaderView设置为nil,也不会调用其dealloc方法。我需要注释掉看dealloc的唯一一行就是初始赋值。
任何人都知道为什么会发生这种情况?
编辑:
发现了一些有趣的行为。另外,根据Apple文档,我将控制器的definesPresentationContext
变量设置为YES
。在将tableViewHeader赋值保留在固定保留周期的同时将其注释掉,即使我没有删除tableViewHeader。但是,在definesPresentationContext
中设置viewDidLoad
并在viewWillDisappear
中清除它会重新引入保留周期。
答案 0 :(得分:0)
偶然发现了这个答案: UISearchController retain issue
解决方案似乎是在viewDidDisappear:
中明确地解除了UISearchController(注意,我无法在viewWillDisappear:
中使用它)。由于该代码很快,我将在此处转录为Objective-C:
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
if (!self.presentingViewController) {
[self.searchController dismissViewControllerAnimated:NO completion:nil];
}
}
正如原始答案所指出的那样,检查self.presentingViewController
不存在对于将另一个视图控制器推到视图顶部的情况很有帮助,因为我们将回到页面。很有可能,我们只想在弹出包含它的视图控制器时解除searchController。