【问题标题】:removing view from superview crashing从超级视图中删除视图崩溃
【发布时间】:2019-03-23 18:50:14
【问题描述】:

我制作了一个自定义视图,其中有一个按钮,可以将视图从其父视图中删除。视图是从作为超级视图的视图控制器创建的。我已经在我的自定义视图类中为我的视图设置了约束,如下所示,但我想它们是有问题的。

// View Contstaints
    translatesAutoresizingMaskIntoConstraints = false
    leadingAnchor.constraint(equalTo: superview!.leadingAnchor, constant: 40).isActive = true
    trailingAnchor.constraint(equalTo: superview!.trailingAnchor, constant: -40).isActive = true
    heightAnchor.constraint(equalToConstant: 420).isActive = true
    centerYAnchor.constraint(equalTo: superview!.centerYAnchor).isActive = true
    backgroundColor = .white
    layer.cornerRadius = 15

当我点击按钮时,我得到 Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value 从这个特定的视图约束

leadingAnchor.constraint(equalTo: superview!.leadingAnchor, constant: 40).isActive = true

我该如何解决这个问题?谢谢。

【问题讨论】:

  • 自定义视图没有将自身添加到其父视图中,因此不应将其从其父视图中删除。我可能会创建一个协议,其中包含视图控制器(包含此自定义视图)符合的 removeCustomViewFromSuperview() 之类的函数。当在自定义视图中点击按钮时,自定义视图的委托(即视图控制器)会调用该方法,并且视图控制器会从超级视图中删除该自定义视图。

标签: ios swift iphone mobile


【解决方案1】:

在从超级视图中删除视图之前,调用NSLayoutConstraint.deactivate(yourView.constraints) 可能会有所帮助

但是,了解在视图类中调用约束代码的位置会很有帮助。一般来说,最好在 viewController 中设置约束,然后在需要时从视图控制器中删除视图,这可能会解决问题。

【讨论】:

  • 我试过了,它仍然没有工作问题正在发生,因为在声明我的约束与超级视图相关的同时展开我的超级视图,并且当我删除我的子视图时,我收到了上面的错误。
  • 只要在调用view.addSubview(yourView) 之后激活viewController 中的约束,那么superView 就不应该为nil
  • 您是在自定义视图子类还是在 viewController 中激活约束?从您的代码看起来它在子类中
  • 是的,它们在我的自定义视图类中隐藏在一个函数中,我通过覆盖 didMoveToSuperview 并在其中调用它来调用该函数
  • 好的,我想我知道发生了什么。 didMoveToSuperview 在您将子视图添加到超级视图时被调用,但在被删除时。当它被删除时,代码被调用并且超级视图为零。您可以在函数顶部使用guard let superView = superView else { return },但最好在将其添加为子视图后立即在视图控制器中激活这些约束,而不是在实际视图本身中
【解决方案2】:

我找到了解决方法,但不确定它是否有效。 我所做的是覆盖 removefromsuperview 函数并删除了那里的所有约束和子视图

 override func removeFromSuperview() {
    for view in self.subviews{
        view.removeFromSuperview()
    }
    NSLayoutConstraint.deactivate(self.constraints)

    removeAllConstraintsFromView(view: self)
}

虽然我不确定这样做是否会从内存中释放我的自定义视图

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    相关资源
    最近更新 更多