project/Kuring(공지알림)

[iOS] Xcode Storyboard(스토리보드) 없이 코드로 대체하는 방법

lgvv 2022. 1. 7. 00:21

스토리보드 없이 코드로 대체하는 방법

(init) 2022.01.07: iOS 13.0 이상만 적용 가능한코드 

(update) 2022.02.25: iOS 13.0 미만 버전에서도 사용 가능하게끔 추가 

  - 13.0을 기준으로 SceneDelegate가 생김.

(update) 2022.11.03: Xcode 14 대응

 

✅ 이번 시간에는 스토리보드 없이 코드로 대체하는 방법에 대해서 알아볼 예정이야.

 

 

 ⚙️ Xcode 13.0 기준

 👉 Target iOS 13.0 이상 

 👉 Target iOS 13.0 미만

 

✅ iOS 13.0이상

 

1. 처음 단계로는 프로젝트 파일에서 Main.storyboard 파일을 없애 줍니다.

스토리보드 파일을 없앱니다.

2. Info.plist파일로가서 storyboard Name을 지워줍니다.

스토리보드 네임을 지우면 다음 사진과 같이 남습니다.

 

3. 프로젝트 타겟으로 이동하여서 Main Interface 부분을 비워줍니다.

원래는 Main이 적혀있는데 여기를 비워주기

 

(update) 2022.11.03: Xcode 14 대응 단 Xcode 14이상을 사용한다면? Main interface 저 부분을 아래처럼 대응합니다.

Xcode 14이상

 

 

 

4. SceneDelegate.Swift 파일을 수정합니다.

SceneDelegate.Swift파일에 이렇게 작성합니다.

<< 아래의 코드를 추가하기! >> 

        guard let windowScene = (scene as? UIWindowScene) else { return }
        window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        window?.windowScene = windowScene
        window?.rootViewController = ViewController(nibName: nil, bundle: nil) // 루트 뷰컨트롤러 생성
        window?.makeKeyAndVisible()

검은화면으로 뜨는데, 이건 ViewContoller에서 뷰의 백그라운드의 색을 직접 지정해주어야 합니다.

 

< 포스팅 이후에 글 수정 > 아래의 코드가 더 간결하고 좋습니다:)

    // 글 포스팅 이후에 수정!! 더 간결한 코드를 발견했어요:)
    
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        guard let windowScene = (scene as? UIWindowScene) else { return }
        
        window = UIWindow(windowScene: windowScene)
        window?.backgroundColor = .systemBackground
        window?.rootViewController = ViewController()
        window?.makeKeyAndVisible()
    }

 

👉 이후에 실행하면 완료! 

 

그렇다면 UINavigationView를 Embed in하기 위해서는 어떻게 해야할까?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        guard let windowScene = (scene as? UIWindowScene) else { return }
        
        window = UIWindow(windowScene: windowScene)
        window?.backgroundColor = .systemBackground
        window?.rootViewController = UINavigationController(rootViewController: ViewController())
        window?.makeKeyAndVisible()
    }

위와 같이 바꿔주면 된다.

 

 

✅ iOS 13.0 미만

그렇다면 SceneDelegate가 없는 13.0미만에서는 어떻게 해야 할까?

폴더의 구조

폴더의 구조를 위의 사진과 같이 만들어주세요.

스토리보드와 SceneDelegate를 지웠습니다.

Info.plist

Info.plist파일 안에 Application Scene Manifest를 삭제해주세요.

위의 사진과 같이 만들어주시면 됩니다.

 

🟠 AppDelegate.swift

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.backgroundColor = .yellow
        window?.makeKeyAndVisible()
        window?.rootViewController = UINavigationController(rootViewController: ViewController())
        
        return true
        
    }
}

위와 같은 코드로 작성해주세요.

 

 

<<약간의 주의사항>>

window?.backgroundColor을 설정할 때, 그 위의 있는 코드보다 먼저 작성하게 되면, 색상이 적용되지 않습니다.

 

Xcode 14이상을 사용한다면, 제일 아래 부분 Main storyboard file base name