【问题标题】:UINavigationController missing from view hierarchy after cancelling UISearchController取消 UISearchController 后视图层次结构中缺少 UINavigationController
【发布时间】:2016-03-06 00:00:26
【问题描述】:

我有一个带有 UITabBarController 和几个选项卡的应用程序,每个选项卡都包含一个 UINavigationController。我还有一个由导航栏上的搜索按钮触发的 UISearchController,它有一个自定义搜索结果视图控制器。搜索工作得很好,点击取消也是如此。我实现了 presentSearchController: 以使用

将搜索控制器呈现为视图控制器
[self presentViewController:animated:completion:];

,这也很好用。

我遇到麻烦的地方是,如果用户关闭键盘(搜索控制器处于活动状态),然后在选项卡栏上切换选项卡,返回到搜索控制器处于活动状态的原始选项卡,然后点击“取消”,底层UINavigationController 的视图堆栈已从主窗口层次结构中消失,并且在我切换选项卡并返回搜索模式处于非活动状态之前不会重新加载。

这和这个问题类似:"From View Controller" disappears using UIViewControllerContextTransitioning

除了我不使用任何自定义过渡,点击取消后标签栏仍然显示。打印视图堆栈显示选项卡栏是窗口的唯一子视图,直到我再次切换选项卡并且一切正常显示。

解决此问题的最佳方法是什么?我真的很讨厌按照建议将导航控制器的视图重新添加到didDismissSearchController: 的窗口中。这不仅看起来是个坏主意,而且在将导航控制器显式重新添加到关键窗口时,我还遇到了标签栏和导航控制器的 z 顺序问题。

【问题讨论】:

  • 在我看来,原始视图(堆栈中搜索视图下方的视图)的数据源存在问题。您是否保持对原始视图数据源的强引用,如果这样做,您可能需要考虑在用户点击取消按钮时重新加载视图数据?
  • 我认为可能也是这种情况,但不幸的是整个导航控制器都从窗口中丢失,因此数据重新加载将无处可绘。 View tree post cancel 仅包含 keyWindow 和 tab bar -- 没有导航控制器、视图控制器或集合视图。

标签: ios objective-c uinavigationcontroller uitabbarcontroller uisearchcontroller


【解决方案1】:

添加我的蛮力解决方案:

- (void)didDismissSearchController:(UISearchController*)searchController
{
    if (![self.view isDescendantOfView:[UIApplication sharedApplication].keyWindow]) {
        NSUInteger currIndex = self.tabBarController.selectedIndex;
        NSUInteger tempIndex = self.tabBarController.selectedIndex == 0 ? 1 : 0;

        [self.tabBarController setSelectedIndex:tempIndex];
        [self.tabBarController setSelectedIndex:currIndex];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多