自定义容器:@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 的 loadView
和 viewDidLoad
方法之前,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
}
我创建了一个 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 的 loadView
和 viewDidLoad
方法之前,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
}