如何在uitableview中添加搜索过滤器

时间:2015-12-09 09:25:31

标签: ios objective-c uitableview

我正在UITableView工作,我有一个联系人列表。所有联系人都来自JSON格式的Web服务。我已在我的tableView中解析它,现在我想添加一个搜索逻辑来搜索联系人。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 ChatListCell *cell=[tableView dequeueReusableCellWithIdentifier:@"contactListCell"];
 if(!cell){
     cell = [[ChatListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"contactListCell"];
 }
 ChatListData *chatlistData = [chatList objectAtIndex:indexPath.row];
NSString *txtName = chatlistData.name;
NSLog(@"name %@", txtName);
NSData *emojiData = [txtName dataUsingEncoding:NSUTF8StringEncoding];
NSString *emojiTxtName = [[NSString alloc] initWithData:emojiData encoding:NSNonLossyASCIIStringEncoding];
 cell.txtName.text = emojiTxtName;
 cell.txtTime.text = chatlistData.time;
 NSString *stringImg = @"image";
 NSString *stringVideo = @"video";
if(![chatlistData.mime_type isEqual: [NSNull null]]){
    if ([chatlistData.mime_type rangeOfString:stringImg].location == NSNotFound || [chatlistData.mime_type rangeOfString:stringVideo].location == NSNotFound) {
            if ([chatlistData.mime_type rangeOfString:stringImg].location == NSNotFound) {
                cell.txtMsg.text = @"Image";
            }else if([chatlistData.mime_type rangeOfString:stringVideo].location == NSNotFound){
                cell.txtMsg.text = @"Video";
            }
    }else {
        NSString *txtMsg = chatlistData.body;
        NSData *emojiData = [txtMsg dataUsingEncoding:NSUTF8StringEncoding];
        NSString *emojiTxtMsg = [[NSString alloc] initWithData:emojiData encoding:NSNonLossyASCIIStringEncoding];
        cell.txtMsg.text = emojiTxtMsg;
    }
}else {
    NSString *txtMsg = chatlistData.body;
    NSData *emojiData = [txtMsg dataUsingEncoding:NSUTF8StringEncoding];
    NSString *emojiTxtMsg = [[NSString alloc] initWithData:emojiData encoding:NSNonLossyASCIIStringEncoding];
    cell.txtMsg.text = emojiTxtMsg;

}
return cell;

}

- (void)tableView:(UITableView *)tableview didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
       //http://app.wazapper.com/api/users/inbox/45/#api_917838828123
       ChatListData *chatlistData = [chatList objectAtIndex:indexPath.row];
       if(![chatlistData.contact isEqual: [NSNull null]]){
            NSString *chatUrl = [NSString            stringWithFormat:@"http://app.wazapper.com/api/users/inbox/%@/#api_%@", [[User  sharedInstance] userId], chatlistData.contact];
           chatViewController.chatUrl = chatUrl;
          [[NSNotificationCenter defaultCenter]         postNotificationName:@"ChangeChatList" object:chatUrl];
      }
   }

这是我的一小段代码,请给我一些想法,我已经在UITableView添加了搜索栏,我只需要一个逻辑用于此目的。

2 个答案:

答案 0 :(得分:1)

UI实施:

- (void)setupSearchBar {
CGFloat ySearchBarPosition = self.navigationController.navigationBar.bounds.size.height;
CGRect viewBounds = self.view.bounds;

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(CGRectGetMinX(viewBounds), ySearchBarPosition, CGRectGetWidth(viewBounds), kHeightDefault44)];
self.searchBar.backgroundImage = [[UIImage alloc] init];
self.searchBar.barTintColor = kYourBarTintColor;
self.searchBar.tintColor = kYourTintColor;
self.searchBar.delegate = self;
self.searchBar.placeholder = NSLocalizedString(@"searchBar.placeholder", nil);
self.searchBar.showsCancelButton = YES;

for (UIView *subview in self.searchBar.subviews) {
    for (UIView *subSubview in subview.subviews) {
        if ([subSubview conformsToProtocol:@protocol(UITextInputTraits)]) {
            UITextField *textField = (UITextField *)subSubview;
            textField.returnKeyType = UIReturnKeyDone;
            textField.backgroundColor = kColorUnregisteredDevicesSearchBarBackground;
            textField.textColor = kColorUnregisteredDevicesSearchBarText;
        }
        if ([subSubview isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
            UIButton *cancelBarButton = (UIButton *)subSubview;
            cancelBarButton.tintColor = kColorUnregisteredDevicesSearchBarCancelButtonTintColor;
        }
    }
}
self.tableView.tableHeaderView = self.searchBar;
self.tableView.contentOffset = CGPointMake(0.0, self.tableView.tableHeaderView.bounds.size.height);
}

在此代码行之前调用此方法来创建tableView:

[self.view addSubview:self.yourTableView];

功能实施: 1.您必须在.h类中添加 UISearchBarDelegate 。 2.使用此委派方法:

// delegation methods
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    [self reloadModelAndTable];
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    self.searchBar.text = @"";
    [self.tableView reloadData];
    [self.searchBar resignFirstResponder];
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [self.searchBar resignFirstResponder];
}

// private methods
- (void)reloadModelAndTable:(NSTimer *)timer {
    [self filterModelForSearch:self.searchBar.text];
    [self.tableView reloadData];
}

- (void)filterModelForSearch:(NSString *)searchText {
    NSMutableArray *records = (NSMutableArray *)[self.unregisteredDevicesList mutableCopy];

    NSIndexSet *resultSet = [records indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    YourModel *model = (YourModel *)obj;
    BOOL hasObjects = [self resultHasObjects:model withSearchText:searchText];
    return hasObjects;
}];

    self.yourArrayWhichPopulatesTheTable = [[records objectsAtIndexes:resultSet] mutableCopy];
}

- (BOOL)resultHasObjects:(YourModel *)model withSearchText:(NSString *)searchText{
    // I consider you make search for name
    return ((model.name.length > 0) && [self containsString:model.name searchText:searchText]);
}

- (BOOL)containsString:(NSString *)haystack searchText:(NSString *)needle {
    if (haystack) {
        NSRange range = [haystack rangeOfString:needle options:NSCaseInsensitiveSearch | NSDiacriticInsensitiveSearch];
        return range.location != NSNotFound;
    }
    return NO;
}

此代码非常完美。祝好运!如果不清楚,请告诉我。:)

答案 1 :(得分:1)

首先将UISearchBarDelegate添加到ViewController,然后添加此方法以过滤搜索。

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{

NSPredicate *pre0 = [NSPredicate predicateWithFormat:@"Fname contains[cd] %@", searchText];

NSPredicate *pre1 = [NSPredicate predicateWithFormat:@"Lname contains[cd] %@", searchText];

NSPredicate *preAll = [NSCompoundPredicate orPredicateWithSubpredicates:@[pre0, pre1]];

NSArray *filterAry=  [jsonAry filteredArrayUsingPredicate:preAll];

}