이번주에 새롭게 알게 된 내용들이 많아서 흥미로웠당..ㅎ
기존에 내가 왜 있는 건지 몰랐던 것들에 대해서 그리고 이게 있었어?라고 그냥 지나치던 것들까지도 세세하게 알 수 있어서 유익했다.
1. AppDelegate / SceneDelegate
iOS 12에서 13으로 버전이 바뀌면서 iPadOS가 나왔다.
가장 큰 특징은 분할화면 -> 다중 창 모드가 가능하다는 것인데 그런 일로 인해 기존 Inactive / active 등의 앱의 생명주기 개념으로만은 명확하게 구분지을 수 없게 되었다.
예를 들어, 사파리 창을 아이패드에서는 최대 3개(의 Scene)까지 한 화면에 열 수 있기 때문에, 사파리 3창 중 1창을 닫았다고 해서 사파리 앱이 inactive/active 됐다고 말하기가 어렵다.
그래서
UIScene이라는 개념이 새로 나왔고, iOS13부터는 UIScene에 대응해줄 수 있지만,
그 이전 iOS12에서는 아래와 같이 오류가 발생하게 되는 것이다.
관련해서 (WWDC19)Architecting Your App for Multiple Windows: 정리된 걸 살펴보면,
iOS 12까지는 AppDelegate만 존재했고, 이 아이의 역할은
1. 앱이 켜지고 꺼지는 이벤트를 애플리케이션에 알리는 것
2. UI의 상태 변화를 알리는 것
우리의 애플리케이션은 하나의 window만 가지고 있었다.
window? 그건 또 뭔가?
앱 계층구조를 보면 상위에 UIWindow가 있는 걸 볼 수 있다.
이 UIWindow가 있기 때문에 우리는 화면을 볼 수 있다.
iOS13 이전에서는 SceneDelegate가 없었고, AppDelegate에서 window를 관리했다.
그래서 iOS13에서 12.4 버전으로 돌리면 해당 UIWindow가 검게 보이는 것이다.
(window를 scenedelegate가 관리하는데 12.4는 scenedelegate가 없기 때문에.)
그래서 만약에 13 이전 버전에서 window를 쓰고 싶다면
AppDelegate로 이렇게 window를 불러와줘야 한다.
여하튼, iOS13부터는 UI와 관련해서는 SceneDelegate가 관리한다는 뜻이다.
AppDelegate는 앱의 생명주기만 관리하고
앱이 실행될 준비를 마친 경우에 didFinishLaunchingWithOptions 메소드가 호출되는데 이 메소드는 SceneDelegate에서 동작한다.
그리고 이렇게 Scene이 새로 생성되고, 종료하는 것을 AppDelegate에게 알려서 우리 앱이 시작됐는지 / 종료됐는지를 알 수 있게 하는 것이다.
2. #available, #unavailable / @available
#available은 여러 플랫폼에서 서로 다른 결과를 내기 위해서 if 또는 guard문이랑 같이 사용된다.
if #available(iOS 13.0, *) {
// print("다크모드 있움")
} else {
// print("다크모드 없움")
}
이거는 iOS 13.0 이상의 버전인지 체크하고 그런 경우에 "다크모드 있움"을 출력한다.
그리고 * -> 이 아이를 꼭 써줘야 함
@available은 함수, 클래스 또는 프로토콜 앞에 놓인다.
@available은 특정 플랫폼, Swift 버전, OS 버전 등의 제약을 걸 수 있다.
compile 할 때 체크된다.
@available(iOS 13.0, macOS 10.12, *)
func printDarkMode() { }
위와 같이 iOS 13 이상의 버전과 macOS 10.12 이상의 버전인 경우에만 printDarkMode() 함수를 호출할 수 있다는 걸 의미한다.
@available은 추가 정보를 지정할 수 있다.
3. Dark Mode
다크모드는 iOS13에서 나왔는데 우리가 다크모드를 지정해줄 때 info.plist에서 Appearance라는 키값에 직접 Light를 작성해서 지정해준다. default가 Light고, Dark만 보여주는 경우는 없다는 점
아래처럼 Source Code로 info.plist를 볼 수 있다.
UserInterfaceStyle인 이유는 과거에는 Appearance를 위와 같이 명칭했기 때문에
그리고 Apple에서 제공하는 디자인 kit에서 이렇게 색이 두개로 표시되는 이유 또한 다크모드에 대응해주기 위함이다.
에셋에서도 ColorSet을 통해서 다크모드를 대응할 수 있다.
그런데 여기 Any Appearance는 왜 있을까?
그건 바로 iOS 13부터는 다크 모드가 지원되지만 그 이전은 지원이 안되기 때문에 Any를 두어서 해당 색상을 적용해주는 것이다.
그리고 다크모드 지원을 이유로 iOS13부터는 색상을 .systemBlack / .systemRed로 표기하는 것이다.
4. Build Settings - Customized의 기능
Customized 부분은 우리가 프로젝트를 하면서 변경된 부분만 보여주는 것
그래서 General이나 info.plist에서 변경해준 것이 Build Settings에도 반영되어 있어야 바뀐 것임
5. Project와 Targets이 있는 이유
Project랑 Targets가 있는 이유는 프로젝트 하나에 타겟을 여러개 만들 수 있기 때문이다.
예를 들어, 나이키 런클럽이 iOS 앱도 있고, 애플워치 앱도 있고, 위젯도 만들 수 있으니까
하나의 목적의 앱인데 다양한 대응과 서비스를 제공하기 위해서 Targets를 두는 것이다.
그래서 프로젝트에 설정해둔 것들이 타겟들에게 상속되는 거고,
타겟 하나하나 설정을 바꿀 수 있기 때문에 각각 속성 변경이 가능하긴 하다.
우와 진쨔 개신기해 이런 소소한 이유는 몰랐는데..
6. 런치스크린 진행 속도를 늦추는 방법
didFinishLaunchingWithOptions
런치스크린이 떠있는 동안 위 메소드가 실행되는데 간혹가다가 개발하면서 런치스크린이 너무 빨리 사라져서 애먹었는데
이거는 아래처럼 sleep(Int) 메소드를 주면 된다. 약간 위험한 요소이긴 하대..
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
sleep(3)
return true
}
7. Breakpoint 찍먹
Edit Breakpoint로 특정 조건을 작성해서 멈출 수 있다.
8. Outlet Collection
9. 함수
애플에서 제공하는 함수가 있고, ( viewDidLoad() 등.. )
사용자가 직접 만든 함수가 있는데 UDF(UserDefinedFunction)라고 부른다.
우리가 함수를 일컬을 때 Function / Method 라고 부르는데 이 차이는 뭘까?
바로, Function은 모듈 전체에서 전역적으로 사용하는 거고,
Method는 클래스, 구조체, 열거형 등 특정 타입과 연관되어서 사용하는 거라고 보면 된다.
여튼 커스텀 함수에는 이렇게 파라미터를 줄 수 있는데
정확한 용어는... 아래와 같다.
buttonOutletVariable 은 argument label / 외부 매개변수
buttonName은 parameter name / 내부 매개변수
UIButton은 파라미터의 타입이긴 한데 그에 대한 값을 부르는 건 argument
파라미터가 정확히 무엇인지 설명해주기 위해서 아규먼트로 설명해주는 거라고 보면 될 것 같다.
근데 이렇게 외부 매개변수가 엄청 긴데, 충분히 함수명으로 이 버튼이 뭔지 가늠이 가기 때문에 생략을 해주고 싶다면?
언더바 _ 를 통해 생략이 가능하다
이 언더바는 와일드 카드 식별자 라고 부른다.
근데 이 와일드 카드 식별자를 너무 많이 남발하면 가독성이 떨어지니까 잘 판단해서 쓰자!
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] Copy items if needed, Move to Trash (0) | 2022.07.13 |
---|---|
[iOS] Rendering Mode, Build Phases, NavigationController, TabBarController (0) | 2022.07.11 |
[iOS] UITextFieldDelegate, DidEndOnExit, isHidden (1) | 2022.07.08 |
[iOS] SF Symbols, iOS 계층구조, 상속 (0) | 2022.07.05 |
[iOS] 애플의 생태계 및 기초적인 개념 (0) | 2022.07.05 |