Swift 개발 이야기

iOS13 이상에서 스토리보드 없이 시작하기!

방화동한량 2020. 4. 3. 11:44
728x90

저는 스토리보드를 별로 좋아하지 않아서 신규프로젝트를 할때 무조건 스토리보드를 날리고 시작하는데요.

 

이전에는 AppDelegate 부분에서만 작업을 해주면 되었지만 SceneDelegate 가 나오면서 추가적으로 처리를 해줘야하는 부분이 생겼습니다.

 

일단 기존처럼 시원하게 Main.storyboard 파일을 지워버립시다.

 

그리고 Info.plist 부분에서 Application Scene Manifest -> Scene Configuration -> Application Session Role 에서 Storyboard name 을 삭제해줍시다.

 

이번엔 AppDelegate.swift 부분으로 가볼까요?

 

예전과는 달리 window 가 없습니다만, 걱정하실 거 없습니다. 추가해주시면 됩니다.

 

iOS 13 이상일 경우 AppDelegate 와 SceneDelegate 가 모두 호출되기 때문에, 여기서 13 이상 버전의 메인 루트뷰컨트롤러를 생성하게 되면 중복이 발생하므로, 이부분에 대한 분기처리를 해줍시다. 13 이상에서 루트뷰는 SceneDelegate 에서 해주면 되니 여기서는 아무것도 하지 않습니다.

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
         if #available(iOS 13, *) {
            
         } else {
            window = UIWindow()
            
            let rootVc = MainViewController()
                   
            window?.rootViewController = rootVc
            
            window?.makeKeyAndVisible()
        }
    
        return true
    }
    
    // MARK: UISceneSession Lifecycle
    
    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }
    
    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    }
    
}

 

이제 마지막으로 SceneDelegate.swift 로 이동해서, window의 크기를 scene 만큼으로 설정해주고 동일하게 rootViewController 를 설정해주면 됩니다.

 

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    @available(iOS 13.0, *)
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let scene = (scene as? UIWindowScene) else { return }
        
        window = UIWindow(windowScene: scene)
        
        let rootVc = MainViewController()
        
        window?.rootViewController = rootVc
        
        window?.makeKeyAndVisible()
        
    }
}

 

참 쉽죠?

 

이제부터 신나게 프로젝트를 만들어나가시면 되겠습니다.

 

그럼 다음 시간에 만나요

 

안녕~~~~