UISearchBar不搜索新插入的数据

时间:2014-06-23 07:27:02

标签: ios xcode5

我的表视图中有一个搜索栏,当搜索数组中列出的初始表数据时,一切正常,但是当我动态地将新数据插入表中时,我无法搜索新插入的数据。帮助我被困住了

 #import "contactsTableViewController.h"
 #import "loginpageViewController.h"
 #import "addcontactsViewController.h"
 #import"customcells.h"

   @interface contactsTableViewController ()


 @end
 @implementation contactsTableViewController

 @synthesize contactsarray;
 @synthesize  searchedarray;

 - (IBAction)unwindTocontacts:(UIStoryboardSegue *)segue
 { 
 addcontactsViewController *source = [segue sourceViewController];
 customcells *item = source.contacts;
 if (item != nil) 
 {
    [self.contactsarray addObject:item];
    [self.tableView reloadData];
}
}

- (void)viewDidLoad
{


 contactsarray=[[NSMutableArray alloc]init];
 self.searchedarray = [NSMutableArray arrayWithCapacity:[contactsarray count]];    
[self loadInitialData];
[super viewDidLoad];

}
- (void)loadInitialData {
customcells *item1 = [[customcells alloc] init];
item1.name = @"Arun";
[self.contactsarray addObject:item1];
customcells *item2 = [[customcells alloc] init];
item2.name = @"Balaji";
[self.contactsarray addObject:item2];
customcells *item3 = [[customcells alloc] init];
item3.name = @"Chandru";
[self.contactsarray addObject:item3];


}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

// Return the number of sections.
return 1;
}

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

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:     (NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"Prototypecells";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if(cell==nil)
{
    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];


   if (tableView == self.searchDisplayController.searchResultsTableView)
   {
   customcells *newarray   = [searchedarray objectAtIndex:indexPath.row];
       cell.textLabel.text =newarray.name;
   } else {
       customcells *myarray= [contactsarray objectAtIndex:indexPath.row];
       cell.textLabel.text = myarray.name;
   }
  }
       return cell;
  }



 // Override to support conditional editing of the table view.
   - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
 {
// Return NO if you do not want the specified item to be editable.
return YES;
 }
 // Override to support editing the table view.
 - (void)tableView:(UITableView *)tableView commitEditingStyle:  (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
 {

if (editingStyle == UITableViewCellEditingStyleDelete) {
    // Delete the row from the data source
   NSMutableArray *tempContent = [self.contactsarray mutableCopy];
    [tempContent removeObject:[tempContent                                                                objectAtIndex:indexPath.row]];
   self.contactsarray = tempContent;
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

} else if (editingStyle == UITableViewCellEditingStyleInsert) {

    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}

}

// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the item to be re-orderable.
return YES;
}

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
// Update the filtered array based on the search text and scope.
// Remove all objects from the filtered search array
[self.searchedarray removeAllObjects];
// Filter the array using NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",searchText];
searchedarray = [NSMutableArray arrayWithArray:[contactsarray filteredArrayUsingPredicate:predicate]];

}

#pragma mark - UISearchDisplayController Delegate Methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
// Tells the table data source to reload when text changes
[self filterContentForSearchText:searchString scope:
 [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:   [self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
// Tells the table data source to reload when scope bar selection changes
[self filterContentForSearchText:self.searchDisplayController.searchBar.text scope:
 [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
// Return YES to cause the search result table view to be reloaded.
return YES;
}
@end

1 个答案:

答案 0 :(得分:0)

看起来您已经实现了UISearchDisplayController委托 - 但是每次输入新字符时实际过滤数组,您还需要实现UISearchBar委托方法textDidChange。使用该方法过滤数据。

这是我写过的一个演示项目 - 希望它有所帮助:https://github.com/versluis/TableSearch2014