SeSAC iOS 데뷔과정 2기

0705 새싹 2회차 정리

Lia's iOS 2022. 7. 5. 19:47
iOS 앱 개발자 데뷔 과정 2회차

어제에 이어 강제 아침형 인간이 된 나...

 

어제 자려고 누워있으니 괜히 '아...이렇게 하면 더 깔끔하게 될거같은데...할 수 있을거같은데...' 라는 생각이 계속 나더라구요ㅋㅋㅋㅋㅠㅠ

꿈에서까지 코딩하지는 않았지만 이런저런 생각에 살~짝 늦게 잠들었더니 아침 컨디션이 말이 아니었어요. 오늘은 꼭 일찍 자야지

 

오늘 수업에는 어제 과제에 대한 해설을 해주시며 같이 해보는 시간이 있었는데, 왜 View의 레이아웃과 같은 설정들을 viewDidLoad 블럭 내에서 하는지 알려주셨어요

"화면이 다 로드되고나서 뒤늦게 바뀌면 웃기니까... 얘들 지금 뭐하자는거지? 하는 생각이 들잖아요?" 라고 하시는 말씀이 너무 웃겨서ㅋㅋㅋㅋㅋ 이해가 한번에 되더라구요!

아, viewDidLoad는 뷰컨트롤러의 생명주기 중 하나에요. Memo에 정리해놨답니다 :)

 

 

#0. Memo

IB가, CG가 이런 뜻이었다니...!

IB : Interface Builder

CG : Core Graphics

 

 

Scence와 Logic도 짝꿍이 있어요~

Scene : 스토리보드에서 구성하는 뷰객체, 제스쳐, 뷰컨트롤러 등

Logic : 기능 구현을 위해 작성한 코드(스위프트 파일)

화면이 3개면 스위프트 파일도 3개를 만들고, 짝을 맞춰준다. 연결이 중요!

 

 

아웃렛 변수 이름 변경 시 발생하는 오류와 해결방법

이미 선언한 아웃렛 변수의 이름을 변경할 경우, 빌드했을  아래와 같은 오류가 난다.

this class is not key value coding-compliant for the key bannerImageView.

계속 따라다닌다는 "그" 오류

이럴 때에는 조금 번거롭지만 연결을 끊고 다시 연결해주면 된다. 연결할 때에는 뷰에서 직접 끌어오는 것보다 오른쪽의 연결된 리스트에서 비어있는 원을 직접 끌어오는 것이 더 좋다고 한다.

하지만 베스트는 애초에 이 불길한 빨간 창을 보지 않는 것! 오른쪽 클릭, Refactor, Rename으로 변수명을 변경하면 오류 없이 깔끔하게 변경된다.

 

 

우린 같은 식구니까~

nameLabel.textColor = UIColor.red 와 같은 경우에는 textColor는 UIColor 타입이기 때문에 nameLabel.textColor = .red와 같이 생략해주어도 된다.

하지만 bannerImageView.layer.borderColor = UIColor.blue.cgColor 에서는 UIColor를 생략하면 오류가 난다. borderColor는 CGColor 타입이기 때문이다.

해당 변수가 어떤 타입인지는 옵션+클릭으로 알아볼 있다.

 

 

View의 생명주기? 그런게 있어?

이런게 있다는걸 알고는 있었지만, 생명주기라고 부르는 것은 처음 알았다.

viewDidLoad : 뷰가 로드 되었다
viewWillAppear : 뷰가 나타날 것이다
viewDidAppear : 뷰가 나타났다
viewWillDisappear : 뷰가 사라질 것이다
viewDidDisappear : 뷰가 사라졌다

간단하게 이렇게 정리할 수 있는데, 여기서 주의해야 할 점은 viewDidLoad는 최초 실행 한번만! 실행된다는 점이다.

View의 생명주기는 계속 순환하지만 viewDidDisappear의 다음은 viewWillAppear이다.

이것이 viewDidLoad와 viewWillAppear가 비슷해 보이지만 다른 점이다.

따라서 viewDidLoad는 초기 화면 구성과 같은 용도로 주로 사용하고, 다른 뷰로 이동했다가 다시 돌아오는 상황에 해주고 싶은 처리가 있다면 이때는 viewWillAppear에서 해주면 된다.

 

 

 

 

