2013-01-31 27 views
5

सवाल है, यहाँ हल किया जाता है है कि कैसे मैं मेरे जैसे noobs के लिए भविष्य में संदर्भ के लिए यह तय मैं व्हाइट-स्पेस को दूर करने की जरूरत: ship.countryOfbuild = [[elements objectAtIndex:0] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];NSPredicate के साथ वस्तुओं की NSMutableArray के माध्यम से सर्च कर रहे हैं

और मैं करना पड़ा इस तरह विधेय बदलने के लिए: 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)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 टुकड़े के माध्यम से खोज करने के लिए खोज करना चाहते हैं:

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

searchResults = [searchContent filteredArrayUsingPredicate:resultPredicate]; 
} 

searchContent एक परिवर्तनशील सरणी इस तरह एक .csv-फ़ाइल से पढ़ने है वस्तु (नाम, आकार, shipclass आदि)

वर्तमान में, इस त्रुटि के साथ दुर्घटनाओं:

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

कार्गोशिप मेरा एनएसओब्जेक्ट क्लास है।

क्रैश किए बिना ऑब्जेक्ट्स के साथ NSMutableArray के माध्यम से खोजने के लिए मैं NSPredicate को कैसे ठीक करूं?

यहाँ पूर्ण कोड है कि अगर सामान आसान http://pastebin.com/sw12GwHK

उत्तर

6

आपको यह त्रुटि मिलती है क्योंकि एक जहाज संग्रह नहीं है, इसलिए आप इसमें शामिल नहीं हो सकते हैं - मुझे लगता है कि आपको अपने जहाज ऑब्जेक्ट में किसी विशेष फ़ील्ड की खोज करने की आवश्यकता है, और इसमें शामिल न करें:

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

जैसे आप खोज में जंगली कार्ड का उपयोग कर सकते हैं। आप शब्दों की शुरुआत या अंत की खोज के लिए BEGINSWITH या ENDSWITH का भी उपयोग कर सकते हैं।

+0

यह बहुत अच्छा है, यह अब कम से कम दुर्घटनाग्रस्त नहीं है। लेकिन 1) खोज हमेशा खाली आती है। (लॉग और स्क्रीन पर) और 2) मैं इसे सभी 15 क्षेत्रों में कैसे खोजूं? धन्यवाद :) –

+0

@ ऑस्करएपलैंड, सबसे पहले आपको यह पता लगाना होगा कि यह क्यों काम नहीं करता है। आपको कुछ लॉगिंग करने की ज़रूरत है। लॉग इन self.searchContent यह सुनिश्चित करने के लिए कि इसमें वह है जो आप चाहते हैं। फिर self.searchContent [0] [@ "shipbuilder"] लॉगिंग करने का प्रयास करें, और देखें कि क्या आप जो उम्मीद करते हैं वह लौटाता है। – rdelmar

+0

लॉगिंग सर्च सामग्री मुझे बहुत कुछ '" <कार्गोशिप: 0x758c700> ", " <कार्गोशिप: 0x758c900> ", " <कार्गोशिप: 0x758cb10> ", 'इन तरह की चीजें देता है। 450 के बारे में, मेरे .csv डेटा स्रोत में लाइनों की मात्रा। self.searchContent [0] [@ "shipbuilder"] ऐप को क्रैश करता है '[कार्गोशिप ऑब्जेक्टफॉरकेडस्क्रिप्टस्क्रिप्ट:]: अज्ञात चयनकर्ता उदाहरण 0xb9e9370 2013-01-31 1 9: 27: 57.323 एलएनजी [35488: c07] *** असीमित अपवाद के कारण ऐप को समाप्त करना 'एनएसआईएनवालिडअर्ग्यूमेंट एक्सेप्शन', 'त्रुटि कोड। –

4

अपने विधेय में SELF का प्रयोग न करें बनाता है, के बाद से है कि एक CargoShip की वास्तविक उदाहरण का उपयोग करेगा। आपके लिंक किए गए उदाहरण में SELF अच्छा काम करता है, क्योंकि यह NSString है।

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

आप उदाहरण के लिए की तरह कुछ कर सकते हैं। इत्यादि।

+0

ऐसा करने से बजाय इस तरह: '[NSPredicate predicateWithFormat: @" (countryOfBuild शामिल हैं [सीडी]% @) (जहाज़ शामिल हैं [सीडी]% @) ", searchText];' रिटर्न त्रुटि: '*** अपरिपक्व अपवाद के कारण ऐप को समाप्त करना 'एनएसआईएनवालिडअर्गमेंट एक्सेप्शन', कारण: 'प्रारूप स्ट्रिंग को पार्स करने में असमर्थ" (देशऑफबिल्ड में [सीडी]% @ है) (शिपबिल्डर में [सीडी]% @) "'' क्या मैं इसे गलत कर रहा हूं/मैं इसे ठीक से कैसे कर सकता हूं? –

+0

क्षमा करें, वाक्यविन्यास का कुछ हिस्सा भूल गए -> ') या' – fguchelaar

+0

होली फ़्लॉइंग हैम्स्टर यह काम करता है @! : डी बहुत बहुत धन्यवाद! –

3

मैं का उपयोग करें:

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

Links to documentation

+0

यह प्रश्न एक वर्ष से अधिक पुराना है, मैंने इसे बहुत पहले हल किया था, लेकिन धन्यवाद: पी –