project/Kuring(공지알림)

[iOS] Xcode Storyboard 제거 후 코드로 대체하는 방법

lgvv 2022. 1. 7. 00:21

[iOS] Xcode Storyboard 제거 후 코드로 대체하는 방법

 

스토리보드를 제거하고 코드 기반으로 세팅하는 방법에 대해서 알아보자

 

히스토리 기록

  • 2022.01.07
    • 첫 포스팅 iOS 13 이상에서만 적용 가능한 코드로 작성
  • 2022.02.25
    • iOS 12 이하 버전에서도 적용 가능한 코드로 변경
    • 사유: SceneDelegate가 iOS 13 이후에서 사용 가능하기 때문
  • 2022.11.03
    • Xcode 14 대응

 

 

 

개발 환경

  • Xcode 13.0 기준
  • Target iOS 13.0 이상 / Target iOS 12.0 이하

 


iOS 13.0 이상

1. 프로젝트 파일에서 Main.storyboard 파일을 없애기.

스토리보드 파일 제거

 

 

2. Info.plist파일로가서 Storyboard Name 제거하기

 

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

 


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

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

 


2022.11.03: Xcode 14 대응

단, Xcode 14 버전을 사용한다면 Main interface 부분을 아래처럼 대응

Xcode 14 이상

 

 

 

SceneDelegate.Swift 파일을 수정

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


UIwindow를 코드 기반으로 구성

        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()


검은화면으로 뜬다면, ViewController에서 뷰의 백그라운드 색을 지정.

만약 위 아래가 검은색으로 짤려서 나타난다면 Info.plist에서 제대로 연결되지 않았을 수 있음.

 



가장 추천하는 방식

SceneDelegate에 추가하기

위 방법이 bounds를 사용하지 않아서 제일 깔끔함!

    // 글 포스팅 이후에 수정!! 더 간결한 코드를 발견했어요:)
    
    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()
    }

 

이후에 실행하면 제대로 나타남.

 

그렇다면 UINavigationController를 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()
    }

 

UITabView도 마찬가지임.

 

 

iOS 12.0 이하

그렇다면 SceneDelegate가 없는 12.0 이하에서는 AppDelegate를 사용할 수있음.

(iOS 11까지는 커버하는게 아직까지는 좋다고 보임.)

폴더의 구조



iOS 12 이하에서 사용하려면 스토리보드와 SceneDelegate를 지움.

 

Info.plist


Info.plist파일 안에 Application Scene Manifest를 삭제

 

AppDelegate.swift (iOS 12 이하)

SceneDelegate에서 하던 작업을 AppDelegate로 옮긴것 뿐

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