在添加/删除 ViewController 作为子视图 Swift 后,ParentView 属性设置为 nil

Posted

技术标签:

【中文标题】在添加/删除 ViewController 作为子视图 Swift 后,ParentView 属性设置为 nil【英文标题】:ParentView attributes set to nil after adding/removing a ViewController as a subview Swift 【发布时间】:2015-08-10 18:08:23 【问题描述】:

我有一个名为 VCA 的 ViewController,它将创建一个名为 VCB 的弹出式 ViewController。 VCB 允许用户选择一些信息,然后将其传递回 VCA。问题是,当我将 VCB 中的值传递回 VCA 时,所有 VCA 属性现在都为零或设置为其类型默认值 这是在 VCA 中创建 VCB 的代码

let VCB = ViewControllerB(nibName: "ViewControllerB", bundle: nil)    
VCB.showInView(self.view)
VCB.delegate = ViewControllerA()

视图控制器B

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

任何帮助或建议都会很棒

【问题讨论】:

【参考方案1】:

您正在像这样设置 VCB 的代表:

vcb.delegate = ViewControllerA()

正在实例化一个新的 VCA 实例。

您大概打算将 VCB 的委托设置为现有的 VCA 实例。例如,如果在 VBA 的实例方法中完成,您只需这样做:

vcb.delegate = self

--

顺便说一句,在将 VCB 的视图添加到您的视图层次结构中时,您确实应该执行包含调用 addChildViewControllerdidMoveToParentViewController

let vcb = ViewControllerB(nibName: "ViewControllerB", bundle: nil)
addChildViewController(vcb)
vcb.showInView(self.view)
vcb.delegate = self
vcb.didMoveToParentViewController(self)

同样,当您删除它时,请致电willMoveToParentViewControllerremoveFromParentViewController

@IBAction func recordButtonTapped(sender: UIButton) 
    delegate.someMethod(someValue: someType, ...)

    willMoveToParentViewController(nil)
    view.removeFromSuperview()
    removeFromParentViewController()

您总是希望您的视图控制器层次结构与您的视图层次结构保持同步。请参阅UIViewController Class Reference 的实现容器视图控制器部分。

【讨论】:

以上是关于在添加/删除 ViewController 作为子视图 Swift 后,ParentView 属性设置为 nil的主要内容,如果未能解决你的问题,请参考以下文章

添加 CollectionViewController 作为另一个 ViewController 的子视图

从SuperView的ViewController外部的类调用时,willRemoveSubview不会删除子视图吗?

按下 ToolBar 按钮时向 UIViewController 添加和删除子 ViewController

如何将collectionview作为子视图添加到viewcontroller

在 ViewController 中添加子视图数

在 iOS 8 中将 ViewController 的 View 作为子视图添加到 UIPageViewController 会在显示/隐藏时产生奇怪的 UINavigationBar