2016-11-14 1 views
4

UIView의 removeFromSuperview이 (가) didMoveToSuperview (으)로 호출되는 이유를 알지 못합니다.UIView removeFromSuperview가 didMoveToSuperview를 호출합니다.

didMoveToSuperview은보기가보기에 추가 될 때만 호출됩니다. 누구든지 removeFromSuperviewdidMoveToSuperview으로 전화하는 이유를 설명 할 수 있습니까? 여기

나는 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 
+0

당신이 내가 didMoveToSuperview'은'생각 것이다 "라고하셨습니까 보기가보기에 추가 될 때만 호출됩니까? " – TylerTheCompiler

+0

예, 고맙습니다. 게시물을 편집했습니다. –

답변

5

. didMoveToSuperviewnil으로 변경 되더라도보기의 수퍼 뷰가 변경 될 때마다 호출됩니다. 수퍼가 추가되거나처럼, 그 슈퍼 뷰에서 제거 된 경우 결정하기 위해 그 방법 내에서 전무인지 아닌지 당신은 확인할 수 있습니다 :

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 
    } 
} 
+0

확인해 주셔서 감사합니다. 나는 그것이 불려서 놀랍다. –

+2

그래, 이상하게 이름 붙여진 방법이다. 애플이'superviewDidChange' 또는 그와 비슷한 이름을 붙여야한다고 생각한다. – TylerTheCompiler

+2

전적으로 동의합니다! –

관련 문제