从控制器添加的导航栏中删除自定义子视图

时间:2017-07-13 15:52:32

标签: ios swift uinavigationcontroller uikit navigationbar

我正在从视图控制器中将自定义子视图添加到导航栏中(宽度从按钮的contentMode = .scaleAspectFit布局得到):

// navigationBar is just sugar for navigationController.navigationBar
navigationBar?.addSubview(button)
button.centerYAnchor.constraint(equalTo: navigationBar!.centerYAnchor).isActive = true
button.leftAnchor.constraint(equalTo: navigationBar!.leftAnchor, constant: navigationBar!.bounds.size.width / 18).isActive = true
button.heightAnchor.constraint(equalTo: navigationBar!.heightAnchor, multiplier: 0.5).isActive = true

在我的viewDidDisappear我试图做button.removeFromSuperview()但最终崩溃了:

  

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无法修改由控制器管理的UINavigationBar的约束'

我很难理解。我已尝试标记按钮并将其从UINavigationControllerDelegate中删除但未成功。

我做的事情根本就是错误吗?

提前致谢。

2 个答案:

答案 0 :(得分:3)

首先使所有约束无效并从superview中删除

override func viewDidDisappear(_ animated: Bool) {
    button.constraints.forEach { $0.isActive = false }
    button.removeFromSuperview()
}

答案 1 :(得分:1)

在我看来,消除约束就像是一种魅力。注意:我使用的是snapKit。在删除navigationBar的子视图之前,我从该子视图中删除了所有约束。

例如:

someSubview.snp.removeConstraints()
someSubview.removeFromSuperview()

仅此而已。