我有一个名为VCA的ViewController,它将创建一个名为VCB的popUp ViewController。 VCB允许用户选择一些信息,然后将其传递回VCA。问题是,当我将VCB中的值传递回VCA时,所有VCA属性现在都是nil或设置为其类型默认值 以下是在VCA中创建VCB的代码
let VCB = ViewControllerB(nibName: "ViewControllerB", bundle: nil)
VCB.showInView(self.view)
VCB.delegate = ViewControllerA()
ViewControllerB
func showInView(aView: UIView!)
{
view.center = aView.center
aView.addSubview(self.view)
}
然后我关闭VCB
@IBAction func recordButtonTapped(sender: UIButton) {
self.delegate.someMethod(someValue: someType, ...)
self.view.removeFromSuperview()
}
但是当someMethod(...)被调用时,VCA中的属性被设置为nil而我得到了
fatal error: unexpectedly found nil while unwrapping an Optional value
任何帮助或建议都会很棒
答案 0 :(得分:1)
您正在设置VCB的委托,如下所示:
vcb.delegate = ViewControllerA()
即实例化VCA的新实例。
您可能意味着将VCB的委托设置为现有的VCA实例。例如,如果在VBA的实例方法中完成,您只需执行以下操作:
vcb.delegate = self
-
顺便说一句,将VCB的视图添加到视图层次结构中时,您确实应该进行包含调用addChildViewController
和didMoveToParentViewController
:
let vcb = ViewControllerB(nibName: "ViewControllerB", bundle: nil)
addChildViewController(vcb)
vcb.showInView(self.view)
vcb.delegate = self
vcb.didMoveToParentViewController(self)
同样,当您将其删除时,请致电willMoveToParentViewController
和removeFromParentViewController
:
@IBAction func recordButtonTapped(sender: UIButton) {
delegate.someMethod(someValue: someType, ...)
willMoveToParentViewController(nil)
view.removeFromSuperview()
removeFromParentViewController()
}
您始终希望保持视图控制器层次结构与视图层次结构同步。请参阅UIViewController Class Reference的实施容器视图控制器部分。