2012-01-18 6 views
0

私のアプリで検索機能に問題があり、forループに問題があるとここに掲載されています前の投稿から下のリンクに見ることができる私のコード。検索NSMutableArrayクラッシュrangeOfString:options:]:インスタンスに送信されたセレクタが認識されない

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

答えて

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

はたぶん、あなたのような何かを必要とします

+0

本当にありがとうRayですが、今はすべて捕まえられていません例外は列挙されている間に突然変異しました。私が検索しているメンバーはblogRSS.titleです。 – Bradrob

+0

私はループ内でmodをしないようにコードを修正しましたが、なぜこれをやっているのか尋ねなければなりません。配列内で一致するものを見つけていれば、同じ配列に別のものを追加します。したがって配列に(赤、青、緑、黄)が含まれていて、青で一致するものが見つかった場合は、青を追加してから(赤、青、緑、黄、青)になります。それは本当にあなたが望むものですか? – Rayfleck

+0

私は何をしようとしているのは、インターネット上のチュートリアルに従っていますが、私はそれを調整しようとしているので、私は一緒に練習しているプロジェクトのタイプのために具体的に書かれていません。しかし、私が達成しようとしているのはuisearchbarのためです。配列を繰り返し処理し、一致するsearchTextをフィルタリングしようとしていますが、わかりやすく表示できません。上記の質問に変更されたコードを追加しました。 – Bradrob

関連する問題