2013-10-30 12 views
23
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    [self.map removeAnnotations:self.map.annotations]; 
    if ([textField isEqual:self.searchText]) { 
     NSPredicate *bPredicate = 
     [NSPredicate predicateWithFormat:@"name contains[c], %@",self.searchText.text]; 

     self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:bPredicate]; 
     NSLog(@" HEARE %@",self.filteredArray); 
     [self markAllHotels]; 
    } 
    return YES; 
} 

hotelArray und filteredArray sind NSArray s filtern.Wie NSArray mit Prädikat auf eine Objekteigenschaft

hotelArray hat Objekte vom Typ hotel, wobei hotel eine Eigenschaft name hat.

Problem: Ich mag nach filtern hotelArray zu hotel.name wenn hotel.name Streichhölzern Text in searchText [Textfeld] eingegeben, aber ich bin immer ein leeres self.filteredArray.

+0

prüfen dieses http://stackoverflow.com/questions/1473973/nspredicate-case-insensitive-matching-on-to-many-relationship –

+0

Ihre Frage fehlt. Welche Probleme hast du genau mit deinem geposteten Code? – mAu

+0

@ Vishwa Patel, dass Code für mich nicht funktioniert. mit ANY stürzt der Simulator ab. – shifu

Antwort

56

Versuchen Linien folgen, und stellen Sie sicher, properyName Groß- und Kleinschreibung. und Sie haben , im Prädikat-Format platziert, deshalb funktioniert es nicht. Ersetzen Sie einfach Ihren Code durch folgenden.

Objective C

NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF.name contains[cd] %@",self.searchText.text]; 
self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:bPredicate]; 
NSLog(@"HERE %@",self.filteredArray); 

Swift

var bPredicate: NSPredicate = NSPredicate(format: "SELF.name contains[cd] %@", self.searchText.text) 
self.filteredArray = self.hotelArray.filteredArrayUsingPredicate(bPredicate) 
NSLog("HERE %@", self.filteredArray) 

Mit schnellen filter

var searchText = "Galaxy" 

let filteredArray = hotelArray.filter { $0["name"] == searchText } 
print("** Result ** \n\(filteredArray)") 

Swift 3,0

let arrEmp = [["name": "James", "age" : 27, "city" : "New york"], 
        ["name": "Johnson", "age" : 24, "city" : "London"], 
        ["name": "Alex", "age" : 28, "city" : "Newark"], 
        ["name": "Mark", "age" : 25, "city" : "Paris"], 
        ["name": "Steve", "age" : 25, "city" : "Silicon Valley"], 
        ["name": "Lary", "age" : 28, "city" : "New york"]] 

// *** Filter by Name exact match *** 
var filterByName = arrEmp.filter { $0["name"] == "Mark" } 
print("filterByName \(filterByName)") 

// *** Filter by Age *** 
var filterByAge = arrEmp.filter { $0["age"] as! Int > 25 } 
print("filterByAge \(filterByAge)") 

Swift 4,0

var filterByName = arrEmp.filter 
do { 
    $0["name"] == "Mark" 
} 
print("filterByName filterByName)") 

var filterByAge = arrEmp.filter 
do { 
    $0["age"] as! Int > 25 
} 
print("filterByAge filterByAge)") 
+0

es funktioniert nicht. – shifu

+0

[NSString "Sometext% I", 4] IOS macht es Nummer nicht Zeichenfolge, die der Fehler war. – shifu

+0

Swift 3 funktioniert nicht – Anees

0

Ich bin mir nicht sicher, ob dies ist, was Sie tun möchten:

-(NSArray*)searchString:(NSString*)stringToSearch inArray:(NSArray*)myArray 
{ 
    NSMutableArray* filtredArray = [[NSMutableArray alloc] init]; 
    for (NSString* elmnt in myArray) 
    { 
     if ([elmnt rangeOfString:stringToSearch].location != NSNotFound) [fitredArray addObject:elmnt]; 
    } 
    return filtredArray; 
} 
+0

ich möchte nicht Elemente durchlaufen. – shifu

+0

Ich möchte filteredArrayUsingPredicate oder etwas ähnliches verwenden – shifu

5

Basierend auf Informationen, ist dies Ihre Situation:

self.hotelArray  // Array in which we perform a search 
self.filteredArray // Result array 
name     // Property of the object used for the predicate 

Dieses Prädikat sollte für Sie arbeiten:

NSString *searchText = self.searchText.text; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name contains[c] %@", searchText]; 
self.filteredArray = [self.hotelArray filteredArrayUsingPredicate:predicate]; 
1

Dies ist die Prädikatmethode, die für Sie arbeiten könnte.

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    [filteredContactArray removeAllObjects]; 

    NSArray *tempArray = [hotelArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name contains[c] %@ OR name contains[cd] %@",searchText]]; 

    filteredArray = [NSMutableArray arrayWithArray:tempArray];//if you want the filtered array to be mutable or tempArray will work as as desired by you. 
} 

enthält [c] - bedeutet das Prädikat mit Groß-/Kleinschreibung. enthält [cd] - Groß- und Kleinschreibung Zeichenfolge

1

Kasse diese Bibliothek

https://github.com/BadChoice/Collection

Es gibt viele einfache Array-Funktionen kommt nie wieder eine Schleife schreiben

So können Sie einfach tun:

NSArray* hotels = [self.hotelArray filter:^BOOL(Hotel *hotel) { 
    [return hotel.name isEqualToString:searchText]; 
}]; 

oder einfach

NSArray* hotels = [self.hotelArray where:@"name" is:searchText]; 

:)