[두리번] 프로젝트 2~3일차 회고

한상진·2021년 6월 30일
0

두리번

목록 보기
2/8



🛫협업 배우기

저희 iOS팀 리드개발자 태현이형이 프로젝트 초기 셋팅부터 깃헙 셋팅까지 다 해주셨습니다👍
저는 아직 협업 경험이 부족해 이번에 깃헙, 슬랙, 노션 등에서 협업을 배우며 '이런 기능도 있어?'라는 생각을 엄청 많이 하게 되었습니다.

슬랙에서 깃헙이 연동된다는게 제일 신기했습니다😮

Git을 통한 협업에서도 PR, 이슈, 브랜치 등 아직 서투른게 많아서 빨리 잘 익히고 팀에 피해를 주지 않아야겠다는 생각입니다 ㅠㅠ

https://github.com/TeamDooRiBon/DooRi-iOS
앞으로 두리번 프로젝트를 진행하며 사용할 레포입니다!

🛫라이브러리 없이 캘린더 만들기

1일차에서의 목표였던 '라이브러리 없이 캘린더 만들기'를 시작해봤습니다.
혜진누나의 조언대로 컬렉션뷰를 활용해 캘린더를 만드는 법을 알아봤고, 좋은 레퍼런스를 찾았습니다.

레퍼런스에서는 뷰에 캘린더가 깔려있고, 버튼을 통해 저번달/다음달의 달력을 보여주는 형식이었습니다.
우리 프로젝트에서는 세로 스크롤링을 통해 캘린더들을 깔아줘야했기 때문에 테이블뷰가 추가되어야했고, 따라서 각 테이블뷰 셀에 캘린더 컬렉션뷰가 들어가야했습니다.

🛬우리 프로젝트에 적용하기

테이블뷰의 셀에 캘린더 컬렉션뷰를 넣는 것 까지는 처음해봐도 괜찮았는데 스크롤링에 따라 캘린더의 '월'과, '월'에 따른 '요일'들을 변경하는 것이 어려웠습니다.
indexpath.row를 통해 계산하게 되면 12월을 넘어서 13월, 14월 ... 이렇게 넘어갔기 때문이었습니다.

이것 때문에 기존에 테이블뷰에서 모든걸 계산에서 컬렉션뷰에 넘겨주던 방식을 수정하여
메인 뷰컨트롤에서 모든걸 계산하고, 계산 된 것을 테이블뷰에 넘겨주는 방식으로 개선했습니다.

    func dayListSet(index: Int) {
        var month = Int(components.month!) - 1

        for _ in 0...index {
            var addYear = 0
            month += 1

            if month % 13 == 0 {
                month = 1
                addYear += 1
            }

            components.year! += addYear
            components.month! = month

            let firstDayOfMonth = Calendar.current.date(from: components)

            /// 무슨 요일부터 달력이 시작되는지 계산하는 과정
            let firstWeekday = Calendar.current.component(.weekday, from: firstDayOfMonth!)
            daysCountInMonth = Calendar.current.range(of: .day, in: .month, for: firstDayOfMonth!)!.count
            weekdayAdding = 2-firstWeekday

            /// 위에서 계산한 결과에 따라 달력에 알맞게 날짜들을 넣어주는 과정
            var temp: [String] = []
            for day in weekdayAdding...daysCountInMonth {
                if day < 1 {
                    temp.append("")
                } else {
                    temp.append(String(day))
                }
            }

            dayList.append(contentsOf: [
                CalendarModel(yearAndMonth: dateFormatter.string(from: firstDayOfMonth!), days: temp)
            ])
        }
    }

이런식으로 그냥 뷰컨트롤에서 모든걸 계산하고 변수들과 테이블뷰에 넘겨줄 dayList에 저장하는 방식입니다.

🛬문제점 확인

☔셀 재사용 문제(해결 완료)

달력 계산들은 이렇게 해결이 됐고... 잘 될줄 알았는데.... 확인해보니 스크롤링을 하면 3개의 달(6월~8월)만 계속 반복이 됐습니다.

6월..7월..8월..6월..7월...8월...

