gpt4 book ai didi

ios - 使用 UISearchBar 作为 UITableView 的标题 View 不可避免的保留周期?

转载 作者:行者123 更新时间:2023-12-01 22:29:02 24 4
gpt4 key购买 nike

我在构建一个使用 UISearchController 的基本 UI 时遇到了这个问题。它是 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
...
}];

当我从堆栈中弹出 View 时,它的 dealloc 方法永远不会被调用,即使我在 viewWillDisappear: 中将 tableHeaderView 设置为 nil .我需要注释掉才能看到调用 dealloc 的唯一行是初始分配。

任何人都知道为什么会发生这种情况?

编辑:

发现了一些有趣的行为。同样根据 Apple Docs,我设置了 Controller 的 definesPresentationContext可变为 YES .在将 tableViewHeader 分配保留在固定保留周期中时将其注释掉,即使我没有取消 tableViewHeader。但是,设置 definesPresentationContextviewDidLoad并在 viewWillDisappear 中清除它重新引入了保留周期。

最佳答案

偶然发现了这个答案:
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的不存在在另一个 View Controller 被推到 View 顶部的情况下很有帮助,因为我们会回到页面。很可能,我们只想在弹出包含它的 View Controller 时关闭 searchController。

关于ios - 使用 UISearchBar 作为 UITableView 的标题 View 不可避免的保留周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39628401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com