2017-04-23 1 views
2

나는 스튜디오의 배열을 가지고 있습니다. 각 스튜디오에는 studioName이라는 속성이 있습니다.NSPredicate로 속성에있는 객체의 필터 배열

사용자가 검색 필드에 적용한 studioName을 기반으로 스튜디오를 필터링하려면 searchfield가 필요합니다.

여기에 내 현재 코드 : 그것은 단지이트를 작동하지 않습니다

var studios = [Studio]() 
var filteredStudios = [Studio]() 
var studiosToDisplay = [Studio]() 

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    let searchText = searchController.searchBar.text 

    print("SEARCH TEXT: \(searchText)") 

    if searchText == nil || searchText!.isEmpty { 
     studiosToDisplay = studios 
     self.resultTableView.reloadData() 
     NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) //Calls SearchVC 
    } else { 
     studiosToDisplay.removeAll() 
     let searchPredicate = NSPredicate(format: "studioName CONTAINS[c] %@", searchText!) 
     let array = (self.studios as NSArray).filteredArrayUsingPredicate(searchPredicate) 
     studiosToDisplay = array as! [Studio] 
     self.resultTableView.reloadData() 
    } 
} 

, 지금 ... 그것은 필터,하지만 난 상관없이 나는 searchfield에 넣어 무엇을 할 때마다 남아 있지 같은 스튜디오와 끝까지.

나는 각 시간에 배열의 단일 객체를 봐야한다는 것을 알기 위해 술어를 알 필요가 있다고 생각한다. 그러나 나는 방법을 이해할 수 없다. 형식에 "ANY"를 추가하려고했지만 내 응용 프로그램이 충돌합니다.

+0

Swift 2를 사용하고있는 것처럼 보이므로 질문에 적절하게 태그를 달아야합니다 (Xcode를 APP Store에서 사용 가능한 최신 Xcode로 업데이트하는 것이 좋습니다). –

+0

메모 :'searchText == nil'을 사용하여 nil 확인 , unwrapping ('searchText!')은 정말 나쁜 습관이다 – Alexander

답변

7

이것은 불필요하게 복잡합니다. NSPredicate은 필요 없습니다.

var studios = [Studio]() 
var filteredStudios = [Studio]() 
var studiosToDisplay = [Studio]() 

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    let searchText = searchController.searchBar.text 

    print("SEARCH TEXT: \(searchText)") 

    if let searchText = searchText, !searchText.isEmpty { 
     studiosToDisplay = studios.filter{ $0.studioName.contains(searchText) } 
    } 
    else { 
     studiosToDisplay = studios 
     NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) //Calls SearchVC 
    } 

    self.resultTableView.reloadData() 
} 
1

덕분에 @Alexander합니다 .. 여기에 내가 사용하여 종료 코드입니다 : 내가 알아 낸

func updateSearchResultsForSearchController(searchController: UISearchController) { 

    let searchText = searchController.searchBar.text 

    if let searchText = searchText { 
     if !searchText.isEmpty { 
      self.studiosToDisplay = self.studios.filter { $0.studioName!.containsString(searchText) } 
      for studio in self.studiosToDisplay { 
       print("\(studio.studioName!)") 
      } 
     } 
     else { 
      self.studiosToDisplay = self.studios 
      NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) // Calls SearchVC 
     } 
    } 

    self.resultTableView.reloadData() 

} 

이는 자 NSPredicate 내 이전의 코드는 실제로 작동했다 - 난 그냥 잘못을 제시했다 배열 내 tableview .. 죄송합니다 ..하지만 지금은 그것을 작동하고, 나는 더 간단한 코드에 충실. 왜 내가 $ 0 함수를 사용하지 않을지 모르겠다. :) 어쨌든, 고마워!

+0

가드 문을 사용하면 여분의 레벨의 들여 쓰기없이'searchText'를 바인딩 할 수있다. – Alexander