2013-10-30 22 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 s.Làm thế nào để lọc NSArray sử dụng vị trên một tài sản đối tượng

hotelArray có các đối tượng thuộc loại hotel trong đó hotel có thuộc tính name.

Vấn đề: Tôi muốn lọc hotelArray theo hotel.name khi hotel.name trận văn bản nhập vào searchText [text field], nhưng tôi nhận được một sản phẩm nào self.filteredArray.

+0

Kiểm tra này một http://stackoverflow.com/questions/1473973/nspredicate-case-insensitive-matching-on-to-many-relationship –

+0

Câu hỏi của bạn là mất tích. Bạn gặp vấn đề gì với mã đã đăng của mình? – mAu

+0

@Vishwa Patel mã đó không hoạt động đối với tôi. bằng cách sử dụng BẤT CỨ đang gặp lỗi trình mô phỏng. – shifu

Trả lời

56

Hãy thử dòng này, và chắc chắn rằng properyName là trường hợp nhạy cảm. và bạn đã đặt , ở định dạng vị từ, đó là lý do tại sao nó không hoạt động. chỉ cần thay thế mã của bạn bằng cách làm theo.

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) 

Sử dụng nhanh chóng 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

nó không hoạt động. – shifu

+0

[NSString "sometext% i", 4] IOS làm cho số không phải là chuỗi đó là lỗi. – shifu

+0

Swift 3 không hoạt động – Anees

0

Tôi không chắc chắn nếu điều này là những gì bạn muốn làm:

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

tôi không muốn lặp qua các phần tử. – shifu

+0

tôi muốn sử dụng filterArrayUsingPredicate hoặc một cái gì đó tương tự – shifu

5

Dựa trên thông tin của bạn, đây là tình hình của bạn:

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

ngữ này nên làm việc cho bạn:

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

Đây là phương pháp dự đoán có thể phù hợp với bạn.

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

chứa [c] - có nghĩa là vị từ có phân biệt chữ hoa chữ thường. chứa [cd] - case insensitive string

1

Thanh toán thư viện này

https://github.com/BadChoice/Collection

Nó đi kèm với rất nhiều chức năng mảng dễ dàng để không bao giờ viết một vòng lặp lại

Vì vậy, bạn chỉ có thể làm:

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

hoặc chỉ đơn giản

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

:)

Các vấn đề liên quan