因“NSInvalidArgumentException”而终止应用程序'

时间:2014-07-15 11:18:12

标签: ios uitableview

我正在尝试从TableView,细胞有详细信息视图中搜索我的数组内容。当我在刺激器中运行我的应用程序时,它会运行,但是当我动态插入对象并尝试搜索它们的应用程序崩溃时用& #39; NSInvalidArgumentException&#39 ;.  理由:

'Can't use in/contains operator with collection <customcells: 0x8ea3b40> (not a collection)'. 

我的代码有Predicates

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

self.searchedarray = nil;

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [cd] %@", self.searchtext.text];

 self.searchedarray =[NSMutableArray arrayWithArray :[contactsarray filteredArrayUsingPredicate:predicate]];
}

以及

  -(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {

[searchedarray removeAllObjects];
// Filter the array using NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name CONTAINS[c] %@", searchText];    
searchedarray = [NSMutableArray arrayWithArray:[contactsarray filteredArrayUsingPredicate:predicate]];

}

帮助我,我遇到了这个Predicate错误;使用Like代替包含也没有帮助。

已修改内容

 - (void)viewDidLoad
  {

 contactsarray = [[NSMutableArray alloc] init];

 self.searchedarray = [NSMutableArray arrayWithCapacity:[contactsarray count]];

[super viewDidLoad];

self.navigationItem.rightBarButtonItem = self.editButtonItem;
UIBarButtonItem *addButton = [[UIBarButtonItem alloc]
                              initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                             target:self
                             action:@selector(insertNewObject:)];
self.navigationItem.rightBarButtonItem = addButton;

}
- (void)insertNewObject:(id)sender
{



customcells *new = [[customcells alloc] init];
new.name = @"Enter Name";
new.contacts=@" Enter Contact Number";
new.organisation=@"Enter Organisation Name";
[contactsarray insertObject:new atIndex:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[indexPath]
                  withRowAnimation:UITableViewRowAnimationAutomatic];
 }
- (void)didReceiveMemoryWarning
 {
 [super didReceiveMemoryWarning];

}



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

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {// Return the number of rows in the section.
 if (tableView == self.searchDisplayController.searchResultsTableView) {
    return [searchedarray count];
  } else {
    return [contactsarray count];
 }

 }

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

 static NSString *CellIdentifier = @"cell";
 UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
customcells *myarray= [contactsarray objectAtIndex:indexPath.row];
cell.textLabel.text = myarray.name;
cell.textLabel.text = [NSString stringWithFormat:@"%@",
                       myarray.name];

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;
       cell.textLabel.text = [NSString stringWithFormat:@"%@",
                              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:[NSMutableArray 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
 }

 }


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

 self.searchedarray = nil;

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [cd] %@", self.searchtext.text];

 self.searchedarray =[NSMutableArray arrayWithArray :[contactsarray filteredArrayUsingPredicate:predicate]];
 }


 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
 if ([[segue identifier] isEqualToString:@"showDetail"])
 {
  NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
 customcells *new = contactsarray[indexPath.row];
 [[segue destinationViewController] setDetailItem:new];
 // Get the new view controller using [segue destinationViewController].
 // Pass the selected object to the new view controller.
}
 }
-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {

[searchedarray removeAllObjects];
// Filter the array using NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name CONTAINS[c] %@", searchText];   
 searchedarray = [NSMutableArray arrayWithArray:[contactsarray filteredArrayUsingPredicate:predicate]];


}


-(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 :(得分:1)

您的代码在NSPredicate中使用'contains',它假定您的数组中的每个元素都可以使用'contains'进行匹配。你有一个customcells数组,默认情况下不会有任何处理包含匹配器的方法。

在你的第二个例子中,使用self.name CONTAINS[c] %@,你最终匹配name属性,这是一个字符串,所以我希望这可以工作(虽然我没有尝试过)。您提供的第一个示例是尝试直接匹配customcells对象,因此我建议在这种情况下也使用self.name