티스토리 뷰

애플에서 Scene을 적용하면서 이렇게 하게 되어 버렸네요.

 

저는 얼마전까지는 화면이 눈에 잘 보이는 스토리보드를 좋아하였지만 지금은 그냥 화면을 코드에 만들고 있습니다.

이것이 더 코드의 유지보수를 하는 방법에서 효율적이기 때문입니다.

물론 SwiftUI와 비슷한 형태의 View Create 방법을 만들어서 적용해서 쓰기도 하는 이유가 있을거 같기도 하지만요.

 

중요한것은 13부터는 AppDelegate에만 해주는것이 아니고 SceneDelegate에도 하여 주어야 한다는 겁니다.

 

그리고 이 세팅 부분은 multi scene의 지원에 대한 부분은 아니므로 그 부분은 나중에 추가해서 올리도록 할게요

그래서 저는 파일을 하나 만들었어요.

Info.plist file 수정

storyboard name을 삭제하여 줍니다.

Project setting에서 Main Interface를 삭제합니다.

WindowManager.swift를 만들어 줍시다.

두곳에 같은 소스를 넣어주어야 하기 때문에 class를 하나 만들어서 개발하도록 합니다.

import UIKit

final class WindowManager {
    
    private var window: UIWindow
    
    init(with window: UIWindow = UIWindow()) {
        self.window = window
    }
    
    convenience init(with scene: UIWindowScene) {
        let window = UIWindow(windowScene: scene)
        self.init(with: window)
    }
    
    func setRootViewController(_ controller: UIViewController = ViewController()) {
        window.rootViewController = controller
        window.makeKeyAndVisible()
    }
}

rootViewController로 지정한 ViewController class는 예시로 사용하시는 환경에 맞도록 수정해주세요

AppDelegate.swift 수정합니다.

class AppDelegate: UIResponder, UIApplicationDelegate {

    var windowManager: WindowManager?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        if #available(iOS 13, *) {} else {
            windowManager = WindowManager()
            windowManager?.setRootViewController()
        }
        
        return true
    }
    
    // ...
}

13이상에서는 이곳에서 세팅하지 않습니다. avilable로 분기를 해서 진행합니다.

SceneDelegate.swift 수정합니다.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var windowManager: WindowManager?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let scene = (scene as? UIWindowScene) else { return }
        windowManager = WindowManager(with: scene)
        windowManager?.setRootViewController()
    }
    
    // ...
}

ViewController.swift 수정하기

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .white
        
        let label = UILabel(frame: .zero)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "Hello, test"
        
        view.addSubview(label)
        
        NSLayoutConstraint.activate([
            label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            label.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])
    }
}

이렇게 해주고 실행하면 화면중앙에 Hello, test!가 나올겁니다.

궁금한점은 댓글 남겨주시기 바랍니다.

 

source : github.com/outofcode-example/iOS-NoStoryboard

 

outofcode-example/iOS-NoStoryboard

No use storyboard for iOS root viewcontroller. Contribute to outofcode-example/iOS-NoStoryboard development by creating an account on GitHub.

github.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함