처음엔 컬렉션뷰 셀이 계속 재사용이 반복되는 것인 줄 알았는데 이래저래 해도 개선이 되지 않았습니다.

그래서 혜진누나에게 코드를 보여주고 도와달라고 요청했더니.. 제가 2시간넘게 해도 안되는걸 그냥 코드만 보고서 바로 문제를 찾으셨습니다. 살짝 현타도 왔지만 열심히 공부해야겠다는 동기부여가 뿜뿜 되었습니다...

collectionView.reloadData()

바로 요녀석 때문이었는데, 제가 코드 구성을 애초에 초기 데이터를 넣어주고 이후 테이블뷰 셀이 넘어갈 수록 데이터를 추가해주는 방식으로 구성했는데, 컬렉션뷰가 신규 데이터를 업데이트 해주지 않으니 초기 데이터만 반복이 되어 출력되는 문제였습니다.
잘 기억해두어야겠다는 생각이 들었습니다.

문제사항 수정 후 위와 같은 결과를 얻을 수 있었습니다!


☔버튼 텍스트 변경 문제(해결 실패)

캘린더를 뷰에 나타내주는 것 까지는 완료했는데..
출발날짜와 도착날짜를 선택하고, 버튼의 텍스트를 바꿔주는 부분에서 결국 해결하지 못한 문제가 생겼습니다.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        switch indexPath.section {
        case 2:
            if days[indexPath.row] != "" {
                /// 아직 여행 시작 날짜가 선택 안되었으면
                if !selectCheck {
                    start = Int(days[indexPath.row])!
                    selectCheck = true

                } else {
                    /// 여행 시작 날짜가 선택되었으면
                    end = Int(days[indexPath.row])!
                    /// 여행 시작일이 종료일보다 뒤에 있으면 ex) 시작일: 21일, 종료일: 3일
                    if end < start {
                        start = end
                        end = -1
                        selectCheck = true
                    } else {
                        selectCheck = false
                        print("시작: \(start), 끝: \(end)")
                    }
                }
            }

        default:
            return
        }
    }

위의 코드처럼 저는 셀이 선택되면 해당 셀의 날짜를 출발일, 도착일 변수에 저장을 해두었고 메인 뷰컨트롤러에 이 값들을 전달하여 버튼의 텍스트를 변경하는 방식을 시도했습니다.
하지만..

unexpectedly found nil while implicitly unwrapping an optional value

위와 같은 nil 문제가 생겼는데, 확실하진 않지만 계층이 달라서 생긴 문제일 수 있다고 하네요...

ViewController - TableViewCell - CollectionViewCell 순서로 계층이 쌓여있고
셀이 선택되어도 뷰의 생명주기의 변화가 없기 때문에 해결하기 어려웠고 결국 해결못했습니다 ㅠㅠ

☔다음 셀 연결 문제(해결 실패)

요일을 선택할 때, 7월 마지막 주~ 8월 첫째 주 처럼 다음달로 이어지는 경우가 있습니다.
하지만 제가 구현한 캘린더의 경우 다음달로 넘어가게 되면 테이블뷰의 셀이 넘어가기 때문에 데이터를 이을 수가 없었습니다. 이 문제도 해결하지 못했습니다...ㅠㅠㅠ


🛫내일의 목표

오늘 직접 경험했던 문제들 이외에도 추가적인 기능들까지 생각하면 앞으로 더 많은 문제들이 발견될 것 같다는 생각이 들었습니다.
그렇게 되면 해결하는데 또 많은 시간투자가 필요하게 되고, 다른 뷰들을 구현할 시간을 뺏기게 될 것이기에 결국 그냥 FSCalendar 라이브러리를 사용하기로 결정했습니다..

라이브러리를 사용해 빠르게 구현하고, 만약 앱잼기간 내에 목표했던 것들을 다 완료하게 되면 남은 시간동안 이번에 연습했던 것을 추가적으로 보완해볼 예정입니다.
이번에 연습하며 나름 많은 것을 배웠기에 이정도로도 만족합니다😅

내일은 FSCalendar로 구현을 완료하는 것이 목표입니다!

profile
공부방

0개의 댓글