2015-08-05 33 views
16

Bir storyboard'da tanımlanmış bir ViewController örneğim var. Ben initswift - Görünüm denetleyicisini init düzenini başlangıçta geçersiz kılarak storyboard'dan başlat

convenience init() { 
    self = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("SearchTableViewController") as! SearchTableViewController 
} 

geçersiz kılma çalıştı

var myViewController = ViewController() 

kullanarak başlatmak böylece viewController init yöntemini geçersiz kılmak için bir yolu var mı şu

var myViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("myViewControllerIdentifier") as! ViewController 

bu oluşumu başlatabilirsiniz ama derleyici bundan hoşlanmaz. Herhangi bir fikir?

+0

bir çözüm yok, ama neden bunu yapmak isteyeyim? – Caleb

+0

Sadece sanırım daha temiz görünüyor. Ayrıca, görünüm bir uçta tasarlanmışsa, otomatik olarak çalışır, böylece başlangıç ​​kodlarını – adamF

+0

değiştirmeden öykü tablolarına gidiyorum. Her ViewController sınıfı için özel bir ViewController sınıfı oluşturmaya ne dersiniz? Bu benim için çok daha temiz görünüyor. – Caleb

cevap

24

Bir kolaylık başlatıcısı her zaman aynı sınıf için belirlenmiş bir başlatıcıya delege vermeli ve atanmış bir başlatıcı bir üst sınıf başlatıcıyı çağırmalıdır. üst sınıf uygun bir başlatıcı olmadığından, muhtemelen daha iyi bir sınıf fabrika yöntemi ile hizmet olacağını

:

static func instantiate() -> SearchTableViewController 
{ 
    return UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("SearchTableViewController") as! SearchTableViewController 
} 

sonra kullanın:

var myViewController = SearchTableViewController.instantiate() 
+3

- fabrika yöntemleri "make" ile başlamalıdır. https://swift.org/documentation/api-design-guidelines/ – user1687195

11

A sınıfı fabrika yöntemidir Şimdilik gitmek için yol. İşte, tüm UIViewController s ürününüze hızlı bir şekilde instantiate() desteği eklemek için kullanabileceğiniz bir protokol.

protocol StoryboardInstantiable { 

    static var storyboardName: String { get } 
    static var storyboardBundle: NSBundle? { get } 
    static var storyboardIdentifier: String? { get } 
} 
​ 
extension StoryboardInstantiable { 

    static var storyboardIdentifier: String? { return nil } 
    static var storyboardBundle: NSBundle? { return nil } 

    static func instantiate() -> Self { 
     let storyboard = UIStoryboard(name: storyboardName, bundle: storyboardBundle) 

     if let storyboardIdentifier = storyboardIdentifier { 
      return storyboard.instantiateViewControllerWithIdentifier(storyboardIdentifier) as! Self 
     } else { 
      return storyboard.instantiateInitialViewController() as! Self 
     } 
    } 
} 

Örnek:

extension MasterViewController: StoryboardInstantiable { 

    static var storyboardName: String { return "Main" } 
    static var storyboardIdentifier: String? { return "Master" } 
}