2015-09-23 46 views
2

我想創建UIViewController的子類,然後通過故事板或以編程方式將數據傳遞給它。什麼到目前爲止,我已經嘗試是有一類subViewController是一個UIViewController用故事板或編程創建視圖時的自定義init

import UIKit 

class subViewController: UIViewController { 

    var s1 = String() 

    init(myString: String) { 

     self.s1 = myString 
     super.init(nibName: nil, bundle: nil) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    @IBOutlet var label: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
     print(self.s1) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

然後在身份督察此連接到視圖控制器

和AppDelegate.swift

一個subViewController迅速文件
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 

    let SubVC = subViewController(myString: "Komic") 

    self.window?.rootViewController = SubVC 

    self.window?.makeKeyAndVisible() 
    return true 
} 

加載黑屏但註銷myString。據我瞭解,它不創建視圖,但它只是創建類的實例,這就是爲什麼它給了我黑屏。我也知道這部分

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

當故事板給你的觀點時運行。但是我不能在那裏傳遞數據,這就是爲什麼我要做這個程序設計的原因。有沒有可能做到這一點?我知道我可以實例化與故事板的標識符,但我找不到一種方法來通過我的數據....任何幫助?

回答

-1

當您調用自定義初始化程序時,如果創建了客戶機初始化程序,您不會從故事板加載視圖控制器,但是它有責任以編程方式創建視圖層次結構 - 通常在loadView()中,儘管很多人都在viewDidLoad中()。

爲了將負載你的故事板中定義的視圖層次,你可以這樣做:

let storyBoard = UIStoryboard(name: "storyboardName", bundle: NSBundle.mainBundle()) 
let viewController = storyBoard.instantiateViewControllerWithIdentifier("storyboardId") 

您定義的身份檢查

+1

我不知道我怎麼會用這個傳遞數據。如果我創建故事板並實例化View Controller,那麼我的自定義init不會運行,對吧?所以要麼我必須在loadView()中創建我的視圖層次結構(我不知道該怎麼做)或者使用storyboard加載我的視圖(並且不傳遞任何數據)。 –

+1

是的,這是(imo)使用storyboard/Nib的缺點之一是你不能在初始化時將任何值注入你的視圖控制器,因爲初始化是由框架完成的。通常,您在創建後設置這些屬性,或者在prepareForSegue方法中使用segues。在swift中,這提出了一個問題必須是可選或隱式解包可選屬性 –

+0

我看到......這確實是一個問題,因爲如果我想要一個超類,所有我的類繼承,所以我可以訪問任何我想要的在應用程序的任何地方:( –

2

的視圖控制器的故事板ID(醜)的方式來解決這個問題:

您可以從外部緩衝區設置你的var s1在你的代碼(在這個例子中的AppDelegate變量)

required init?(coder aDecoder: NSCoder) { 
    self.s1 = UIApplication.shared().delegate.bufferForS1 

    super.init(coder: aDecoder) 
} 

而當你通過故事板開始你的UIViewController:

UIApplication.shared().delegate.bufferForS1 = myS1Value 
self.navigationController!.pushViewControllerFading(self.storyboard!.instantiateViewController(withIdentifier: "myViewControllerID") as UIViewController) 
相關問題