在运行时找不到的方法

时间:2016-11-08 17:56:02

标签: ios swift swift3

我的个人工具箱库中有以下扩展名:

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不会在运行时崩溃。

1 个答案:

答案 0 :(得分:3)

我猜这是你正在敲打秘密命名空间冲突的情况之一。可能隐藏在Objective-C Cocoa世界中的removeChildViewController方法,你通过复制它的名字偶然发现了它。因此,Objective-C Cocoa在运行时会窒息,即使官方API没有问题,因此让Swift编译代码也没有问题。不幸的是,这种事情一直在发生。