在iOS 9上使用搜索栏

在iOS 9上使用搜索栏,ios,objective-c,iphone,cocoa-touch,uisearchbar,Ios,Objective C,Iphone,Cocoa Touch,Uisearchbar,我有一个cities数组,希望用户添加该数组 在添加屏幕上我希望当用户开始键入时,城市的选项(从数组中)将显示在表视图中 我在互联网上搜索了好几个小时,但似乎所有东西都是旧的,不是最新的(苹果不赞成iOS 8和iOS 9中的一些东西) 我正在搜索一个关于如何做的最新教程,有人能帮忙吗 谢谢大家! 如果我可以澄清…,您想在cities数组中搜索/筛选吗 无论哪种方式,这都是我在iOS9中使用UISearchController的方式 0)您需要这些协议(如果是tableView): 3) 在视图中

我有一个
cities
数组,希望用户添加该数组

添加屏幕上
我希望当用户开始键入时,城市的选项(从数组中)将显示在表视图中

我在互联网上搜索了好几个小时,但似乎所有东西都是旧的,不是最新的(苹果不赞成iOS 8和iOS 9中的一些东西)

我正在搜索一个关于如何做的最新教程,有人能帮忙吗


谢谢大家!

如果我可以澄清…,您想在cities数组中搜索/筛选吗

无论哪种方式,这都是我在iOS9中使用UISearchController的方式

0)您需要这些协议(如果是tableView):

3) 在视图中,将出现和消失视图

- (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:

@interface YourViewController () <UITableViewDelegate, UITableViewDataSource, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating>
#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];
}

不管怎么说,这就是问题的症结所在。祝你好运这方面也有很多教程。

请使用教程。如果它不起作用,告诉我们你在尝试什么,问题出在哪里。如。。。手机上的initWithStyle被删除了,所以我不能做这件事。无论什么让我们看看你有什么,这样我们可以帮助你。包括源代码和/或屏幕截图。谢谢!但由于某些原因,搜索速度非常慢,UI会冻结几秒钟。“citiesArray”真的很大,所以可能这就是问题所在(86111个对象),但我如何才能让它加载得更快?或者至少让UI更平滑,不会冻结?非常感谢。陛下很抱歉,我认为我在这方面帮不了你,因为我从来没有遇到过这个问题,因为我的阵列非常小。您的阵列非常大,这肯定是问题的原因,但我不知道如何解决它:-/它工作得很好。但在字典数组中搜索名字时,并没有显示任何结果。所以对于字典数组,我更改了谓词:
NSPredicate*predicate=[NSPredicate predicateWithFormat:@“name CONTAINS[c]@”,searchString]即Dic值的“名称”关键字
#pragma mark - UISearchControllerDelegate

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    [self.tableView reloadData];
}