Skip to content

Conversation

@AKAPUCH
Copy link
Contributor

@AKAPUCH AKAPUCH commented Jun 6, 2023

화면 별 요구 항목

todoList 화면

  • 테이블 뷰 내 todo 유형 별 섹션 나누기
  • 테이블 뷰 편집 모드 전환 버튼
  • 편집 모드에서 셀 삭제 및 이동
  • 셀 선택 시 데이터 전달, todo 장소를 보여주는 화면으로 전환
  • todo를 생성할 수 있는 화면으로 넘어가는 버튼

todo 생성 화면

  • 네비게이션 back버튼 숨기기
  • 화면 전환 시 첫 텍스트필드에 포커스 및 키보드 올리기
  • 사용자 입력을 받는 form(제목, 장소, 설명) 구현
  • return 입력 또는 form 외 구역 터치시 키보드 내리기
  • 날짜를 고르는 datePicker
  • form 모두 입력 시 완료 버튼 활성화
  • 버튼 선택 시 이전 화면으로 돌아가기, 완료 버튼은 list에 todo 추가

todo 상세 화면

  • todo 타이틀 및 장소 이름 화면에 표시
  • 약속 장소를 보여주는 Apple Map

선택 구현 항목

  • todo 데이터 앱 내 저장(property list)
  • 단위 테스트 작성
  • 셀 길게 탭하여 이동하기
  • 맵에 장소 마킹
  • 맵에 todo description 표기

학습키워드

  • notification, moveRowAt, editMode, TDD, plist, UIDatePicker, GeoCoder, MKMapView

고민했던 부분

비동기 호출로 인해 Location 객체를 Class로 정의

  • 처음에는 Location 객체를 저장 용도로만 사용할 뿐, 싱글톤 객체처럼 여러 곳에서 접근할 필요가 없다고 생각해 구조체로 선언했습니다.
  • 또 모델에서 비즈니스 로직을 처리하는 것이 좋다 판단하여 Location 객체에 문자열을 좌표로 변환하는 GeoCoding을 사용했습니다.
    mutating func forwardGeocoding(address: String?){
        let geocoder = CLGeocoder()
        guard let address = address else {return}
        var closureSelf = self
        geocoder.geocodeAddressString(address, completionHandler: {
             (placemarks, error) in
            if error != nil {
                print("Failed to retrieve location")
                return
            }
            
            var location: CLLocation?

            if let placemarks = placemarks, placemarks.count > 0 {
                location = placemarks.first?.location
            }
            
            if let location = location {
                closureSelf.coordinate = location.coordinate
            }
            else
            {
                print("No Matching Location Found")
            }
        })
    }

데이터 모델 관리자 객체와 단위 테스트...

  • 완벽한 싱글톤 객체는 아니나, 루트 컨트롤러에서 생성된 관리자 객체를 다른 화면으로 전달하여 사용하고 1개 이상 생성하지 않았습니다.
  • 데이터 배열에 직접 접근하는 것을 막고 편리한 구현을 할 수 있었으나 이로 인해 결합도 📈
  • 추후 수정 시 의존성 주입을 도입하여 단위 테스트 시 애로사항이 없도록 해야 할 것 같습니다.

테이블 뷰 편집모드

  • 김종권 블로그 - 셀 삭제/편집/이동에서도 언급했듯이, 버튼을 통해 편집모드로 전환하는 방식은 사용자 측면에서 번거로운 일입니다.
  • 러닝커브가 꽤 높아 우선은 레퍼런스처럼 버튼을 통해 편집모드 전환하도록 하였습니다.
  • 김종권 블로그 - 편집모드 사용법을 참고하였습니다.
  • 셀 삭제시에는 UITableView의 deleteRows메서드를 활용했습니다. 셀이 삭제되는 애니메이션 효과를 넣을 수 있는 장점이 있으나 참조 배열의 데이터 삭제를 먼저 하지 않는다면 인덱스 에러가 발생하였습니다.

MKMapView

  • 데이터 모델의 좌표로 반경 1km를 지도에 표시하였습니다.
  • 상세 화면치고 너무 밋밋하고 정보가 부족하다고 생각하여 pin으로 장소 표시 및 사용하지 않은 description을 view로 표기하는 것을 고려중입니다.

느낀점

  • 구글링을 통해 기능 구현 방법을 찾는 것은 가능하지만, 내 프로젝트에 맞게 잘 변형시키는 것이 중요하다
  • struct와 class의 차이를 개념적으로는 잘 이해하고 있지만, 실제로 앱을 만들 때는 항상 고민하게 된다..😭
  • deprecated된 것들만 주의하면 대부분의 기능들은 커스텀하지 않고도 기본 제공 메서드, 프로퍼티로 구현 가능하다!
  • TDD, Property List 학습 필요📚

@OpenBible3438
Copy link

이번에도 코드로 화면 구성하셨네요 대단합니다👍
그리고 셀 삭제하는 기능 보고 저도 비슷하게 디벨롭해봐야겠습니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants