晚上我的网点有问题。
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 :(得分: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实例化初始化后添加属性并设置它们。