iOS - Swift

[iOS/Swift] Storyboard, ViewController 접근 코드를 Protocol로 정의 (StoryboardInstantiable)

개발자 수니 2022. 2. 9. 15:22
728x90
반응형

📌  이번 글은

Storyboard를 접근 코드를 Protocol로 정의하여,

필요한 곳에 사용하는 예제입니다.

 

코드에서 Storyboard, Xib를 접근하는 방법에 대한 포스팅입니다.

 

[iOS/Swift] 코드에서 Storyboard, ViewController 접근 (instantiateViewController)

📌 이번 글은 코드에서 Storyboard와 ViewController를 접근하는 방법입니다. 👩🏻‍💻 예제 storyboardName : Storyboard 파일의 이름 storyboardId : Storayboard > ViewController의 id 코드에서 ViewContr..

sunidev.tistory.com

 

StoryboardInstantiable Protocol 정의

public protocol StoryboardInstantiable: NSObjectProtocol {
    associatedtype T
    static var defaultFileName: String { get }
    static func instantiateViewController(_ bundle: Bundle?) -> T
}

StoryboardInstantiable 확장

extension StoryboardInstantiable where Self: UIViewController {
    static var defaultFileName: String {
        return NSStringFromClass(Self.self).components(separatedBy: ".").last!
    }

    static func instantiateViewController(_ bundle: Bundle? = nil) -> Self {
        let fileName = defaultFileName
        let storyboard = UIStoryboard(name: fileName, bundle: bundle)
        guard let vc = storyboard.instantiateInitialViewController() as? Self else {
            fatalError("Cannot instantiate initial view controller \(Self.self) from storyboard with name \(fileName)")
        }
        return vc
    }
}

 

👩🏻‍💻 예제

 

Storyboard ViewController에 Storyboard ID 지정

ViewController Class에 StoryboardInstantiable 채택

import UIKit

class MainViewController: UIViewController, StoryboardInstantiable {

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

코드에서 StoryboardInstantiable을 채택한 ViewController로 이동

let mainVC: MainViewController = MainViewController.instantiateViewController(Bundle.main)
self.navigationController?.pushViewController(mainVC, animated: true)

 

 

🙋🏻‍♀️ 참고

Coordinator Tutorial for iOS: Getting Started

728x90
반응형