[Xcode/Swift] SceneDelegate 지우고 SwiftUI 사용하기

작성기준일

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

View at Medium.com

0 Shares:
Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.