Xamarin.ios: панель поиска отображается в представлении каждой вкладки - PullRequest
0 голосов
/ 01 мая 2018

Я создаю приложение для iOS с Xamarin.ios MvvmCross. В этом приложении я использую представление с вкладками. на одной вкладке я не хочу отображать панель поиска, но эта панель поиска отображается на каждой вкладке. Кто-нибудь знает, как решить эту проблему, чтобы я мог скрыть панель поиска в других представлениях вкладок?

Панель поиска Вид вкладки:

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;
    }

Изображение представления вкладок с панелью поиска: Поиск

Другие виды вкладок, где я хочу скрыть панель поиска, но не могу это сделать:

    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;
    }

Изображение вида вкладки, где я не хочу показывать панель поиска: Главная

1 Ответ

0 голосов
/ 01 мая 2018

Эта проблема возникает из-за того, что вы просто используете один Navigation Controller, упаковывающий ваш TabbarController. Когда пользователь вводит второй элемент панели вкладок (Поиск), вы инициализируете UISearchController и устанавливаете для него NavigationItem s SearchController. Таким образом, эта строка поиска отображается так, как вы хотите.

Но когда вы вернетесь к контроллеру Home, этот UISearchController останется там, поскольку вы просто используете один UINavigationController. Добавьте приведенный ниже код в ваше событие Home Controller ViewWillAppear(), чтобы решить вашу проблему:

TabBarController.NavigationItem.SearchController = null;

Я действительно рекомендую вам разделить ваш UINavigationController на четыре в вашей ситуации. Тогда каждый контроллер элемента панели вкладок имеет свой собственный NavigationItem и не будет влиять друг на друга. UITabbarController должен быть корневым ViewController вашего приложения. Иерархия вашего приложения может быть такой: enter image description here Я использую раскадровку, чтобы нарисовать два элемента на вкладке, чтобы вы поняли, о чем я.

Таким образом, в контроллере Home нет необходимости добавлять какой-либо код. Вы можете просто добавить строку поиска в свой контроллер поиска с кодом:

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.

...