storyboard에 연결된 ViewController를 얻는 방법

storyboard의 파일 이름과 ID 지정



준비를 위해 example.storyboard 파일을 만들고, ViewController를 배치하고, 스토리보드 ID를 씁니다. (화면 오른쪽)


이니셜라이저에 값이 필요하지 않은 경우



이니셜라이저에 값이 필요하지 않은 경우라는 표현이 적절한지는 모릅니다.
let vc: UIViewController = UIStoryboard(name: "main", bundle: nil).instantiateViewController(identifier: "second")

이니셜라이저에 값이 필요한 경우



이니셜 라이저에 값이 필요한 경우,
class: UIViewController {
    private let text: String
    init?(coder: NSCoder, text: String) {
        self.text = text
        super.init(coder: coder)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

처럼 ViewController가 값이 없는 변수를 가지고 있는 경우를 가리킵니다.
let vc: UIViewController = UIStoryboard(name: "main", bundle: nil).instantiateViewController(identifier: "second") { coder in
        return SecondViewController(coder: coder, text: "text")
}

storyboard의 파일 이름만 지정하고 initialViewController를 지정합니다.



준비를 위해 example.storyboard 파일을 만들고 ViewController를 배치한 다음 Is Initial ViewController를 선택합니다.


이니셜라이저에 값이 필요하지 않은 경우


let vc: UIViewController = UIStoryboard(name: "main", bundle: nil).instantiateInitialViewController()!

이니셜라이저에 값이 필요한 경우


let vc: UIViewController = UIStoryboard(name: "main", bundle: nil).instantiateInitialViewController { coder in
        return SecondViewController(coder: coder, text: "hoge")
    }!

R.swift를 사용하여 initialViewController 지정



준비로 R.swift를 확장합니다.
import Rswift
public extension StoryboardResourceWithInitialControllerType {

    @available(iOS 13.0, tvOS 13.0, *)
    func instantiateInitialViewController<ViewController>(creator: ((NSCoder) -> ViewController?)? = nil) -> UIViewController? where ViewController: UIViewController {
        UIStoryboard(resource: self).instantiateInitialViewController { coder in
            creator?(coder)
        }
    }

    @available(iOS 13.0, tvOS 13.0, *)
    func instantiateViewController<ViewController>(identifier: StoryboardViewControllerResource<ViewController>,creator: ((NSCoder) -> ViewController?)? = nil) -> UIViewController where ViewController: UIViewController {
        UIStoryboard(resource: self).instantiateViewController(identifier: identifier.description) { coder in
            return creator?(coder)
        }
    }

}

이니셜라이저에 값이 필요하지 않은 경우


let vc: UIViewController = R.storyboard.main.instantiateInitialViewController()!

이니셜라이저에 값이 필요한 경우


let vc = R.storyboard.main.instantiateInitialViewController { coder in
            return SecondViewController(coder: coder, text: "")
        }!

R.swift를 사용하여 ID 지정



이니셜라이저에 값이 필요하지 않은 경우


let vc: UIViewController = R.storyboard.main.second()

이니셜라이저에 값이 필요한 경우


let vc: UIViewController = R.storyboard.weather.instantiateViewController(identifier: R.storyboard.weather.second) { coder in
            return SecondViewController(coder: coder, text: "")
        }

좋은 웹페이지 즐겨찾기