0715 새싹 10회차 정리
iOS 앱 개발자 데뷔 과정 10회차
#0. Memo
- ViewController Transition : 화면 전환
VC간의 화면 전환을 Segue라고 하고, (아이폰에서 주로 사용하는) 전환 액션은 Show와 Present Modally이다.
네비게이션 컨트롤러와 함께 사용하는 Show(Push)는 상세 정보를 보여줄 때 주로 사용하며, 오른쪽에서 왼쪽으로 넘어온다.
Modal은 새로운 정보를 보여줄 때 주로 사용하며, 아래에서 위로 올라온다.
Modal에는 여러 세부 효과가 있는데 그 중 Over Full Screen은 네비게이션이나 탭바 영역을 무시하고 꽉 채워서 보여준다.
iOS 13 이전의 Modal은 기본값이 Full Screen이다.
- 팝업창 (처럼) 만들기
VC의 배경을 반투명하게(Opacity 조절) 하고, 그 위에 View를 만든다.
이 때 전환 효과는 Modal의 Over Full Screen 혹은 Over Current Context 를 사용하면 된다.
- Unwind : 이전 화면으로 돌아가기
화면을 뒤로 돌리고 싶을 때, 간단하게 생각해 보면 버튼을 만들어서 이전 화면으로 Show 하면 될 것 같다.
하지만 그렇게 하면 이전 화면으로 넘어가고, 다시 넘어가고, 반복되서 화면이 쌓일 뿐 뒤로 가지는 것은 아니다.
뒤로 돌아가는 버튼을 만들고 싶을 땐 Unwind 코드를 작성하자.
돌아가는 버튼을 포함하고 있는 화면이 아니라, 돌아가고 싶은 화면에 아래의 코드를 작성한다.
그리고 동작을 수행할 버튼을 VC 위쪽의 세번째 버튼으로 드래그하면, Action Segue 팝업이 뜬다.
작성한 함수와 같은 이름을 선택해주기만 하면 뒤로가기 버튼이 완성된다.
- 라이브러리와 프레임워크의 차이 : 자율성 / 주도권
라이브러리란 필요한 기능들이 묶인 코드의 묶음으로, 효율적인 코드 작성을 위해 언제든지 필요한 곳에서 호출하여 사용할 수 있도록 Class나 Function으로 만들어진 것이다.
- Saving Data : UserDefaults
데이터를 저장하는 방법은 크게 서버 저장, 로컬 저장이 있는데 개인 앱은 대부분 로컬 저장을 사용한다.
로컬 저장에도 UserDefaults 와 DataBase 두 가지가 있는데, 우선 공통점부터 알아보자.
- iOS 디바이스 기기(로컬)에 저장한다.
- 앱 삭제 시 관련 데이터가 함께 삭제된다.
- 백업/복구 기능이 필수이다.
그리고 차이점은 간단하게 아래와 같다.
UserDefaults : 단일 데이터 값(경량) // Dictionaty 형태로 저장
DataBase : 유사한 대량 데이터 값(중량) // Core Data, Realm, SQLite
실제로 UserDefaults를 사용하려면 아래와 같은 형식으로 코드를 장성한다.
저장된 데이터를 지우고 싶을 때에는 이렇게 작성한다.
UserDefaults.standard.removeObject(forKey: String)
#1. Checklist
- ViewController Transition
Show / Modal : #0. Memo ViewController Transition : 화면 전환 참고
Push-Pop / Present-Dismiss : 화면을 띄우고, 띄운 화면을 없애는 작업끼리의 짝이다.
Push-Pop이 Navigation의 Push, Present-Dismiss가 Modal에서 이루어지는 작업이다.
Segue : iOS에서의 여러 VC간의 화면 전환 시에 사용되는 객체
Unwind / UIStoryboardSegue : #0. Memo Unwind : 이전 화면으로 돌아가기 참고
Presentation / Transition Style : #0. Memo ViewController Transition : 화면 전환 참고
- ViewController LifeCycle
[2회차 정리] https://eun-dev.tistory.com/3 #0. Memo View의 생명주기? 그런게 있어? 참고
ViewDidLoad는 항상 맨 처음에만 실행되는줄 알았는데 아니었다.
RootVC의 ViewDidLoad는 항상 한번만 호출되지만(네비게이션이나 탭바가 없더라도), 그 이후의 화면은 전환 될 때마다 호출된다.
VC의 생명주기 함수를 작성할 땐 자동완성이 되지 않더라도 super를 꼭 써줘야한다.
print(#function) 이라고 쓰면 뷰의 생명주기를 파악하기 쉽다.
Modal을 FullScreen이 아닌 위의 공간이 남아있는(?) 형태로 보여주게 되면 그 전 화면이 DisAppear되지 않는다.
또 Push 되어있는 화면을 반만 돌렸다가 취소할 때, DidAppear가 나오지 않았는데 WillDisAppear와 DidDisAppear가 나오기도 한다.
이는 뷰의 생명주기가 항상 순서대로 진행되는게 아니기 때문이며, 보여주려고 했는데 취소해서 다시 나갔다! 정도로 이해하면 될 것 같다.
여담으로, 실행하는데 10초가 걸리는 코드를 작성한다고 했을 때, ViewDidLoad에 작성하면 화면이 로드되지 않고 멈춘 느낌이 들 수 있고, ViewWillAppear에 작성하면 로드는 되지만 데이터를 받아오는데 오래 걸리는 느낌이 들 수 있다.
- UserDefaults
#0. Memo Saving Data : UserDefaults 참고
#2. Assignment
- 2주간 수업한 내용 복습하기주말동안 할 것
- 기념일 계산기 저장 기능 0
- 넷플릭스 로그인 화면에서 화면 전환 구현 0
- 넷플릭스 로그인 화면 조건에 따라 얼럿 띄우기 0
- 감정일기 카운트 저장/리셋
[2주차 마무리] https://eun-dev.tistory.com/manage/posts/
# 온라인 멘토링 답변 간단 정리!
- 내... formatter 문제... 왜 nil이 뜨나요?

1차적인 문제로는 fomatter가 일치하지 않았기 때문이다.
formatter 혹은 fomatter2로 통일 해주면 더 이상 nil이 반환되지는 않는다.
하지만 애초에 fomatter를 나눠서 작성했던 이유가 오늘을 선택해도 내일을 선택해도 D0이 뜨는 현상 때문이었는데, 그 부분에 대해 한번 더 질문드리니 calendar.dateComponents가 [.day]로 되어있기 때문에 24시간이 지나야 하루로 인식된다고 말씀하셨다...!
난 그동안 왜 뻘짓을 한거지
아무튼, fomatter는 통일시킨 후 필요 없는 fomatter는 지우고, calendar 쪽의 코드를 수정해야겠다.
- 여백을 비율로 잡는 방법이 있나요?
객체를 비율로 잡으면 자동으로 여백도 비율로 잡히기 때문에 어렵지 않다.
혹은 객체가 여러개일 경우, 투명한 빈 뷰를 만들어서 내/외부에 각각 비율로 잡아주는 방법도 있다.
- StackView를 비율로 Spacing을 주는 방법이 있나요?
stackView.spacing = UIScreen.main.bounds.width / (숫자) 와 같은 형식으로 작성하면 된다.
- Aspect Ratio 적용시킨 View를 복사하면 조건이 여러개 잡히는 이유가 뭔가요?
1:1의 비율을 가진 View가 여러개 필요해서 복사하면, Aspect Ratio가 2개 3개 4개 계속 복사되는 현상이 있었다.
이유는… 정확하게는 모르겠지만! 레이아웃이 잡혀있는 객체를 복사하는건 좋은 방법은 아니라고 하셨다.
아웃렛이 연결되어있는 객체를 복사하면 안되는것과 같은 이치이다.
- ImageView와 Label 사이에 여백을 주고 싶은데, 다른 객체랑 잡힐 때에는 어떻게 해야 하나요?
ImageView는 포함관계를 가질 수 없는 객체이기 떄문에 위에 얹어져 있는 형태라면 인식이 안될 수 있다.
이럴 땐 Add New Constraints를 누르고, 화살표를 누르면 어떤 객체와 관계를 가질지 선택할 수 있다.
- UserDefaults는 인스턴스 없이 사용이 가능한 이유가 뭔가요?
static let shared = jackUserDefaults() 와 같은 형식으로, 바로 사용 가능하도록 클래스 내부에 작업을 해놨기 때문이다.
이런걸 싱글턴 패턴이라고 하고, 나중에 배울 예정이라고 한다.
게다가 UIColor와 같은 느낌으로 이미 우리는 인스턴스 없이 클래스를 사용하고 있었다...!