Xcode에서 Storyboard 없이 iOS 앱 개발하기

Storyboard 🖥

Storyboard는 Xcode를 이용해서 iOS 앱을 개발할 때 여러모로 유용하다. 쉽고 편하다기 보다는, 직관적이고 한눈에 앱의 플로우를 볼 수 있다는 장점이 있다. 하지만… 팀 단위로 Storyboard를 통해서 작업하고 코드를 공유하다 보면, 생각보다 자주 코드 병합(merge) 과정에서 오류가 난다. 또한 스토리보드가 방대해지면 꽤 느려진다…

이렇게 Storyboard가 많은 장점을 갖긴 하지만, 동시에 단점도 존재하기 때문에 필자는 얼마 전 부터, 오직 코드로만 iOS 앱 개발을 공부하고 있다. 생각보다 어렵지도 않고 (물론, 가끔은 머릿속에 UI가 그려지지가 않긴 한다 😂), SnapKit 이나 다른 라이브러리들과 함께 개발하면 오히려 더 편한 점들도 많은 것 같다.

그런데 Storyboard없이 Xcode에서 개발을 하기 위해선 몇 가지 작업을 해주어야 한다. 생각보다 더 간단하다.

Xcode 설정 ⚙️

1. 프로젝트를 생성한다.

image

따로 해줄 건 없고, 그냥 생성하자.

2. 프로젝트 이름과 타겟을 확인하고 General 탭에서 Main Interface를 삭제한다.

image2

위의 스크린샷 3번에 해당하 Main Interface 항목에서 기본으로 설정되어 있는 Main을 삭제한다. 그냥 지우고 리턴키 누르면 된다. 물론, Main.storyboard 파일은 삭제해도 상관 없다.

3. info.plist에서 Storyboard Name 키를 삭제한다.

image3

Application Scene Manifest 키 부분에 마우스를 갖다 대면 + 버튼이 나오는데, 계속 확장해서 위와 같이 펼친다. 그리고 Storyboard Name 키 부분을 삭제한다. - 버튼으로 삭제하면 된다.

4. SceneDelegate.swift에서 다음과 같이 코드를 추가한다.

image4

SceneDelegate는 Xcode 11부터 추가된 기본 iOS 템플릿이다. 이전의 AppDelegate의 역할 중, UI의 LifeCycle에 관한 부분을 SceneDelegate가 맡게 된 것이다. window 개념이 scene으로 대체되면서, 앱에서 여러 scene을 갖을 수 있게 된 것이다. 쨌든, SceneDelegate 클래스의 scene(_:, willConnectTo:, options:) 메서드에 다음과 같이 적어주면 된다.

// SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
  guard let windowScene = (scene as? UIWindowScene) else { return }
  window = UIWindow(windowScene: windowScene)
  window?.rootViewController = ViewController() // RootViewController를 연결
  window?.makeKeyAndVisible()
}

window?.rootViewController와 원하는 ViewController(TabBarController, NavigationController, ViewController, 등)를 연결시켜주면 된다.

마치며 💬

이제 머지할 때마다 충돌할 걱정없이 코드로 작업을 시작하면 된다. 또한 @IBOutlet 혹은 @IBAction 을 이용하기 위해 창을 두 개씩 띄울 필요도 없다. 가끔은 ViewLifeCycle 때문에 몇 가지 문제가 발생하기는 하지만, 이것에 대해서는 다음 포스팅에…


References