2013-01-31 63 views
5

的问题是解决了,这里是我如何固定它以供将来参考的菜鸟和我一样 我需要删除空白频段: ship.countryOfbuild = [[elements objectAtIndex:0] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];通过对象的NSMutableArray与NSPredicate搜索

我不得不改变这样的断言:NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"(countryOfBuild contains[cd] %@) OR (shipBuilder contains[cd] %@) OR (name contains[cd] %@) OR (owner contains[cd] %@)",searchText, searchText, searchText, searchText];

原来的问题

我使用this tutorial到搜索栏添加到我的项目。我得到了所有的工作表,但搜索功能崩溃的应用程序。我现在的搜索方式是:

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
NSPredicate *resultPredicate = [NSPredicate 
           predicateWithFormat:@"SELF contains[cd] %@", 
           searchText]; 

searchResults = [searchContent filteredArrayUsingPredicate:resultPredicate]; 
} 

searchContent是可变数组从.csv文件是这样写着:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
NSString* pathToFile = [[NSBundle mainBundle] pathForResource:@"ships" ofType: @"csv"]; 

NSString *file = [[NSString alloc] initWithContentsOfFile:pathToFile encoding: NSUTF8StringEncoding error:NULL]; 

NSArray *allLines = [file componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; 


searchContent   = [[NSMutableArray alloc] init]; 


for (NSString* line in allLines) { 
    NSArray *elements = [line componentsSeparatedByString:@";"]; 

    CargoShips* ship = [[CargoShips alloc]init]; 
    ship.countryOfbuild = [elements objectAtIndex:0]; 
    ship.shipBuilder =  [elements objectAtIndex:1]; 
    ship.hullHashtag =  [elements objectAtIndex:2]; 
    ship.name =   [elements objectAtIndex:3]; 
    ship.owner =   [elements objectAtIndex:4]; 
    ship.shipOperator = [elements objectAtIndex:5]; 
    ship.shipDelivery = [elements objectAtIndex:6]; 
    ship.shipFlag =  [elements objectAtIndex:7]; 
    ship.shipClass =  [elements objectAtIndex:8]; 
    ship.powerPlant =  [elements objectAtIndex:9]; 
    ship.HP =    [elements objectAtIndex:10]; 
    ship.speed =   [elements objectAtIndex:11]; 
    ship.cargoSystem =  [elements objectAtIndex:12]; 
    ship.numberOfTanks = [elements objectAtIndex:13]; 
    ship.size =   [elements objectAtIndex:14]; 
    [self.searchContent addObject:ship]; 
} 

我想搜索通过所有15个的搜索对象(名称,大小,shipclass等)

目前,这个崩溃与错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't use in/contains operator with collection <CargoShips: 0x714e1b0> (not a collection)'

CargoShips是我的NSObject类。

如何修复NSPredicate以通过NSMutableArray搜索没有崩溃的对象?

以下是完整的代码,如果让东西更容易http://pastebin.com/sw12GwHK

回答

6

你得到这个错误,因为一艘船不是集合,所以你不能使用包含 - 我认为你需要在你的船对象中搜索一个特定的领域,并使用LIKE不CON CONINS:

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.shipBuilder LIKE[cd] %@",searchText]; 

与LIKE一样,您可以在搜索中使用通配符。您也可以使用BEGINSWITH或ENDSWITH搜索单词的开头或结尾。

+0

这很棒,它至少不会崩溃。但1)搜索总是返回空白。 (在日志和屏幕上)和2)如何使它搜索全部15个字段?谢谢:) –

+0

@OscarApeland,首先你需要找出为什么这不起作用。你需要做一些日志记录。记录self.searchContent以确保它具有您想要的内容。然后尝试记录self.searchContent [0] [@“shipBuilder”],并查看它是否会返回所期望的结果。 – rdelmar

+0

Logging searchContent为我提供了很多'“”, “”, “”,“这些东西。大约450,我的.csv数据源中的行数。 self.searchContent [0] [@“shipBuilder”]使用[[CargoShips objectForKeyedSubscript:]:无法识别的选择器发送到实例0xb9e9370 2013-01-31 19:27:57.323 LNG [35488:c07]导致应用程序崩溃***由于未捕获异常'NSInvalidArgumentException',错误代码而终止应用程序。 –

4

不要在您的谓语用SELF,因为它将使用CargoShip的实际情况。在你的链接示例中,SELF工作良好,因为它是NSString

例如你可以这样做:

@"(countryOfBuild contains[cd] %@) OR (shipBuilder contains[cd] %@)"。等等等等。

+0

这样做,而不是像这样:'[NSPredicate predicateWithFormat:@“(countryOfBuild包含[CD]%@)(造船包含[CD]%@) “, searchText];'返回错误:'***由于未捕获异常'NSInvalidArgumentException',原因:'无法解析格式字符串'(countryOfBuild包含[cd]%@)终止应用程序(shipBuilder包含[cd]%) @)“''我做错了/我该如何正确地做? –

+0

对不起,忘记了部分语法 - >'OR' – fguchelaar

+0

HOLY FLYING HAMSTERS IT WORKS @! :D非常感谢! –

3

我用:

NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self.youProperty contains[c] %@", searchString]; 
searchArrayObjects = [arrayObjects filteredArrayUsingPredicate:resultPredicate]; 

Links to documentation

+0

这个问题已经一年多了,我很久以前就解决了,但是谢谢:P –