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
并将其设置为 NavigationItem
的 SearchController
。所以这个搜索栏会如你所愿地出现。
但是当你 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
。
我正在使用 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
并将其设置为 NavigationItem
的 SearchController
。所以这个搜索栏会如你所愿地出现。
但是当你 return 到 Home
控制器时,这个 UISearchController
将仍然存在,因为你只使用一个 UINavigationController
。在您的 Home
控制器的 ViewWillAppear()
事件中添加以下代码将解决您的问题:
TabBarController.NavigationItem.SearchController = null;
我真的建议你根据你的情况把一个 UINavigationController
分成四个。那么每个tabbar item controller都有自己的NavigationItem
,不会互相影响。 UITabbarController
应该是您应用的根目录 ViewController。您的应用程序的层次结构可以是这样的:
这样在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
。