通过NSMutableArray进行NSPredicate搜索

时间:2014-08-11 13:30:48

标签: ios objective-c uitableview nsmutablearray

我有一个视图控制器,它从我的Web服务中检索地址信息,将其存储在一个可变数组中,然后在表视图中显示每个地址。我在同一个视图控制器上有一个搜索栏,我想搜索每个地址并显示结果。我使用了测试NSArray,但是我不确定我需要对filterContentForSearchText函数做什么才能让它搜索NSMutableArray。任何帮助表示赞赏。

对象类

//  Branches.h

@interface Branches : NSObject
@property (nonatomic, retain) NSString *BranchAddress;
@end

查看控制器类

//  ViewController.h

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchDisplayDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@end

//  ViewController.m

#import "AFHTTPRequestOperationManager.h"
#import "ViewController.h"
#import "Branches.h"

@interface ViewController () {
    NSMutableArray *array;
}
@property (strong, nonatomic) NSArray *searchResults;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Initialize myArray
    array = [[NSMutableArray alloc] init];

    // Set POST parameters
    NSDictionary *parameters = @{@"key" : @"value"};

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager POST:@"webservice_address" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        // Check to see if responseObject contains data
        if (responseObject != nil) {

            // Loop through JSON
            for (NSDictionary *dictionary in responseObject) {

                // Initialize object
                Branches *branches    = [[Branches alloc] init];
                branches.branchAddress = [dictionary objectForKey:@"Object"];
                // Add object to myArray
                [array addObject:branches];

                [self.tableView reloadData];
            }
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

}

#pragma Table View Methods

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return [self.searchResults count];

    } else {
        return [array count];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"cellID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    }
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row];

    } else {
        cell.textLabel.text = [[array objectAtIndex:indexPath.row] BranchAddress];
    }
    return cell;

}

#pragma Search Methods

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSArray *masterArray    = array;
    NSArray *searchResults  = [masterArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(Branches *evaluatedObject, NSDictionary *bindings) {
        //NSLog(@"%@", evaluatedObject.BranchAddress);
        return ([evaluatedObject.BranchAddress rangeOfString: searchText options:NSCaseInsensitiveSearch].location != NSNotFound);
    }]];
    NSLog(@" %i", searchResults.count);
    //[searchResults removeAllObjects];
    //[searchResults addObjectsFromArray:searchResults];

    //reload after this
    NSLog(@"%@", [searchResults objectAtIndex:0]);
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}

@end

1 个答案:

答案 0 :(得分:0)

你可以尝试这个

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSArray *masterArray    = self.array; 
    NSArray *resultsArray  = [masterArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(Branches *evaluatedObject, NSDictionary *bindings) {
        return ([evaluatedObject.BranchAddress rangeOfString: searchText options:NSCaseInsensitiveSearch].location != NSNotFound);
    }]];
    //edited
    [self.searchResults removeAllObjects]; //self.searchResults should be mutable array 
    [self.searchResults addObjectsFromArray:resultsArray];//put the new values to searchResults

     //after this self.searchResults contains objects of filtered Branches u can get the values for example
     NSLog(@"%@", [[self.searchResults objectAtIndex:0] BranchAddress]);//self.searchResults contains objects of Branches not the string itself 

    //reload after this 
}