iOS 개발일지
0717 2주차 마무리 본문
iOS 앱 개발자 데뷔 과정 2주차 마무리
# Plus
- 기념일 계산기 저장 기능
10회차 정리글에 작성했던 기념일 계산기 프로젝트의 날짜 오류에 대해서 다시 생각해보았다.
계속 실행을 해보니 표준시 기준이라기 보다 표준 날짜...? 기준인 것 같았다. (시간이 일정함)
하긴, DatePicker도 Clarendar도 결국 시간을 기록하는 객체가 아니기 때문에 당연하다면 당연한 것이었다.
그리고 오늘과 내일, 이틀이 동일하게 D0으로 뜨는 문제를 조금 차분히 관찰했더니 해결방법이 조금은 보이기 시작했다.
간단하게, 날짜가 항상 하루 밀리니까 기준시보다 이후의 케이스에는 -1을 입력해주면 되는 게 아닐까?
그렇게 한다면 굳이 날짜를 한국에 맞추고, 시간을 맞추고 할 필요 없이 사용자에게 올바른 값을 보여줄 수 있다.
그리고 현재는 날짜의 차이만을 보여주기 때문에, 어제가 기념일이라면 오늘은 +1일로 뜬다.
하지만 보통 기념일은 당일을 1일로 생각하기 때문에 다음날인 오늘은 +2일이 되어야 하는게 맞다.
그래서 이 부분도 동시에 수정해주었다.
하지만 이래도... 하루 전, 이틀 후는 제대로 동작하지만 당일이랑 다음날이 둘 다 "당일"로 뜬다ㅠㅠ
저 오류는 다시 찾아보기로 하고, 데이터를 저장하는 UserDefaults부터 구현해줘야겠다.
우선 저 길어서 거슬리는 switch는 주석 처리하고, D+Day를 보여주는 함수를 다시 작성해주었다.
그리고 그 아래에 UserDefaults를 써 주고,
마지막으로 viewDidLoad에서 한번 더 UserDefaults로 저장된 값을 불러와 주면 끝!
- 감정일기 저장 기능
감정 버튼을 눌렀을때 카운트를 저장하고 보여주는 부분의 코드이다.
저장보다는 저장한 코드를 불러오는 것이 조금 어려웠는데,
for문 바로 아래의 세줄은 "사랑해", "꿀꿀해" 등 key값(딕셔너리, 유저디폴트 키 동일)을 불러오는 작업이다.
다른 함수에서도 쓰이기 때문에 코드가 중복되므로 아래에서 수정했다.
처음에는 setTitle의 emotionDic[result] 부분을 UserDefaults의 Value로 작성했는데, 그렇게 될 경우 한 번도 클릭하지 않은 버튼의 타이틀은 nil이 되므로 문제가 생긴다.
이를 해결하기 위해 if문을 사용했었으나, 이미 위에서 UserDefault에 저장된 값을 emotionDic[result]에 담아놨기 때문에 emotionDic[result]를 사용하도록 수정하니 코드가 간결해졌다.
- 감정일기 리셋 기능
초기화는 UserDefaultsd의 removeObject 메서드를 사용해서 구현했다.
removeObject를 하게 되면 값이 nil이 되므로, emotionDic의 값은 수동으로 0으로 바꿔주고, 0으로 초기화된 감정 카운트를 setTitle을 통해 보여주었다.
- 넷플릭스 로그인 Alert 띄우기
기존에 Button에 highLight 타이틀로 메세지를 보여주었던 기능을, Alert을 통해 좀 더 명확하게 전달할 수 있도록 코드를 수정했다.
- 넷플릭스 화면 전환
위에서 구현한 Alert의 종류는 총 4가지로, 회원가입 실패 3가지(이메일, 비밀번호, 쿠폰번호)와 회원가입 성공 1가지로 구성되어있다.
회원가입에 성공했을 경우 Alert을 띄워주고 3초 후에 메인화면으로 이동하도록 구현해보았다.
화면 전환에 사용되는 메소드는 메서드는 prepare(for:sender:)와 performSegue(withIdentifier:sender:)가 있다.
perpare 메서드는 화면 전환이 일어나기 전 새로 보여지는 VC에 정보를 전달하는 메서드로 지금은 전달할 정보가 없으니 사용하지 않았다.
메서드들의 주요 프로퍼티는 이렇다.
- var source: UIViewController : 세그에 전환을 요청하는 뷰 컨트롤러
- var destination: UIViewController : 전환될 뷰 컨트롤러
- var identifier: String? : 세그 객체의 식별자
identifier가 Scene의 Storyboard ID인줄 알고 삽질을 조금 했는데, 여기서의 identifire는 Segue의 식별자이다.
여태까지는 버튼이 있어야만 Segue를 연결할 수 있다고 생각했지만, Scene끼리도 연결이 가능하며 동작이 불가능할 뿐이다.
이번에는 동작을 코드로 구현할 테니 차근차근 연결해보았다.
1. 우선 Scene의 상단 첫 번째 아이콘을 새로 보여지는 Scene으로 드래그해서 Segue를 연결한다.
2. 연결된 Segue를 선택하면 Identifire를 설정할 수 있으니, 알아보기 쉽게 작성한다.
3. performSegue 메서드를 통해 화면 전환 코드를 작성한다.
조건에 따라 회원 가입이 성공했을 때, Alert을 띄우고 2초가 지나면 자동으로 PosterView로 넘어가도록 구현했다.
하지만 한 가지 문제가 있다.
Full Screent으로 보여주고 싶은데 Segue의 Kind를 Present Modally 등 다른 종류로 바꿨을 때 코드가 동작하지 않는 것이다.
NavigationViewController도 추가해서 Show로 바꿔봤지만, 역시 안된다.
오직 Show( e.g Push)에서만 작동한다. 대체 왜 일까...
조금 더 공부해야 할 것 같다.
- return 값이 있는 함수를 통한 코드 리펙토링
위에서 작성한 감정 초기화 버튼의 함수를 보면, 반복문 아래에 key를 추출하기 위한 코드가 작성되어있다.
하지만 이 코드는 UserDefaults를 불러오는 함수에도, 감정 버튼을 누르는 함수에도 중복해서 쓰인다.
같은 기능을 하는 코드를 세번이나 반복해서 쓸 필요는 없으므로 따로 함수를 만들었다.
그리고 나서 코드를 보면, 3줄이 한줄로 줄어들었고 전체적으로 코드를 보기가 편해졌다.
return을 하지 않으면 result를 다른 함수 내에서 사용할 수 없다.
함수에서 나온 결과를 사용하기 위해 호출하는 것이므로, return이 필수라고 할 수 있다.
return이 필요한 함수에 대한 이해가 더 확실하게 된 것 같아서 좋은 공부가 되었다.
# 그 외
왜인지 모르겠지만 감정일기의 VC가 빨간색으로 뜨고 수정이 불가능해서 git log를 확인한 후 revert로 돌려주었다.
revert 하는 과정에서 오류가 많이 났었는데, revert 후 파일을 다시 한번씩 열어보니 해결되었다.
'SeSAC iOS 데뷔과정 2기' 카테고리의 다른 글
0719 새싹 12회차 정리 (0) | 2022.07.19 |
---|---|
0718 새싹 11회차 정리 (0) | 2022.07.18 |
0715 새싹 10회차 정리 (0) | 2022.07.15 |
0714 새싹 9회차 정리 (0) | 2022.07.14 |
0713 새싹 8회차 정리 (0) | 2022.07.13 |