프로젝트 내에서 스토리보드를 사용하지 않고 코드로만 개발하고싶을 때.. 어떻게 하는건지 알아봅시다.
코드로만 개발하고싶은 저희는 Main.storyboard 파일이 필요없으므로 Move to Trash 버튼
을 클릭하여 파일을 삭제합니다.
Main.storyboard 파일을 삭제하고 빌드해보면 아래와 같은 오류가 발생합니다.
Main이라는 이름을 가진 스토리보드 파일을 찾을 수가 없다고 하네요. 빌드하는 과정에서 Main 스토리보드를 찾는 절차가 있나봐요.
그걸 제가 한번 못하게 막아보겠습니다..
Thread 1: "Could not find a storyboard named 'Main' in bundle NSBundle </Users/yujin/Library/Developer/CoreSimulator/Devices/86FC650D-6C05-4AE1-857B-ACF2A0392A33/data/Containers/Bundle/Application/2470D18F-8D38-4695-9808-1A15DDBE1E32/Cheesy.app> (loaded)"
왼쪽 프로젝트 네비게이터에서 Info 파일을 클릭한 후 토글을 눌러 끝까지 열다보면 Storyboard Name 항목을 발견할 수 있습니다.
빌드 시에 시스템이 Info파일을 딱 훑어보면서 Storyboard Name 항목을 확인하는데 Main 파일이 존재하지 않아서 위와 같은 오류가 발생한 거 같아요.
그럼 Storyboard Name 항목을 -
버튼을 눌러 제거해줍시다.
... 또 오류가 발생하네요. .. 또 Main.storyboard 를 찾을 수 없다네요. 또 어디서 Main 파일을 찾고있는 걸까요?
Thread 1: "Could not find a storyboard named 'Main' in bundle NSBundle </Users/yujin/Library/Developer/CoreSimulator/Devices/86FC650D-6C05-4AE1-857B-ACF2A0392A33/data/Containers/Bundle/Application/BC0B2D0F-EE82-45F7-8F22-4AF97329A83D/Cheesy.app> (loaded)"
프로젝트 네비게이터의 최상단에 위치한 프로젝트 이름을 클릭해봅시다.
General > Deployment info > Main interface 항목을 확인해보면 Main 이라고 적혀있네요..? 이놈아!
Main을 지워줍시다.
이상태로 빌드해보면 오류는 안나지만 화면에 아무것도 안보입니다.
생각해보면 당연합니다. 시스템은 Main.storyboard를 휴대폰 화면에 띄우기로 설정해놨는데, 우리가 그 Main.storyboard를 삭제해버렸잖아요.. 그래서 화면에 띄울 무언가를 저희가 직접 연결해줘야 합니다.
연결해볼까요?
화면과 관련된 부분은 sceneDelgate.swift 파일에서 설정합니다.
저희는 func scene(...) {...}
함수 내에 코드를 작성합니다.
우리가 코드를 작성할 scene 메소드는 scene(화면)이 앱에 추가될 때 호출되는 메소드입니다.
여기에 무슨 화면이 추가될 지 설정해주면 됩니다.
아래의 코드를 scene 메소드 내부에 작성하면 됩니다.
ViewController의 배경색은 기본적으로 검은색이기 때문에 배경색을 변경해보면 등록한 ViewController가 실행되는 것을 확인해볼 수 있습니다.
// 먼저 매개변수 scene을 통해 하나 이상의 Window를 관리할 수 있는 windowScene을 생성합니다.
guard let windowScene = (scene as? UIWindowScene) else { return }
// 미리 선언되어있던 window 프로퍼티에 휴대폰의 크기를 가져와 window를 생성해 할당해줍니다.
window = UIWindow(frame: UIScreen.main.bounds)
// window의 루트뷰에 실제로 앱 실행 시에 보여질 ViewController를 NavigationController의 루트뷰로 넣어줍니다.
window?.rootViewController = UINavigationController(rootViewController: ViewController())
// 이 window가 실제로 보이도록 설정해줍니다.
window?.makeKeyAndVisible()
// 우리가 만든 윈도우씬을 실제 윈도우 씬에 넣어줍니다.
window?.windowScene = windowScene