在 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) 在 vi​​ewWillAppear 和 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 上使用搜索栏 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

按下字母时iOS搜索栏关闭

切换回搜索栏处于活动状态时,选项卡栏视图变为空白

UINavigationBar变成白色,在iOS 13中使用navigationItem.searchController时不会关闭

ios7所有搜索视图和表格视图关闭20像素

搜索栏未显示在导航栏 iOS 11 上

停止 UISearchDisplayController 以关闭搜索栏键盘