You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UINavigationItem为何显示菜单按钮?如何移除该按钮?

UINavigationItem搭配UISearchController的三点按钮问题解答

问题场景与代码

点击导航栏搜索按钮后,搜索框旁出现一个类似UIContextMenu的三点按钮,点击时日志报错:

[UILog] Called -[UIContextMenuInteraction updateVisibleMenuWithBlock:] while no context menu is visible. This won't do anything.

相关实现代码:

#warning - addded UISearchController
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.navigationItem.searchController = self.searchController;
self.navigationItem.hidesSearchBarWhenScrolling = NO;
if (@available(iOS 16.0, *)) {
    self.navigationItem.preferredSearchBarPlacement = UINavigationItemSearchBarPlacementInline;
    
}
self.searchController.searchBar.delegate = self;
self.searchController.searchResultsUpdater = self;
self.searchController.definesPresentationContext = YES;
self.searchController.obscuresBackgroundDuringPresentation = NO;
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.searchController.searchBar.placeholder = @"Search";
self.searchController.searchBar.searchBarStyle = UISearchBarStyleProminent;
[self.searchController.searchBar sizeToFit];

问题1:为何导航栏会出现该按钮?(我并未手动添加)

这个三点按钮是iOS 16及以上版本中UISearchBarStyleProminent样式的原生组件,系统默认给该样式的搜索栏附加了这个菜单按钮,用于提供“取消搜索”“清除内容”等快捷操作,属于系统UI的默认改动,不需要开发者手动添加。你代码里设置了UISearchBarStyleProminent,因此触发了这个默认UI。

问题2:如何从导航视图中移除该按钮?

有两种可靠方案:

  • 方案一:更换搜索栏样式
    将UISearchBarStyleProminent替换为UISearchBarStyleDefault或UISearchBarStyleMinimal,这两个样式不会显示该三点按钮:

    self.searchController.searchBar.searchBarStyle = UISearchBarStyleDefault;
    
  • 方案二:保留Prominent样式并隐藏按钮(iOS 16+)
    如果需要维持Prominent样式的视觉效果,可以通过视图遍历或KVC的方式隐藏按钮(需做版本判断):
    视图遍历方式:

    if (@available(iOS 16.0, *)) {
        for (UIView *subview in self.searchController.searchBar.subviews) {
            if ([subview.class.description containsString:@"UISearchBarSearchContainerView"]) {
                for (UIView *containerSubview in subview.subviews) {
                    if ([containerSubview.class.description containsString:@"UISearchBarMenuButton"]) {
                        containerSubview.hidden = YES;
                        break;
                    }
                }
                break;
            }
        }
    }
    

    KVC方式(更简洁):

    if (@available(iOS 16.0, *)) {
        UIView *menuButton = [self.searchController.searchBar valueForKey:@"menuButton"];
        menuButton.hidden = YES;
    }
    

内容的提问来源于stack exchange,提问作者Vitalik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:57:11