본문 바로가기
Swift 개발 이야기

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

by 방화동한량 2020. 4. 3.
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()
        
    }
}

 

참 쉽죠?

 

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

 

그럼 다음 시간에 만나요

 

안녕~~~~