在 iOS 9 上使用搜索栏 [关闭]
Posted
技术标签:
【中文标题】在 iOS 9 上使用搜索栏 [关闭]【英文标题】:Working with search bar on iOS 9 [closed] 【发布时间】:2016-04-08 15:40:56 【问题描述】:我有一个 cities
数组,我希望用户添加它。
在add screen
上,我希望当用户开始输入时,城市的选项(来自数组)将显示在表格视图中。
我已经在互联网上搜索了几个小时,但一切似乎都是旧的而且不是最新的(苹果在 ios 8 和 9 中弃用了一些东西)。
我正在寻找有关如何操作的最新教程,有人可以帮忙吗?
谢谢!
【问题讨论】:
使用教程。例如code-ninja.org/blog/2012/01/08/… 如果它不起作用,请告诉我们您正在尝试什么以及问题出在哪里。例如...单元格上的 initWithStyle 已被删除,所以我不能做这件事。任何。向我们展示您拥有的东西,以便我们提供帮助。包括源代码和/或屏幕截图。 【参考方案1】:如果我可以澄清一下...,您想搜索/过滤城市数组吗?
无论哪种方式,这都是我在 iOS9 中使用 UISearchController 的方式。
0) 你需要这些协议(如果是 tableView):
@interface YourViewController () <UITableViewDelegate, UITableViewDataSource, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating>
1) 声明这些属性:
@property (nonatomic, strong) UISearchController *searchController;
@property (nonatomic, readonly) NSArray *searchResults;
3) 在 viewWillAppear 和 viewWillDisappear 中
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
if (!_searchController.searchBar.superview)
self.tableView.tableHeaderView = self.searchController.searchBar;
if (!self.searchController.active && self.searchController.searchBar.text.length == 0)
self.tableView.contentOffset = CGPointMake(0, CGRectGetHeight(self.searchController.searchBar.frame));
- (void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
if (self.searchController.isActive)
self.searchController.active = NO;
3) 用于 searchController 的 Getter/Setter:
#pragma mark - Getters / Setters
- (UISearchController *)searchController
if (!_searchController)
_searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
_searchController.searchResultsUpdater = self;
_searchController.dimsBackgroundDuringPresentation = NO;
_searchController.searchBar.delegate = self;
[_searchController.searchBar sizeToFit];
return _searchController;
- (NSArray *)searchResults
NSString *searchString = self.searchController.searchBar.text;
if (searchString.length > 0)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchString];
return [self.cities filteredArrayUsingPredicate:predicate];
else
return self.cities;
return @[];
4) 更新tableView:
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if (self.searchController.isActive && self.searchController.searchBar.text.length > 0)
return self.searchResults.count;
else
return self.cities.count;
return 0;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell;
NSString *cityName = @"";
cell = [tableView dequeueReusableCellWithIdentifier:@"YourIdentifier" forIndexPath:indexPath];
if (self.searchController.isActive && (![self.searchController.searchBar.text isEqualToString:@""]))
cityName = [self.searchResults objectAtIndex:indexPath.row];
else
cityName = [self.cities objectAtIndex:indexPath.row];
((YourTableViewCell *)cell).cityNameLabel.text = cityName;
return cell;
5) 更新 UISearchControllerDelegate
#pragma mark - UISearchControllerDelegate
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
[self.tableView reloadData];
无论如何,这就是它的要点。祝你好运。这方面也有很多教程。
【讨论】:
谢谢!但由于某种原因,搜索速度非常慢,用户界面冻结了几秒钟。 “citiesArray” 真的很大,所以也许这就是问题所在(86,111 个对象),但我怎样才能让它加载得更快呢?或者至少让 UI 更流畅而不是冻结?谢谢! 嗯.. 很抱歉,我认为我无法帮助您,因为我的阵列非常小,我从未遇到过这个问题。您的数组非常大肯定会导致问题,但我不知道如何解决它。 :-/ 完美运行。但是在字典的数组中搜索名称时,它没有显示任何结果。因此,对于字典数组,我更改了谓词:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[c] %@", searchString];
即 Dic 值的“名称”关键字以上是关于在 iOS 9 上使用搜索栏 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
UINavigationBar变成白色,在iOS 13中使用navigationItem.searchController时不会关闭