Query 사용하기.
1. Search Bar 기능구현하기
StoryBoard에서 Search Bar를 만들고, UISearchBarDelegate 프로토콜을 채택해주자.
searchBarSearchButtonClicked 메서드를 사용할것이다.
우리가 흔히 보는 그 돋보기 모양을 클릭했을때 트리거 되는 함수를 구현해보자.
context를 가져오기위해선 항상 request를 해서 가져와야한다.
extension TodoListViewController : UISearchBarDelegate {
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
let request : NSFetchRequest<Item> = Item.fetchRequest()
print(searchBar.text!)
}
}
그전에 print를 해서 잘 나오는지 보자.
버튼을 클릭할때 부분은 아직 구현이 안되었으나, 엔터를 치니 출력이 되는걸 알 수 있다.
쿼리를 작성해야 하는데 내가 전에 쓰던 MySQL과 는 달리 let predicate = NSPredicate(format: "title CONTAINS[cd] %@", searchBar.text!)
이렇게 적었다. title에서 일치하는것을 가져온다. 이렇게 쿼리문을 해석 할 수 있다.
약간 정규식이 들어간것으로 보인다.
그리고 뒤에는 argument인데, searchBar.text의 값을 사용할 것이므로 적어두자.
사이트 를 참고하자.
여기서 cd란?
- [c]
- 대소문자 무시
- ex) ‘hello’ BEGINSWITH[c] ‘Hello World’
- [d]
- 악센트 기호 무시
- ex) ‘cafe’ CONTAINS[d] ‘café’
- [cd]
- 둘 다 무시
extension TodoListViewController : UISearchBarDelegate {
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
let request : NSFetchRequest<Item> = Item.fetchRequest()
let predicate = NSPredicate(format: "title CONTAINS[cd] %@", searchBar.text!)
request.predicate = predicate
let sortDescriptor = NSSortDescriptor(key: "title", ascending: true)
request.sortDescriptors = [sortDescriptor]
do {
itemArray = try context.fetch(request)
} catch {
print("Error fetching data from context \(error)")
}
tableView.reloadData()
}
}
2. 코드 리팩토링
func loadItems (with request : NSFetchRequest<Item> = Item.fetchRequest()) {
let request : NSFetchRequest<Item> = Item.fetchRequest()
do {
itemArray = try context.fetch(request)
} catch {
print("Error fetching data from context \(error)")
}
tableView.reloadData()
}
extension TodoListViewController : UISearchBarDelegate {
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
// let request : NSFetchRequest<Item> = Item.fetchRequest()
request.predicate = NSPredicate(format: "title CONTAINS[cd] %@", searchBar.text!)
request.sortDescriptors = [NSSortDescriptor(key: "title", ascending: true)]
loadItems(with: request)
}
}
viewDidload 내부 수정
loadItems(with: request)
3. 검색 하고 지웠을때 다시 원복하기
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text?.count == 0 { // 입력안했을때
loadItems()
DispatchQueue.main.async {
searchBar.resignFirstResponder()
}
}
}
resignFirstResponder 를 사용하면 현재 커서와, 키보드 활성화되었던게 해제가 된다.

PREVIOUSTodoey (3)
NEXT3주차 과제 (7)