「Refactor to Storyboard」로 일정한 플로우를 하나의 Storyboard로서 정리해 두면 편리

Xcode7에서 사용할 수 있게 된 Storyboard Reference를 사용하면 코드를 작성하지 않고 Storyboard 간의 참조를 할 수 있게 되었습니다.

이미 Storyboard 내에 있는 ViewController에서 Storyboard Reference를 만들 때의 흐름은,
1. 다른 스토리 보드로 나누고 싶은 ViewController를 선택 (복수 선택 가능)
2. Editor > Refactor to Storyboard... 선택
3. 대화 상자에 따라 스토리 보드 파일 만들기

입니다.

참고
Refactoring Storyboards

Storyboard Reference를 사용하여 Storyboard를 깨끗하게 만듭니다.



지금까지 엉망이었던 스토리 보드 파일


Storyboard Reference를 사용하면 Segue의 연결로 Storyboard끼리를 연계할 수 있게 되어, 간단하게 깨끗하게 유지할 수 있게 되었습니다.


Storyboard로 잘라내는 데 사용하는 Refactor to Storyboard...

스토리 보드 참조를 사용할 때 빌드 오류



편리하다고 생각해 Refactor to Storyboard... 로 Storyboard Reference를 만들고 있으면, 빌드 에러가 되는 일이 있었습니다.
Storyboard Reference는 기본적으로 Deployment Target iOS 8.0 에서 사용할 수 있지만 iOS 9.0 이전 버전이라면 빌드 오류가 발생할 수 있습니다.


"Storyboard References cannot be the destinations of relationship segues prior to iOS 9.0"과 빌드 오류가 발생한 경우의 해결 방법



「relationship segue로 연결하는 곳에 Storyboard Reference를 지정하려면 iOS 9.0 이상이 아니면 안 된다」라고 하는 에러입니다만, 구체적으로는 TabBarController나 NavigationController로부터 직접 Storyboard Reference를 연결하면 일어납니다.

모처럼 다른 Storyboard로 나눈 흐름은 그대로 남겨두고 싶기 때문에 Storyboard Reference를 사용하지 않고 코드에서 Storyboard를 호출하도록 변경합니다.

TabBarController의 경우



스토리 보드에서 연결된 스토리 보드 참조를 제거하고 UITabBarController 만 만듭니다.Refactor to Storyboard로 만든 스토리 보드 파일 자체를 그대로 둡니다.


코드는 UITabBarController를 상속하는 클래스를 만들고 UITabBarController의 viewControllers를 지정합니다.
class TabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let firstViewStoryboard = UIStoryboard(name: "FirstView", bundle: NSBundle.mainBundle())
        let secondViewStoryboard = UIStoryboard(name: "SecondView", bundle: NSBundle.mainBundle())

        let firstViewController = firstViewStoryboard.instantiateInitialViewController()
        let secondViewController = secondViewStoryboard.instantiateInitialViewController()

        self.viewControllers = [firstViewController!, secondViewController!]

        // Do any additional setup after loading the view.
    }

}

UITabBarController는 Storyboard Reference를 사용하지 않으므로 이전 빌드 오류는 제거되고 Refactor to Storyboard...로 만든 Storyboard 파일은 그대로 사용할 수 있습니다.

NavigationController의 경우



NavigationController에서도 마찬가지로 코드에서 UINavigationController의 viewControllers를 지정합니다.
class NavigationController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let navigationStoryBoard = UIStoryboard(name: "Navigation", bundle: NSBundle.mainBundle())
        let navigationViewController = navigationStoryBoard.instantiateInitialViewController()

        self.viewControllers = [navigationViewController!]
    }

}

사이고에게



「설정 화면의 Storyboard」나 「튜토리얼 화면의 Storyboard」와 같이, 일정한 플로우를 하나의 Storyboard로서 정리해 두면 플로우 자체를 그대로 다른 어플리에서도 재이용할 수 있으므로 편리합니다.

개인으로 만든 모두의 목록 라는 앱을 개발할 때는 메인 앱과는 별도로 튜토리얼만의 작은 프로젝트 파일을 만들어 어느 정도 할 수 있는 단계에서 Storyboard별 메인 앱으로 옮기기도 했습니다.

좋은 웹페이지 즐겨찾기