UINavigationItem为何显示菜单按钮?如何移除该按钮?
问题场景与代码
点击导航栏搜索按钮后,搜索框旁出现一个类似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
相关产品推荐
相关产品推荐

