2016-11-29 1 views
0

사용자가 UITableView을 검색하고 다양한 입력을 기반으로 결과를 표시 할 수있게하려는 iOS 앱을 만들고 있습니다. "OR"로 구분 된 여러 조건을 가진 NSPredicate를 사용하고 있습니다. 그러나 어떤 이유로 그것은 첫 번째 조건 만 검색하고 다른 조건은 검색하지 않습니다.NSPredicate 형식 지정 문제

은 여기 내 자 NSPredicate 포맷 방법은 다음과 같습니다

let searchPredicate = NSPredicate(format: "(SELF.firstName CONTAINS[c] 
%@) OR (SELF.lastName CONTAINS[c] %@) OR (SELF.major CONTAINS[c] %@) OR 
(SELF.year CONTAINS[c] %@) OR (SELF.gpa CONTAINS[c] %@)", 
searchController.searchBar.text!) 

내 매개 변수 이름, 성, 주, 연도 및 GPA 있습니다. 검색 창에 이름 이외에 아무 것도 입력하지 않으면 결과가 표시되지 않습니다. 그러나 이름을 입력하면 실제로 성냥을 반환합니다. 왜 이런 일이 일어나는 걸까요? 내 NSPredicate 형식이 잘못 되었습니까?

답변

1
if let text = searchController.searchBar.text, text.characters.count > 0{ 
    var predicates = [NSPredicate]() 
    predicates.append(NSPredicate(format: "self.firstName CONTAINS[c]",text)) 
    predicates.append(NSPredicate(format: "self.lastName CONTAINS[c]",text)) 
    predicates.append(NSPredicate(format: "self.major CONTAINS[c]",text)) 
    predicates.append(NSPredicate(format: "self.year CONTAINS[c]",text)) 
    predicates.append(NSPredicate(format: "self.gpa CONTAINS[c]",text)) 

    let searchPredicate:NSPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates) 

    } 
1

프리디 케이트에 %@ 형식 지정자의 인스턴스가 5 개 있으므로 5 개의 값을 전달해야합니다. 당신은 하나만 전달하고 있습니다.

searchController.searchBar.text! 번을 다섯 번 반복해야합니다. BTW - 안전하게 unwrapped 변수에 할당하고 해당 변수를 다섯 번 반복하십시오. 그것은 덜 입력됩니다.

if let srch = searchController.searchBar.text { 
    let searchPredicate = NSPredicate(format: "(SELF.firstName CONTAINS[c] %@) OR 
     (SELF.lastName CONTAINS[c] %@) OR 
     (SELF.major CONTAINS[c] %@) OR 
     (SELF.year CONTAINS[c] %@) OR 
     (SELF.gpa CONTAINS[c] %@)", srch, srch, srch, srch, srch) 
    ... 
} 

는 사실이 시도하지 않은하지만 당신은 %[email protected] 될 각 %@를 업데이트하여 쉽게 만들 수 있습니다. 그런 다음 한 번만 searchController.searchBar.text!을 지정하면됩니다.

let searchPredicate = NSPredicate(format: "(SELF.firstName CONTAINS[c] %[email protected]) OR 
    (SELF.lastName CONTAINS[c] %[email protected]) OR 
    (SELF.major CONTAINS[c] %[email protected]) OR 
    (SELF.year CONTAINS[c] %[email protected]) OR 
    (SELF.gpa CONTAINS[c] %[email protected])", searchController.searchBar.text!) 
+0

자 NSPredicate 위치 매개 변수를 지원하지 않습니다. –

+0

@ Martin 감사합니다. 나는 그 시점에 확신하지 못했습니다. – rmaddy

0

테스트하지하지만이 일을하고 모든 subpredicates가 같은 경우 아마 스위프트에 대한 간단한 구문입니다해야 내가 선택할 것, 정적, 간단한 들어

if let text = searchController.searchBar.text { 
    let myCompondPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: ["firstName", "lastName", "major", "year", "gpa"].map { 
     NSPredicate(format: "%K CONTAINS[c] %@", $0, text) 
    }) 

    // Do something with myCompondPredicate here.. 
} 
0

, 다음과 같이 술어 기본 스위프트 방법 :

import Foundation 

struct Student { 
    let firstName: String 
    let lastName: String 
    let major: String 
    let gpa: Double 
} 

extension Student { 
    func anyFields(contain searchString: String) -> Bool { 
     return firstName.contains(searchString) 
      || lastName.contains(searchString) 
      || major.contains(searchString) 
      || String(gpa).contains(searchString) 
    } 

    // Alternate implementation: 
    /* 
    func anyFields(contain searchString: String) -> Bool { 
     return [firstName, lastName, major, String(gpa)].contains(where: { field in 
      field.contains(searchString) 
     }) 
    } */ 
} 


let matchingStudents = students.filter(Student.anyFields(contain:)) 
관련 문제