搜索NSMutableArray Crashing rangeOfString:options:]:发送到实例的无法识别的选择器

时间:2012-01-18 20:19:57

标签: iphone xcode parsing exception rss

我的应用程序中的搜索工具出现问题,我注意到这里的一些帖子说我的代码的for循环有问题,你可以在上面的链接中看到以前的帖子

Iphone Programming XML Parser 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 :(得分:0)

     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;
}