#1. Checklist

UIKit

가장 대표적인 유저 인터페이스 도구(Framework)

iOS에 들어가는 앱을 빌드하는 데 필요한 핵심 오브젝트를 지원한다.

 

UIViewController

앱의 뷰 계층을 관리하는 객체. 쉽게 말하면 디바이스 스크린 전체를 차지하는 씬이다.

UITapBarController, UINavigationController, UICollectionViewController 등 목적에 따라 여러 종류로 나뉘며, 보통 하나의 화면을 하나의 뷰컨트롤러가 관리하게 된다.

 

UIView

뷰컨트롤러 위에 뷰객체가 쌓이는 형태로 씬이 구성된다.

UILabel, UITextField, UITextView, UIImageView 등 목적에 따라 여러 종류의 뷰 객체가 존재하며, 대부분 상속받아 만들어진다.

 

@IBOutlet

뷰객체가 가지고 있는 속성(프로퍼티와 메서드)에 접근할 수 있다.

아웃렛 변수 지정은, 뷰에 있는 객체를 실제 코드에서 사용하기 위해 이름을 지어주는 것이라고 생각하면 된다.

 

@IBAction

사용자의 제스쳐를 통해 이벤트가 일어난 경우에 실행될 기능을 정의할 때 사용된다.

 

 

 

 

#2. Assignment

오늘의 과제는 어제 만들었던 화면의 Play 버튼을 누르면 메인 포스터를 포함한 4개의 썸네일이 랜덤으로 바뀌는 코드를 짜는 것이다.

얼핏 보기에는 어렵지 않을 것 같아서 '오늘은 반복문을 사용해서 코드의 길이를 줄여봐야지! 랜덤이면 중복이 나올테니까 조건문으로 걸러줘야지!' 라는 생각으로 xcode를 켰으나...

좌(수정 전), 우(수정 후) 엘사의 데칼코마니...?!
아아... 이게 뭐람...

또 이렇게 엄청나게 비효율적인 코드를 써버려서 낙담하고 있던 와중, 어제와 같은 문제로 고민중이란걸 깨달았다.

아웃렛 변수를 Array에 넣을 수 있다면, 저렇게 같은 코드를 여러번 쓰지는 않을텐데... 잠깐, 그게 정말 안될까?

어제 이미 여러 방법을 시도해봤지만 어떻게 해도 오류가 나서 포기했었다. 하지만 오늘은 왠지 될 것 같았다.

열심히 구글링을 하다 보니 드디어 빛이 보이기 시작했다! 

@IBOutlet을 연결할 때 Ceollection으로 한다면?

 

역시! 안될리가 없지!!!

이렇게 하면 아웃렛변수가 배열이 된다. 다음은 나머지 썸네일들을 전부 Outlet Collection에 연결해주면

 

좌(수정 전), 우(수정 후) 해치웠나...?

 

이렇게 된다!

중복은 shuffle 메소드를 사용해봤는데, shuffle된 List에서 차례로 가져오다보니 썸네일끼리의 중복은 해결됐지만 가끔 제대로 안 섞이면 버튼을 눌러도 같은 이미지로 바뀐다.

저건 또 어떻게 하지...ㅎㅎ;;

 

 

 

 

# 그 외

인스펙터 영역에 있는 기능들은 아래부터 상속받은 기능들이 위치하며 최종적으로 맨 위에는 고유한 기능이 위치한다.

Control 상속받은 객체 유저가 상호작용할  있다. 이처럼 관계와 기능에 대한 유추가 가능하다.

UIButton에 Style을 변경하여 여러 설정이 가능한데, Default 외의 4가지는 iOS15 이상에서만 사용 가능하다.

UIButton에 직접 추가한 이미지는 크기 변경이 불가능하지만, 애플이 기본적으로 제공하는 아이콘 이미지는 변경이 가능하다. (폰트로 인식하기 때문)

Switch의 Title은 맥에서만 보여진다. 이렇게 플랫폼에 따라 기능하거나 기능하지 않는 기능들이 있다.