2013-10-30 31 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; 
} 

hotelArrayfilteredArrayNSArray秒。如何使用上一個對象的屬性謂詞過濾的NSArray

hotelArrayhotel類型的對象,其中hotel有一個屬性name

問題: 我想根據hotel.name過濾hotelArraysearchText [文本字段]進入hotel.name匹配的文本,但我得到一個空self.filteredArray

+0

檢查這一項http://stackoverflow.com/questions/1473973/nspredicate-case-insensitive-matching-on-to-many-relationship –

+0

你的問題是缺少。你發佈的代碼有什麼問題? – mAu

+0

@Vishwa Patel該代碼不適合我。使用ANY會導致模擬器崩潰。 – shifu

回答

56

嘗試以下行,並確保properyName是區分大小寫的。並且您已將,置於謂詞格式,這就是爲什麼它不起作用。用下面的代碼替換你的代碼。

目標C

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

夫特

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

使用迅速filter

var searchText = "Galaxy" 

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

雨燕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)") 

雨燕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

它不工作。 – shifu

+0

[NSString「sometext%i」,4] IOS使它不是字符串,而是錯誤。 – shifu

+0

Swift 3不能正常工作 – Anees

0

我不知道這是否是你想要做什麼:

-(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

我不想通過元素循環。 – shifu

+0

我想使用filteredArrayUsingPredicate或類似的東西 – shifu

5

根據您的資料,您是這種情況:

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

該斷言應該爲你工作:

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

這是可能適用於您的謂詞方法。

-(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. 
} 

包含[c] - 表示謂詞區分大小寫。 包含[CD] - 不區分大小寫字符串

1

結帳這個庫

https://github.com/BadChoice/Collection

它配備了很多方便陣列功能,從來沒有寫一個循環再次

所以,你可以這樣做:

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

或簡單地

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

:)

相關問題