为原来的应用中的项目列表添加搜索条并且实现搜索方法。
当中动用到的几个类:
UITableViewController(外层的类,列表显示的类)
UITableViewSource(数据源,列表中行和分组数据获取的地方)
UITableViewCell(单元格不多介绍,我的应用中搜索得到单元和平时使用的单元风格不一样功能也不一样,搜索得到的项目不能执行除了打开外的其他操作)
UISearchBar (搜索框)
UISearchDisplayController(搜索框的显示控制器)
TableViewController要实现两个接口 IUISearchBarDelegate,IUISearchDisplayDelegate
public class DiagramsViewController:UITableViewController,IUISearchBarDelegate,IUISearchDisplayDelegate
在UITableViewController中声明好变量
1 private UISearchBar searchBar; 2 private UISearchDisplayController searchDisplayController;
初始化,关键在于委托和数据的绑定,还有就是搜索条要放在TableView的 TableHeaderView里。
1 protected virtual void InitializeSearchBar() 2 { 3 searchBar = new UISearchBar (new RectangleF(0,0,this.TableView.Bounds.Width,50)); 4 searchBar.Placeholder = "Search for Diagrams"; 5 searchDisplayController = new UISearchDisplayController (searchBar, this); 6 7 8 searchDisplayController.WeakDelegate = this; 9 var sts = new SearchTableSource (this); 10 searchDisplayController.SearchResultsWeakDataSource = sts; 11 searchDisplayController.SearchResultsWeakDelegate = sts; 12 13 TableView.TableHeaderView = searchBar; 14 }
现在界面已经出现了UISearchBar可是不能够使用无论你输入什么搜索是没有结果的。
在UITableViewConroller中实现SearchReload方法,用一个数组来存储过滤后的数值。
1 public void FilterContentForSearchText(string searchText) 2 { 3 filteredProjects = Projects.Where (p => p.FileName.IndexOf(searchText,StringComparison.CurrentCultureIgnoreCase) >= 0).ToArray(); 4 } 5 6 7 [Export ("searchDisplayController:shouldReloadTableForSearchString:")] 8 public bool ShouldReloadForSearchString (MonoTouch.UIKit.UISearchDisplayController controller, string forSearchString) 9 { 10 FilterContentForSearchText (forSearchString); 11 return true; 12 }
当然就算你实现了方法也依旧不能搜索到数据,因为UITableViewSource没有修改,当你在TableViewsource加了判断时结果就会出来~
我是对搜索使用自己实现新的 SearchTableSource,而不是原来的 UITableViewSource。
SearchBarController绑定的也是自己实现的SearchTableSource,所以当搜索时SearchBarController会向自己实现的SearchTableSource获取数据。
1 protected class SearchTableSource:UITableViewSource 2 { 3 public SearchTableSource(DiagramsViewController controller) 4 { } 5 6 public override int RowsInSection (UITableView tableview, int section) 7 { 8 if (filteredProjects != null) { 9 return filteredProjects.Length; 10 } 11 return 0; 12 } 13 14 public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath) 15 { 16 return ...; 17 } 18 19 public override void RowSelected (UITableView tableView, NSIndexPath indexPath) 20 { 21 ... 22 } 23 24 }
最终达到想要:
当中还做了些比较细的修改取决你你的项目需求,这边就不多写了~
IOS MONO UITableViewConntroler Add UISearchBar,布布扣,bubuko.com