Xamarin.ios: 搜索栏显示在每个标签栏视图中

Xamarin.ios: Search bar displays in every tab bar view

我正在使用 Xamarin.ios MvvmCross 构建一个 iOS 应用程序。在此应用程序中,我使用选项卡式视图。在一个选项卡视图上我不想显示搜索栏,但此搜索栏显示在每个选项卡视图中。任何人都知道如何解决这个问题,以便我可以在其他选项卡视图中隐藏搜索栏?

搜索栏选项卡视图:

public override void ViewWillAppear(Boolean animated)
    {
        base.ViewWillAppear(animated);
        var searchController = new UISearchController(searchResultsController: null);

        searchController.SearchBar.SizeToFit();
        searchController.SearchBar.SearchBarStyle = UISearchBarStyle.Prominent;

        TabBarController.NavigationItem.HidesSearchBarWhenScrolling = false;
        TabBarController.NavigationItem.SearchController = searchController;

        NavigationController.NavigationBar.PrefersLargeTitles = true;
        this.Title = "Search";

        _searchBar = searchController.SearchBar;
        _searchBar.SearchButtonClicked += SearchBar_SearchButtonClicked;
        _searchBar.TextChanged += SearchBarOnTextChanged;
        _searchBar.CancelButtonClicked += SearchBarOnCancelButtonClicked;

        TabBarController.NavigationItem.RightBarButtonItem = null;
    }

带搜索栏的选项卡视图图片: Search

我想隐藏搜索栏但无法完成的其他选项卡视图:

    public override void ViewWillAppear(Boolean animated)
    {
        base.ViewWillAppear(animated);

        //var searchController = new UISearchController(searchResultsController: null);
        //searchController.SearchBar.Hidden = true;

        var search = new UISearchController(searchResultsController: null);
        TabBarController.NavigationItem.HidesSearchBarWhenScrolling = true;
        search.SearchBar.Hidden = true;

        NavigationController.NavigationBar.PrefersLargeTitles = true;
        TabBarController.NavigationItem.RightBarButtonItem = null;
    }

我不想显示搜索栏的选项卡视图图片: Home

出现此问题是因为您只使用了一个导航控制器来包装您的 TabbarController。当用户输入第二个标签栏项(搜索)时,您初始化一个 UISearchController 并将其设置为 NavigationItemSearchController。所以这个搜索栏会如你所愿地出现。

但是当你 return 到 Home 控制器时,这个 UISearchController 将仍然存在,因为你只使用一个 UINavigationController。在您的 Home 控制器的 ViewWillAppear() 事件中添加以下代码将解决您的问题:

TabBarController.NavigationItem.SearchController = null;

我真的建议你根据你的情况把一个 UINavigationController 分成四个。那么每个tabbar item controller都有自己的NavigationItem,不会互相影响。 UITabbarController 应该是您应用的根目录 ViewController。您的应用程序的层次结构可以是这样的: 我用 storyboard 画了两个 tabbar item 来帮助你理解我的意思。

这样在Home controller中就不需要添加任何代码了。您可以使用以下代码在搜索控制器中添加搜索栏:

public override void ViewDidLoad()
{
    base.ViewDidLoad();

    var searchController = new UISearchController(searchResultsController: null);

    searchController.SearchBar.SizeToFit();
    searchController.SearchBar.SearchBarStyle = UISearchBarStyle.Prominent;

    this.NavigationItem.HidesSearchBarWhenScrolling = false;
    this.NavigationItem.SearchController = searchController;

    NavigationController.NavigationBar.PrefersLargeTitles = true;
    this.Title = "Search";

    _searchBar = searchController.SearchBar;
    _searchBar.SearchButtonClicked += _searchBar_SearchButtonClicked; ;
    _searchBar.TextChanged += _searchBar_TextChanged; ;
    _searchBar.CancelButtonClicked += _searchBar_CancelButtonClicked; ;

    this.NavigationItem.RightBarButtonItem = null;
}

我将你的代码移动到 ViewDidLoad() 事件并将 TabBarController.NavigationItem 修改为 this.NavigationItem