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

时间:2015-03-08 21:52:16

标签: ios swift iboutlet uicontainerview

我创建了一个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!)
}

然而,容器视图肯定是实例化的,因为在容器视图类中我设置了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被启动并且name属性设置为ok。但是,打印时数组为零,数组为空。然而,视图正确显示。

如果您需要更多详细信息,请与我们联系。

修改

以下是连接故事板的图片:

enter image description here

3 个答案:

答案 0 :(得分:2)

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

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

你应该有这个,

answerButtons = self.childViewControllers[0] as AnswerButtonsViewController

答案 1 :(得分:1)

在这里,您只是实例化视图控制器。您只能获得对它的引用。您必须使用storyboard实例化视图控制器

ALTER TABLE MailSent ADD CONSTRAINT fk_profile_sender_id FOREIGN KEY (profil_sender_id) REFERENCES TABLE-NAME(id);

ALTER TABLE MailSent ADD CONSTRAINT fk_profil_receiver_id FOREIGN KEY (profil_receiver_id) REFERENCES TABLE-NAME(id);

答案 2 :(得分:0)

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

在调用AnswerViewController的loadViewviewDidLoad方法之前,IBOutlet将无法使用。

您可以查看:

if (answerButtons.isViewLoaded()) {

}

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