iOS Swift:使用自定义ViewController的nil IBOutlets

时间:2017-10-04 15:30:48

标签: ios swift

晚上我的网点有问题。

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")
    }

2 个答案:

答案 0 :(得分:1)

你必须通过UIStoryboard对象实例化,如下所示:

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

您可以在解包的同时将其投放到自定义类中(使用as? CustomClassViewCotroller

编辑:静态函数来实例化您的视图控制器,如init:

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中你也必须设置变量,但那是另一个历史记录)。

祝你好运。

答案 1 :(得分:1)

在加载Storyboard文件之前,您的商店将为nil。所以,在init之后,它们将是零。您必须等到viewDidLoad被调用才能访问它们。

如果您需要init并在VC中设置内容,则必须添加其他(非出口)属性来保存该信息。你不能只是初始化然后访问插座。

编辑:在您的代码中(稍后添加),您没有使用XIB或故事板。但是,既然你有网点,我假设你真的有网点。

不要使用自定义初始化。而是在使用Storyboard实例化初始化后添加属性并设置它们。