💡 레이아웃 코드 분리하기
BaseViewController
BaseViewController를 생성하여 VC에 공통적으로 사용하는 설정 요소들을 작성하고 뷰 컨트롤러들이 상속 받는 형식으로 구성
뷰 객체에 대한 UI나 레이아웃, 토스트 메세지, 얼럿, 임포트 등 뷰컨에서 공통적으로 작성되는 코드를 구조화 함으로써 가독성도 높이고 코드 중복도 줄일 수 있다.
✅ view controller의 레이아웃 코드 분리하기
BaseView를 상속받는 AddView → AddViewController의 루트 뷰로 설정할 것
자기 자신에게 적용하는 것이기 때문에 view는 지워도 된다.
AddView 클래스 인스턴스를 생성
mainView를 루트 뷰로 교체를 해줘야 한다.
💡 RootView - loadView()
- view controller의 루트 뷰를 custom view로 교체하여 루트 뷰 위에서 동작하는 뷰들의 레이아웃을 UIVIew에서 책임지게 설정하는 방법
- viewDidLoad보다 먼저 호출되는 루트 뷰를 호출하는 메서드
- 루트 뷰에 관련된 요소들이 loadView에서 설정된다.
- super 메서드 호출하면 안된다. 커스텀 메서드를 사용하는 것이기 때문에 super 메서드를 사용하면 안된다. → 공식 문서에도 명시 되어 있음
collectionView를 인스턴스만 생성해도 컴파일 시 오류가 나지는 않는다.
⇒ collectionView는 flowLayout이 필요하기 때문에 런타임 오류가 발생한다.
flowLayout 설정한 후에도 런타임 오류가 발생한다!
collectionView는 프레임에 대한 초기화가 필요하다.
레이아웃을 .zero로 초기화한 후 레이아웃 지정을 하게 되어서 음수 값이 발생해 오류가 발생한다.
💡 Pass Data between View Controllers
계층 구조와 상관없이 역으로 값을 전달할 수 있는 방법
- property
- closure
- notification
- delegate pattern
💡 Notification
A → B → C ⇒ C에서 변경한 데이터 A, B에 반영
한 화면에서 설정한 값을 다른 화면에도 적용해야 한다.
ex) 다마고치 닉네임 설정 후 모든 화면에 바뀐 닉네임 적용..
post → signal ( signal name)
“Name”이라는 signal을 addObserver
화면 전환 시 계층에 대한 구조와 상관 없이 신호를 주고 받으며 값 전달을 할 수 있다.
✅ 신호 보내기 NotificationCenter.default.post()
name, sample 값을 SelectImage라는 이름을 가진 신호를 통해 post
✅ 보낸 신호 받기 addObserver
addObserver는 신호만 받는다! 이후 데이터 처리는 알아서~
addObserver를 통해 name신호를 통해 데이터를 받아 selector 메서드로 해당 데이터에 대한 처리를 진행한다.
✅ 받은 신호에서 userInfo 꺼내오기
userinfo의 키 값이 없을 수 있기 때문에 옵셔널 처리를 해야한다.
받은 값의 타입을 알 수 없다 → Any타입으로 넘어오기 때문에
if let 구문을 통해 값이 잘 전달되어 왔다면 타입 캐스팅
🚨 Notification을 이용한 정방향 값 전달
addObserver는 미리 등록이 되어 있어야 신호를 받을 수 있다. 하지만 정방향 전달은 계층 구조 상 observer 등록 이전에 post를 하게 된다. Observer가 등록되기 전에 Post가 된다면 신호를 못받는다.
➡️ 때문에 Notification은 정방향 전환에서는 사용하지 않고 역방향 전환 시 주로 사용한다.
post의 순서와 addObserver의 순서가 중요함!
'iOS > 🌱 SeSAC' 카테고리의 다른 글
23.08.30 수 (0) | 2023.09.01 |
---|---|
23.08.29 화 (0) | 2023.08.31 |
23.08.25 금 (0) | 2023.08.31 |
23.08.24 목 (0) | 2023.08.31 |
23.08.23 수 (0) | 2023.08.31 |