2017-10-04 75 views
0

晚上我有一個網點問題。iOS Swift:無自定義ViewController的IBOutlets

viewController1做出幾個實例ViewController2,呈現他們與一個控制的PageControl頁面容器。

問題是,視圖控制器網點在ViewController2始終爲零。

可能是因爲ViewController2是通過代碼實例化的。

我該如何解決這個問題?

這裏我創建了不同的ViewController2

let page = OnboardPageViewController(onboard: onboard) 
      pages.append(page) 

這裏是ViewController2

的初始化代碼
//-------------------- 
    //MARK: - Outlets 
    //-------------------- 

    @IBOutlet var backgroundVideoView: BackgroundVideo! 
    @IBOutlet var backgroundUIImage: UIImageView! 
    @IBOutlet var titleLabel: UILabel! 
    @IBOutlet var descriptionLabel: UILabel! 

    //-------------------- 
    //MARK: - Properties 
    //-------------------- 

    let onboard: Onboard 

    //-------------------- 
    //MARK: - View's Methods 
    //-------------------- 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print("loaded: \(onboard.title)") 

     //FIXME: - need to find a way to link the outlets even if the controller is called via code 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 
     print("presenting: \(onboard.title)") 
    } 

    init(onboard: Onboard) { 
     self.onboard = onboard 
     super.init(nibName: nil, bundle: nil) 
    } 

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

請包括控制器實例代碼 – Alladinian

+0

@Alladinian現在檢查它:) –

回答

1

你必須通過UIStoryboard對象,這樣的實例:

if let viewController = UIStoryboard.init(name: "YourStoryBoardName", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") { 
    // do something with it 
} 

您可以投射它以解包(用as? CustomClassViewCotroller

編輯的同時,您的自定義類:靜態FUNC實例化視圖控制器像初始化:

class YourViewController: UIViewController { 

    static func instantiate(withViewModel vm: ViewModel) -> YourViewController? { 
     if let viewController = UIStoryboard.init(name: "YourStoryboard", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") as? YourViewController { 
      viewController.viewModel = vm 

      return viewController 
     } 

     return nil 
    } 

    var viewModel: ViewModel? 

    // ... 

} 

將會有更多的可選展開在你的代碼的時候使用viewModel var,但我認爲這是以編程方式創建視圖控制器的正確方法(在segues中,您也必須設置變量,但這是另一個歷史記錄)。

祝你好運夥計。

+0

好的謝謝,但我使用自定義的初始化,我該怎麼做呢? –

+1

不要使用自定義的初始化。將屬性添加到您的VC並在您通過故事板實例化後設置它們 –

+0

正如Lou Franco所說,您可以在故事板瞬時設置後設置視圖控制器視圖模型。我通常在每個視圖控制器中都有一個靜態方法,它可以通過1次調用完成所有的瞬時操作 –

1

直到加載故事板文件爲止,您的網點將是nil。所以,在初始化之後,它們將是零。您必須等到viewDidLoad才能訪問它們。

如果您需要init並在VC中設置了一些東西,您必須添加其他(非出口)屬性來保存該信息。你不能只是初始化,然後訪問一個插座。

編輯:在您的代碼(稍後添加),您不使用XIB或故事板。但是,既然你有網點,我假設你確實有一個。

請勿使用自定義init。相反,添加屬性並在使用Storyboard實例化初始化後設置它們。

+0

我不知道該怎麼做,你能舉個例子嗎? –

+1

請參閱Jose關於如何從故事板實例化的答案。在'if let'裏面,設置viewController.onboard。 –

相關問題