Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView removeFromSuperview正在调用didMoveToSuperview_Ios_Swift_Uiview - Fatal编程技术网

Ios UIView removeFromSuperview正在调用didMoveToSuperview

Ios UIView removeFromSuperview正在调用didMoveToSuperview,ios,swift,uiview,Ios,Swift,Uiview,我不明白为什么UIView的removeFromSuperview正在调用didMoveToSuperview 我认为只有在将视图添加到视图中时才会调用didmovetoserview。有人能解释一下为什么removeFromSuperview调用didmovetoserview 以下是我在removeFromSuperview中所做的操作: public override func removeFromSuperview() { clearDelegates() chaos

我不明白为什么UIView的
removeFromSuperview
正在调用
didMoveToSuperview

我认为只有在将视图添加到视图中时才会调用
didmovetoserview
。有人能解释一下为什么
removeFromSuperview
调用
didmovetoserview

以下是我在
removeFromSuperview
中所做的操作:

public override func removeFromSuperview() {

    clearDelegates()

    chaosPad?.removeFromSuperview()
    brushSliders?.removeFromSuperview()
    moodSlider?.removeFromSuperview()
    brushShapeMenu?.removeFromSuperview()
    moodMenu?.removeFromSuperview()
    gravityMenu?.removeFromSuperview()
    rotationMenu?.removeFromSuperview()

    menuGroups = []
    centerButtons = []
    scrollMenuItems = []
    menu?.removeFromSuperview()
    menu = nil

    super.removeFromSuperview()
}

func clearDelegates() {
    chaosPad?.delegate = nil
    viewController = nil
}
下面是调用堆栈,显示如何调用
didMoveToSuperview

#0  0x0000000110f39708 in specialized _fatalErrorMessage(StaticString, StaticString, StaticString, UInt) -> () ()
#1  0x000000010b9cb960 in TDTOilistMenuPainting.configureFrames() -> () at /FastDev/TDTPhotoLib/Oilist/Classes/TDTOilistMenuPainting.swift:161
#2  0x000000010b9cb83e in TDTOilistMenuPainting.didMoveToSuperview() -> () at /FastDev/TDTPhotoLib/Oilist/Classes/TDTOilistMenuPainting.swift:146
#3  0x000000010b9cb872 in @objc TDTOilistMenuPainting.didMoveToSuperview() -> () ()
#4  0x000000010f5d1db5 in __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke ()
#5  0x000000010dc87c60 in -[NSISEngine withBehaviors:performModifications:] ()
#6  0x000000010f5d19b1 in -[UIView(Hierarchy) _postMovedFromSuperview:] ()
#7  0x000000010f5cf610 in __UIViewWasRemovedFromSuperview ()
#8  0x000000010f5cf107 in -[UIView(Hierarchy) removeFromSuperview] ()
#9  0x000000010b9c9aba in TDTOilistMenuPainting.removeFromSuperview() -> () at /FastDev/TDTPhotoLib/Oilist/Classes/TDTOilistMenuPainting.swift:73
#10 0x000000010ba6d269 in TDTPaintingViewController.(navigationController(UINavigationController, animationControllerForOperation : UINavigationControllerOperation, fromViewController : UIViewController, toViewController : UIViewController) -> UIViewControllerAnimatedTransitioning?).(closure #2) at /FastDev/TDTPhotoLib/Oilist/Classes/TDTPaintingViewController.swift:2706

这是正常的行为<每当视图的superview更改时,都会调用code>didMoveToSuperview,即使它更改为
nil
。您可以检查superview是否为nil或不在该方法中,以确定它是添加到superview还是从其superview中删除的,如:

override func didMoveToSuperview() {
    if let superview = self.superview {
        // the view was added as a subview to superview
    }
    else {
        // the view was removed from its superview
    }
}

你的意思是说“我认为只有当视图添加到视图中时才会调用
didMoveToSuperview
”?是的,谢谢你,我编辑了这篇文章。谢谢你的确认。我很惊讶它被调用。是的,它确实是一个命名奇怪的方法。我觉得苹果应该把它命名为superviewDidChange或者类似的东西。我完全同意@TylerTheCompiler令人惊讶的是,甚至已经这样描述了它:“告诉视图它的超级视图发生了变化。”