안녕하세요 yen입니다.
최근들어 스토리보드 대신 코드로 UI를 구현하는 연습을 하고 있는데요,
처음에는 세팅법을 몰라서 스토리보드를 그냥 냅두고 열심히 코드만 쳤던 기억이 나네요.
다들 저같은 일은 겪지 마시라고.. 적어둡니다.
🩵 코드베이스 프로젝트 설정 방법
우선은 프로젝트를 생성해줍니다.
iOS 개발을 하고 있으니 App으로 생성하구요
초기 프로젝트 파일에서 확장자가 storyboard인 것은 다 지워버립시다!!
- Main.storyboard 파일은 iOS 애플리케이션의 메인 인터페이스를 정의하는 데 사용되는 스토리보드 파일입니다.
- LaunchScreen.storyboard 파일은 앱이 시작될 때 보이는 초기 화면을 정의하는 데 사용됩니다.
하지만 저희는 SceneDelegate에서 window에 새로운 ViewController를 연결해 줄 거니 없어도 됩니다.
다음으로는 설정들을 몇개 지워줍니다
Info.plist > Scene Configuration > Window Application Session Role > Item 0 > Storyboard Name
프로젝트 최상단 폴더 선택 > Info > Scene Configuration > Window Application Session Role > Item 0 > Storyboard Name
프로젝트 최상단 폴더 선택 > Info > Main storyboard file base name
이 3개를 지우셨다면 삭제할 건 더 이상 없습니다!
이제 SceneDelegate에서 새로운 Navigator를 연결해주도록 합시다.
SceneDelegate.swift
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
let viewController = ViewController()
let navigationController = UINavigationController(rootViewController: viewController)
window?.rootViewController = navigationController
window?.makeKeyAndVisible()
}
SceneDelegate에서 scene(_:willConnectTo:options:) 메서드 내에 작성된 것으로,
새로운 Scene이 생성되고 연결될 때 호출되는 초기화 코드를 나타냅니다.
1. windowScene을 이용하여 새로운 UIWindow를 생성합니다.
UIWindow는 앱의 화면을 표시하는데 사용되는 컨테이너 역할을 합니다.
2. ViewController 클래스의 인스턴스를 생성합니다.
이는 앱의 초기 화면에 해당하는 뷰 컨트롤러입니다.
3. UINavigationController을 생성하고, 위에서 생성한 ViewController를 rootViewController로 설정합니다.
이로써 뷰 컨트롤러를 내비게이션 컨트롤러에 장착하게 됩니다.
4. 이어서 생성된 UINavigationController을 앞서 생성한 UIWindow의 rootViewController로 설정합니다.
이로써 내비게이션 컨트롤러가 화면의 루트 뷰 컨트롤러로 사용됩니다.
5. 마지막으로 window?.makeKeyAndVisible()를 호출하여 윈도우를 화면에 표시합니다.
이 코드를 통해 앱이 시작될 때, 새로운 Scene이 생성되고 해당 Scene에 대한 초기 화면이 설정되며,
이를 나타내는 윈도우가 화면에 나타납니다.
주로 앱의 초기 구성 및 루트 화면을 설정하는 용도로 작성합니다.
✅ AppDelegate와 SceneDelegate의 차이점
AppDelegate도 있는데 SceneDelegate에 작성하는 이유는 뭘까, 뭐가 다르지? 하고 조금 찾아보니
iOS13부터 iPad에서 multi window를 지원하게 되면서 scene delegate가 추가되었다고 합니다.
https://developer.apple.com/videos/play/wwdc2019/258/
Architecting Your App for Multiple Windows - WWDC19 - Videos - Apple Developer
Dive into the details about what it means to support multitasking in iOS 13. Understand how previous best practices fit together with new...
developer.apple.com
그니까
이런거...
이런거...
갤럭시에는 고리짝부터 있던 분할화면이로군요
AppDelegate는 전체 앱의 생명주기와 관련된 일을 담당하고,
SceneDelegate는 iOS 13부터 도입된 멀티-윈도우 및 Scene 환경에서
Scene의 생명주기와 해당 Scene에 대한 초기화를 담당한다는 소리인 것 같네요.
iOS 13부터는 멀티-윈도우 및 Scene 개념이 도입되었고,
이로 인해 각 Scene은 별도의 화면을 나타내며, 각각의 Scene에 대한 초기화와 구성이 필요하게 되었습니다.
따라서 SceneDelegate는 이러한 Scene의 생명주기와 초기화를 담당하게 되었습니다.
scene(_:willConnectTo:options:) 메서드는 새로운 Scene이 생성되거나 연결될 때 호출되는데,
이때 해당 Scene에 대한 초기화 코드를 작성할 수 있습니다.
var window: UIWindow? 및 그 아래의 네비게이션 연결하는 코드는 이러한 초기화 코드의 일부로,
새로운 Scene이 생성되거나 연결될 때마다 새로운 윈도우를 생성하고,
해당 윈도우의 루트 뷰 컨트롤러로 UINavigationController를 설정하고 화면에 표시하는 역할을 수행합니다.
이는 멀티-윈도우 및 Scene 개념에서 각 Scene이 독립적으로 활동하기 위한 설정으로,
AppDelegate에서는 전체 앱의 생명주기를 다루고,
각 Scene에 대한 초기화는 SceneDelegate에서 처리하기 위한 구조적인 변경에 따라 SceneDelegate에 작성하는 것 같습니다.
그렇죠, 화면 전환은 Scene 전환입니다. 그러니까 당연히 SceneDelegate에 작성하는 게 맞네요.
역시 이유없는 코드는 없는 법이로군요.
이렇게 AppDelegate와 SceneDelegate의 차이에 대해 한 번 알고 넘어가게 되었습니다.
하나하나 보다보면 새로운 궁금증이 생기는 것도 있고 그걸 알아가며 느끼는 재미도 큰 것 같습니다.
또 하나 알게되어서 기쁘네요~
❓ 런치 스크린 스토리보드는 지워도 Info 설정은 지우면 안되는 이유?
⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️
https://yy-dev.tistory.com/138
⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️
'iOS > Xcode' 카테고리의 다른 글
[XCode] 내 iOS 기기로 빌드할 때 발생할 수 있는 트러블 슈팅 (0) | 2024.03.12 |
---|---|
[Xcode] Unable to boot the Simulator 에러 해결 (1) | 2024.02.07 |
[Xcode] iOS 시뮬레이터 버전 변경/추가 (1) | 2024.02.07 |
[xcode] theme 바꾸기 (0) | 2023.12.23 |
[xcode] 툴 폰트 변경하기 (w. JetBrains Mono font) (0) | 2023.12.19 |