自定义容器:@IBOutlets nil 即使视图显示正确

Custom container: @IBOutlets nil even though view is displaying correctly

我创建了一个 UIViewController。在这个视图控制器中,我有一个容器视图。

在代码中,我像这样实例化了容器视图:

var answerButtons: AnswerButtonsViewController!

override func viewDidLoad() {
    super.viewDidLoad()

    answerButtons = AnswerButtonsViewController()
    answerButtons.delegate = self

    println(answerButtons.name) // This prints out the correct string
    println(answerButtons.answerOne) // This prints out nil
    println(answerButtons.buttons) // This prints out an empty array

    retrieveSelectedCategory(selectedCategory!)
}

但是容器视图肯定是实例化的,因为在容器视图中 class 我设置了 UIButton 的背景颜色,这在我的应用程序中正确显示。

这是我的容器视图中的代码:

@IBOutlet var answerOne: UIButton!
@IBOutlet var answerTwo: UIButton!
@IBOutlet var answerThree: UIButton!
@IBOutlet var answerFour: UIButton!
@IBOutlet var answerFive: UIButton!
@IBOutlet var answerSix: UIButton!
@IBOutlet var answerSeven: UIButton!
@IBOutlet var answerEight: UIButton!

var buttons: Array<UIButton> = []

var name = "Is this set"

var delegate: AnswerButtonsViewControllerDelegate?

override func viewWillAppear(animated: Bool) {
    addAnswerButtonsToArray()
    buttons.map(customiseButtons)
}

func addAnswerButtonsToArray() {
    buttons.append(answerOne)
    buttons.append(answerTwo)
    buttons.append(answerThree)
    buttons.append(answerFour)
    buttons.append(answerFive)
    buttons.append(answerSix)
    buttons.append(answerSeven)
    buttons.append(answerEight)
}

func customiseButtons(button: UIButton) {
    button.layer.cornerRadius = 5
    button.setTitleColor(UIColor.blackColor(), forState: .Normal)
    button.backgroundColor = GSNColor.veryLightGrayColor()

    var title: String! = button.titleLabel?.text
    title.replaceRange(title.startIndex...title.startIndex, with: String(title[title.startIndex]).capitalizedString)
    button.titleLabel?.text = title
}

@IBAction func answerButtonPressed(sender: UIButton) {
    delegate?.answerButtonPressed(sender)
} 

按钮的 IBAction 也有效。

所以我不明白为什么我的 属性 answerButtons 被启动并且名字 属性 被设置好了。但是,打印时属性为 nil,数组为空。然而视图显示正确。

任何见解将不胜感激,如果您需要更多详细信息,请告诉我。

编辑

这是一张带有连接的故事板图片:

在加载视图之前,IBOutlet 将为零。您所做的只是实例化容器视图控制器,而不是显示或加载视图。

在调用 AnswerViewController 的 loadViewviewDidLoad 方法之前,IBOutlet 将不可用。

您可以查看:

if (answerButtons.isViewLoaded()) {

}

查看视图是否已加载。如果您想要加载视图,您需要访问控制器的视图 属性,或者将视图作为子视图添加到视图层次结构中。

容器视图中嵌入的控制器与容器视图的控制器同时实例化。你不应该自己实例化它。您只需要获取对它的引用。容器视图中的控制器是子视图是容器视图的控制器的子视图控制器。而不是这个,

answerButtons = AnswerButtonsViewController() // this creates another instance that you never use, and is never on screen

你应该有这个,

answerButtons = self.childViewControllers[0] as AnswerButtonsViewController

在这里,您只是实例化视图 controller.You 仅获取对 it.You 的引用必须使用故事板实例化视图控制器

let SB: UIStoryboard = UIStoryboard(name: StoryboardName, bundle: Bundle.main)
let VC = SB.instantiateViewController(withIdentifier: StoryboardIdOfViewController)
if let _ = VC.view {
    //Do here
}