我的个人工具箱库中有以下扩展名:
public extension UIViewController {
public func removeChildViewControllers() {
for child in self.childViewControllers {
child.willMove(toParentViewController: nil)
child.view.removeFromSuperview()
child.removeFromParentViewController()
}
}
public func addChildViewController(_ controller: UIViewController, embedViewIn containerView: UIView) {
controller.willMove(toParentViewController: self)
addChildViewController(controller)
containerView.addSubview(controller.view)
controller.view.addCustomConstraints(CustomConstrains.FullSizeInSuperview)
controller.didMove(toParentViewController: self)
}
}
从我目前的应用程序中,我打电话如下:
private func embedViewController(_ controller: UIViewController) {
removeChildViewControllers()
addChildViewController(controller, embedViewIn: containerView)
}
一切都按预期工作。
现在我再添加一个方便方法removeChildViewController
:
public extension UIViewController {
public func removeChildViewControllers() {
for child in self.childViewControllers {
child.willMove(toParentViewController: nil)
child.view.removeFromSuperview()
child.removeFromParentViewController()
}
}
public func addChildViewController(_ controller: UIViewController, embedViewIn containerView: UIView) {
controller.willMove(toParentViewController: self)
addChildViewController(controller)
containerView.addSubview(controller.view)
controller.view.addCustomConstraints(CustomConstrains.FullSizeInSuperview)
controller.didMove(toParentViewController: self)
}
public func removeChildViewController(_ controller: UIViewController) {
controller.willMove(toParentViewController: nil)
controller.view.removeFromSuperview()
controller.removeFromParentViewController()
}
}
从现在开始,调用尚未修改的代码在运行时崩溃EXC_BAD_ACCESS:
removeChildViewControllers()
总结一下:
如果(未使用的)方法removeChildViewControllers()
存在,则在运行时调用removeChildViewController
崩溃。
如果(未使用的)方法removeChildViewControllers()
被评论,则调用removeChildViewController
不会在运行时崩溃。
此外,如果将(未使用的)方法removeChildViewControllers()
重命名为removeChildViewController
,则调用removeChildViewControllerr
不会在运行时崩溃。
答案 0 :(得分:3)
我猜这是你正在敲打秘密命名空间冲突的情况之一。可能是隐藏在Objective-C Cocoa世界中的removeChildViewController
方法,你通过复制它的名字偶然发现了它。因此,Objective-C Cocoa在运行时会窒息,即使官方API没有问题,因此让Swift编译代码也没有问题。不幸的是,这种事情一直在发生。