Todoey (4)
Query 사용하기.
1. Search Bar 기능구현하기
StoryBoard에서 Search Bar를 만들고, UISearchBarDelegate 프로토콜을 채택해주자.
searchBarSearchButtonClicked
메서드를 사용할것이다.
우리가 흔히 보는 그 돋보기 모양을 클릭했을때 트리거 되는 함수를 구현해보자.
context를 가져오기위해선 항상 request를 해서 가져와야한다.
1
2
3
4
5
6
7
8
9
10
11
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]
- 둘 다 무시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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. 코드 리팩토링
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 내부 수정
1
loadItems(with: request)
3. 검색 하고 지웠을때 다시 원복하기
1
2
3
4
5
6
7
8
9
10
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchBar.text?.count == 0 { // 입력안했을때
loadItems()
DispatchQueue.main.async {
searchBar.resignFirstResponder()
}
}
}
resignFirstResponder 를 사용하면 현재 커서와, 키보드 활성화되었던게 해제가 된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.