포스트

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란?

  1. [c]
    • 대소문자 무시
    • ex) ‘hello’ BEGINSWITH[c] ‘Hello World’
  2. [d]
    • 악센트 기호 무시
    • ex) ‘cafe’ CONTAINS[d] ‘café’
  3. [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 라이센스를 따릅니다.