포스트

3주차 과제 (6)

Lv4

1. UISegmentedControl 사용하여 기능 구현

하기전에 유튜브로 어떻게 구현하나 7분짜리 짧은걸 잠깐 봤다.

생각보다 어렵지 않아서 바로 도전 했다.

디자인은 이렇게했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 @IBAction func changeSegAction(_ sender: UISegmentedControl) {
        let selectedIndex = sender.selectedSegmentIndex
        
        switch selectedIndex {
            
        case 0 : // 전체

        case 1 : // 진행중

        case 2 : // 완료

        default : // 즐겨찾기

        }
        
        
    }

이런식으로 각 인덱스에 해당하는 버튼이 눌러 졌을때 원하는 것을 보여주게 하려고 한다.

우선 전체는 그냥 getData() 그대로 가져오면 될 것 같다.

1,2,3에 해당하는 건 별도로 DBManager에서 parameter만 바꿔 값을 가져오게 하면 될것 같아서

DBManager에 함수를 새로 만든다.

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
func getSpecificData(whereCondition : String, condition : Bool) {
        dbModel.db.collection(Constants.collectionName).whereField(whereCondition,isEqualTo: condition).getDocuments { (querySnapshot, error) in
            
            self.dbModel.lists = []
            
            if let e = error {
                print(e)
            } else {
                
                if let snapshotDocuments = querySnapshot?.documents {
                    for doc in snapshotDocuments {
                        let data = doc.data()
                        if let listId = data[Constants.Fire.fireId] as? Int
                            , let listTitle = data[Constants.Fire.fireTitle] as? String
                            , let listBool = data[Constants.Fire.fireBool] as? Bool
                            , let listFav = data[Constants.Fire.favBool] as? Bool {
                            let list = ToDoModel(id: listId, title: listTitle, isComplete: listBool, isFav: listFav)
                            
                            self.dbModel.lists.append(list)
                            self.delegate?.sendDB(data: self.dbModel.lists)
                        }
                        
                    }
                }
            }
        }
    }

이렇게 해줬다.

하도 Docs를 많이보고 그만큼 시도해서 그런가, 어떻게 함수를 구현해야할지 밑그림은 다 그려졌다.

whereCondition, codition 이렇게 파라미터로 나누었다.

whereCondition의 경우는 어떤 걸 기준으로 소팅할건지에 대한 내용을 담을것이고,

condition은 그 기준에서 true/false 같은 구분값을 정하는 파라미터로 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 @IBAction func changeSegAction(_ sender: UISegmentedControl) {
        let selectedIndex = sender.selectedSegmentIndex
        
        switch selectedIndex {
            
        case 0 : // 전체
            dbManager.getData()
        case 1 : // 진행중
            dbManager.getSpecificData(whereCondition: Constants.Fire.fireBool, condition: false)
        case 2 : // 완료
            dbManager.getSpecificData(whereCondition: Constants.Fire.fireBool, condition: true)
        default : // 즐겨찾기
            dbManager.getSpecificData(whereCondition: Constants.Fire.favBool, condition: true)
        }
        
        
    }

그 결과 만들어진것이 바로 위의 함수.

실행해보자.

잘되네

그리고 segment를 클릭할때마다 정렬이 document이름 순으로 보여진다.

그래서 order 붙여 id순으로 정리하려고하니 안되고, 콘솔에 뭐가 프린트 되었다.

주소가 나와서 그걸 복붙해보니 다음과 같다.

그래서 해당조건에 맞게 두개를 추가 해주었다.

이렇게 두개가 복합쿼리인데, 알아서 생성을 해주는데 시간이 좀 걸렸다.

다시 확인해보니 이제는 내가 원하는대로 된다.

다만 현재 문제점이라면, 소팅한상태에서 값을 추가하면,

자동으로 getData() 함수가 돌아가기에 소팅한 페이지에서 전체 데이터가 보여지게 된다.

이부분을 걱정하긴 했는데, 고민을 해야할듯하다.

하나 더 발견하였다.

아무것도 조건이 해당하지 않는것을 가져오면 이전 기록이 그대로 유지가된다.

이부분은 DB를 사용하면서 값을 얻어올때 뭔가 작동을 안하는것 같은데 배열 초기화를 해줘도 안된다.

뭔가를 담으려고 하긴하는건가… DB이런부분은 패스하고 진행하는게 맞는듯하다.

2. UITableViewDelegate 사용하여 기능 구현

UITableViewDelegate 를 사용하여 셀이 선택되었을때 관련된 내용을 좀 나와보게 하는건 어떨까? 라는 생각이 들어서, 그 부분을 좀 구현해보려고 한다.

UITableViewDelegate는 생각만 했던건데, 뭔가 기능이 많아져서 조잡해 보이기도 할것같으나, 공부적인 측면에서는 여러가지를 활용하는게 좋아 구현해보기로 하였다.

1
2
3
4
5
6
7
extension TableViewController : UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("\(indexPath.row) selected")
    }
    
}

다음과 같이 하여 일단 클릭을 했을때 응답을 제대로 하는지 부터 체크를 해보기로 하였다.

클릭했을때 응답이 잘 되었다.

다음에 계속…

복기.

클로저 함수를 조금 더 공부 해서 alert부분을 깔끔하게 정리하고싶다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.