검색 창이 있고 데이터가 스크롤 뷰로 라벨에 표시됩니다.
예 :
핵심 데이터 필드 :
1.id 2.company
3.
직원 이름
4. 주소
검색 창에 ID, 회사 또는 직원 이름을 입력하면 관련 결과를 표시하고 싶습니다.
내 코드 :
검색 데이터 :
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
var request = NSFetchRequest(entityName: "Agency")
request.returnsObjectsAsFaults = false
var countResult : NSArray = context.executeFetchRequest(request, error: nil)!
let result = NSPredicate(format: "SELF CONTAINS[c] %@",searchText)
self.filtered = self.countResult.filteredArrayUsingPredicate(result!)
if (filtered.count == 0 ) {
searchActive = false;
}else {
searchActive = true;
}
println(filtered)
}
" '컬렉션과 함께 연산자 포함 / 포함 할 수 없음"오류가 표시됩니다.
이 코드는 내가 원하는 것을 만족시킬 수 없으며 검색 창에 값을 입력하여 관련 행을 가져 오는 방법도 모릅니다.
미리 감사드립니다.
첫 번째 문제는 당신의 조건 - 당신이 사용하려는 CONTAINS
온 NSManagedObject
서브 클래스,하지만 CONTAINS
에서만 작동합니다 String
. 검색 텍스트가 관리되는 개체에 포함되어 있는지 확인하려면 각 속성에 포함되어 있는지 평가해야합니다 (귀하의 경우 id
, company
및 empolyeeName
, 모두라고 가정합니다 String
).
이렇게하려면 술어를 다음과 같이 변경해야합니다.
let searchPredicate = NSPredicate(format: "id BEGINSWITH %@ OR
company BEGINSWITH %@ OR
employeeName BEGINSWITH %@",
searchText, searchText, searchText)
사용자를 검색 할 때 구문의 첫 부분을 입력 할 가능성 BEGINSWITH
이 CONTAINS[c]
있기 때문에 대신 사용 하는 것이 좋습니다 . 또한 Apple이 2013 년 WWDC에서 말했듯이 핵심 데이터 성능 최적화 및 디버깅 -
...로 시작 및 끝이 있으며 실행할 수있는 가장 저렴한 쿼리입니다.
...
포함은 우리가 함께 일하고 포함하는지 확인해야하기 때문에 더 비쌉니다 ...
그리고 검색의 경우 빠른 속도를 원합니다!
둘째, CoreData에서 결과 를 가져온 후 결과를 필터링 할 필요가 없습니다 . 에서 predicate
속성을 설정할 수 있으며 NSFetchRequest
반환 된 결과가 필터링됩니다. 예를 들면 :
let request = NSFetchRequest(entityName: "Agency")
request.predicate = // Your predicate...
let results = context.executeFetchRequest(request, error)
// Now do what you need with the results.
마지막으로, executeRequest
문제 nil
가 발생하여 반환 되는 경우 결과를 강제로 풀지 않는 것이 가장 좋습니다 .이 경우 앱이 충돌 할 수 있습니다. 대신 다음을 사용할 수 있습니다.
if let unwrappedResults = results {
// Now do what you want with the unwrapped results.
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다