작성기준일
2020년 6월 23일, 향후 작업을 위한 스스로를 위한 로그의 의미 + 누군가에게 도움이 될지 모른다는 목적으로 기록을 남깁니다.
Intro
직접 swift 코드를 직접 짜게 되는 일은 가계부 앱 이후에 없을 것이라고 다짐했지만, 잠깐 부업(?)으로 시작하려는 의학 + IT 프로젝트의 프로토타입을 제작하기 위해 어쩔 수 없이 손을 대버렸습니다.
최근 가계부앱 업데이트하면서도 느꼈지만 Swift 버전도 5까지 올라가버렸는데, SwiftUI라는 것도 새로 생기고, ‘새로운 프로젝트’를 만들어보니 구조가 달라졌던데요, SceneDelegate라는 것도 생겼고.
이전 버전과의 호환성 및 여러가지 고민하다보니 많은 사람들이 SceneDelegate라는 것을 삭제하고 쓰는 듯 합니다. 그런데 또 그 이후의 예제를 못찾아서, 아래의 Reference 들을 바탕으로 소스를 구성했습니다.
SceneDelegate 지우기
3번째 레퍼런스를 보면 자세히 사진까지 첨부되어 간단히 넘어갑니다. 최종 소스는 맨 아래에 붙여넣습니다.
1. SceneDelegate.swift 파일을 삭제한다.
2. var window: UIWindow? 코드는 AppDelegate로 복사한다.
3. Info.plist 에서 Application Scene Manifest 항을 (-)를 눌러 삭제한다.
AppDelegate 에서 첫 View를 세팅하기
예전에는 storyboard를 썼었는데, 이게 사실 참 골치아픈 툴이기도 했는데, SwiftUI 는 가계부앱에 썼던 UI 라이브러리랑 사뭇 닮은 듯해서, 그대로 가져가면 좋겠다 싶었습니다.
2번 레퍼런스를 보니, 이전 버전의 ViewController와 SwiftUI 의 ContentView 구조가 호환되는 듯 합니다.
따라서 아래와 같은 순서로 진행합니다.
1. SwiftUI를 import 시킨다.
2. UIHostingController로 ContentView를 연결시킨다.
Source
AppDelegate.swift
// // AppDelegate.swift // JMonitor2 // // Created by J Seok on 2020/06/23. // Copyright © 2020 J Seok. All rights reserved. // import UIKit import SwiftUI @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. window = UIWindow(frame: UIScreen.main.bounds) let vc = UIHostingController(rootView: ContentView()) window?.rootViewController = vc window?.makeKeyAndVisible() return true } }
ContentView.swift
// // ContentView.swift // JMonitor2 // // Created by J Seok on 2020/06/23. // Copyright © 2020 J Seok. All rights reserved. // import SwiftUI struct ContentView: View { var body: some View { NavigationView{ Form{ Text("Hello, World!") Button("TestButton") { //Callback } }.navigationBarTitle("TestApp") } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
Result
Reference
1. https://medium.com/@herryhan2435 (https://url.kr/WiyQC5)
2. https://www.hohyeonmoon.com (https://www.hohyeonmoon.com/blog/swiftui-tutorial-uikit/)
3. https://stackoverflow.com/questions/58084127/ios-13-swift-set-application-root-view-controller-programmatically-does-not/60329391#60329391