2017-05-09 1 views
3

새 인스턴스를 초기화하는 데 사용할 수있는 UIViewController 확장을 만들려고합니다. 프로젝트의 각보기 컨트롤러마다 해당 스토리 보드가 있습니다.일반 UViewController 이니셜 라이저 만들기

즉 이것은 내가 지금까지 무엇을 가지고

EditSomethingViewController.swift 
EditSomethingViewController.storyboard 

:

extension UIViewController { 

    static func initalize() -> UIViewController? { 
     let name = String(self) 

     let storyboard = UIStoryboard(name: name, bundle: nil) 

     return storyboard.instantiateInitialViewController() 
    } 

} 

그러나이 내가 그것을 사용할 때, 난 아직 응답을 캐스팅 할 필요가 있다는 것을 의미한다.

if let viewController = EditSomethingViewController.initalize() as? EditSomethingViewController { 
    // do something with view controller here 
} 

그것이 내가 응답을 캐스팅하지 않아도 의미있는 방식으로 확장을 만들 수 있습니까?

p.s. Swift 2.3으로 작성된 오래된 프로젝트에서 작업하면 지원되는 답변을 감상 할 수 있습니다.

+0

방금 ​​함수 내 캐스트와'EditSomethingViewController을 반환'대신 수 : 그건 내가이 시험하지 않았다하지만이 작업을해야 너무 많은 일 :

것입니까? –

답변

1

나는이 확장을 사용

let controller = MyViewController.instantiateFromStoryboard() 
0

반환 유형을 메서드 호출 대상 유형과 일치하는 Self으로 변경할 수 있습니다.

이것은 이전에 사용한 방법입니다. 대신 프로토콜 확장에 넣어야합니다.

extension UIViewController 
{ 
    class func instantiateFromStoryboard(_ name: String = "Main") -> Self 
    { 
     return instantiateFromStoryboardHelper(name) 
    } 

    fileprivate class func instantiateFromStoryboardHelper<T>(_ name: String) -> T 
    { 
     let storyboard = UIStoryboard(name: name, bundle: nil) 
     let controller = storyboard.instantiateViewController(withIdentifier: String(describing: self)) as! T 
     return controller 
    } 
} 

사용법 :

static func loadFromStoryboard() -> Self? { 
    let storyboard = UIStoryboard(name: NSStringFromClass(self), 
            bundle: Bundle(for: self)) 
    return storyboard.instantiateInitialViewController() as? Self 
} 
+0

아니요, 클래스 확장에서 작동하지 않습니다. – Sweeper

0

나는 당신이 당신의 벤처의 모든 하나가 수동으로 프로토콜을 준수 만들고 싶어하지 않는 것으로 가정합니다.

protocol Initializable { 
    static func initalize() -> Self? 
} 

extension UIViewController: Initializable { 
    static func initalize() -> Self? { 
     let name = NSStringFromClass(self as! AnyClass) 

     let storyboard = UIStoryboard(name: name, bundle: nil) 

     return storyboard.getInitialVC(type: self) 
    } 
} 

extension UIStoryboard { 
    func getInitialVC<T: UIViewController>(type: T.Type) -> T? { 
     return instantiateInitialViewController() as? T 
    } 
}