Поиск NSMutableArray Crashing rangeOfString: options:]: нераспознанный селектор, отправленный экземпляру - PullRequest
0 голосов
/ 19 января 2012

У меня проблема с функцией поиска в моем приложении, и я заметил, что некоторые публикации здесь говорят о том, что есть проблема с циклом for моего кода, который вы можете увидеть по ссылке ниже из предыдущей публикации.

Анализатор XML для программирования Iphone NSMutableArray

Это комментарий другого человека с такой же проблемой, и я просто хотел бы знать, является ли проблема той же для моегопроект "Объекты в вашем поисковом массиве являются объектами NSArray, это означает, что они не реагируют на селектор rangeOfString: так как это метод NSString", и если это так, могу ли я использовать решение, подобное этому.

for(NSArray *array in searchArray)
  {
// NSString *str = [array objectAtIndex:0];
PatientInfoObject *obj = [array objectAtIndex:0];
NSString *str = obj.id;
// to be sure
if( [str isKindOfClass:[NSString class]] )
{
   NSRange titleResultsRange = [str rangeOfString:searchText options:NSCaseInsensitiveCompare];
   if( titleResultsRange.length != 0 )
   {
     [copyListOfItems addObject:str];
   }
}
else
{
    // this shouldn't have happened, log something to console
    NSLog(@"**Object in array is not of type NSString**");
 }
}

Вот код для моего UISearchBar, и, как упоминалось выше, ссылка в начале вопросов на большую часть соответствующего кода, если вам нужно что-то еще, я опубликую его.

Спасибо, Брэд

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchtext {
if ([searchtext length] == 0) {
    [self toggleToolBarButtons:NO];
    [[self rssParser]startProcess];
}
else {
    for (NSString * string in _rssParser.rssItems) {
        NSRange r = [string rangeOfString:searchtext options:NSCaseInsensitiveSearch];
        if (r.location != NSNotFound) {
            [_rssParser.rssItems addObject:string];
        }
    }
}
[[self tableView]reloadData];
}

1 Ответ

0 голосов
/ 19 января 2012
     for (NSString * string in _rssParser.rssItems) {

Этот код предполагает, что объекты в массиве rssItems являются NSStrings.Из другого поста видно, что это экземпляры BlogRss.

Может быть, вам нужно что-то вроде:

 NSString *matchingStringToAdd=nil;
 for ( BlogRss * blogRss in _rssParser.rssItems ) {
      NSString *string = blogRss.title;  // or whatever member you're seaching on
      NSRange titleResultsRange = [string rangeOfString:searchText
                                                options:NSCaseInsensitiveCompare];
      if ( titleResultsRange.location != NSNotFound ) {
           matchingStringToAdd = string;
           break;
      }
 }
 if ( matchingStringToAdd ) {
     [rssParser.rssItems addObject:matchingStringToAdd);
 }


-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
if ([searchText length] == 0) {
    //[self toggleToolBarButtons:NO];
    //[[self rssParser]startProcess];
    [displayitems removeAllObjects];
    [displayitems addObjectsFromArray:_rssParser.rssItems];
  } else {
    for ( BlogRss * blogRss in _rssParser.rssItems) {
        NSString *string = blogRss.title;  
        NSRange r = [string rangeOfString:searchText options:NSCaseInsensitiveSearch];
        if (r.location != NSNotFound) {
            [displayitems addObject:blogRss];
        }
    }
}
[[self tableView]reloadData];
}

rssfunviewcontroller.h

@interface RssFunViewController : UIViewController <UITableViewDataSource,UITableViewDelegate,BlogRssParserDelegate,UISearchBarDelegate> {
BlogRssParser * _rssParser;
UITableView * _tableView;
IBOutlet UISearchBar * searchbar;
RssFunAppDelegate * _appDelegate;
UIToolbar * _toolbar;
NSMutableArray * displayitems;
}

cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"rssItemCell"];
if(nil == cell){
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"rssItemCell"]autorelease];
}
cell.textLabel.text = [[displayitems objectAtIndex:indexPath.row]title];
cell.detailTextLabel.text = [[displayitems objectAtIndex:indexPath.row]description];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}

viewdidload

- (void)viewDidLoad {
[super viewDidLoad];
[self toolbarInit];
_rssParser = [[BlogRssParser alloc]init];
self.rssParser.delegate = self;
[[self rssParser]startProcess]; 
displayitems = _rssParser.rssItems;
}
...