엑스 코드 9.1 iPhoneX 시뮬레이터를 스 와이프 제스처 인식기를 사용하여 iPhone6 11.1.2충돌은 사용자 정의 컨테이너보기 컨트롤러
나는 일이 될 것으로 보인다 때문에 (메모리 손상에 명시 보인다 충돌을 추적하려고 낭비 다른 때마다).
스 와이프 제스처 인식기가있는 (단순한) 컨테이너보기 컨트롤러를 사용하도록 범위를 좁혔습니다.
당신은 탐색 표시 줄에있는 두 개의 왼쪽, 오른쪽으로 스 와이프 제스처 인식 자 또한 두 (이전 및 다음) 버튼을 볼 수 있습니다. UIViewController
에는 간단한 UILabel
이 있습니다. 전환 한 후, 또는 컨테이너 뷰로부터 멀리 이동 후 중/발생
private func addViewToLayout(view: UIView) {
let views = ["view": view]
view.translatesAutoresizingMaskIntoConstraints = false
container.addSubview(view)
container.addConstraints(
NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|",
options:NSLayoutFormatOptions.alignAllLeft, metrics:nil, views:views))
container.addConstraints(
NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|",
options:NSLayoutFormatOptions.alignAllLeft, metrics:nil, views:views))
}
private func transition(direction: Direction = .left) {
let controllerPrevious = childViewControllers.first
if let controllerNext = storyboard?.instantiateViewController(
withIdentifier: "Test") {
addChildViewController(controllerNext)
addViewToLayout(view: controllerNext.view)
if let controllerPrevious = controllerPrevious {
controllerNext.view.transform = startTransform(direction: direction)
UIView.animate(withDuration: transitionDuration,
animations: {
controllerNext.view.transform = CGAffineTransform.identity
controllerPrevious.view.transform =
self.endTransform(direction: direction)
},
completion: { (finished: Bool) in
controllerPrevious.view.removeFromSuperview()
controllerPrevious.removeFromParentViewController()
controllerNext.didMove(toParentViewController: self)
})
}
}
}
충돌 :
전환에 의해 수행된다 :로
제스처 인식기
구성되고 제어 장치. 디버거는 일반적으로 중요한 스택 추적없이 주 스레드에서 종료됩니다.충돌의 원인이 쉬운 상대, 그러나 항상 예를 들어, 같은 동작에서 발생하지 않습니다 (장치에서 실행하여 얻을 로그) : 탐색 바에서 버튼 만 사용하는 경우
EXC_BAD_ACCESS (SIGSEGV)
KERN_INVALID_ADDRESS at 0x4054600000000000
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x0000000180f68428 objc_msgSend + 8
1 UIKit 0x000000018b40dda4 -[UIView _layoutConstraintCleanup] + 204
또는
EXC_CRASH (SIGABRT)
0x0000000000000000, 0x0000000000000000
EXC_CORPSE_NOTIFY
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x000000018181d348 __pthread_kill + 8
1 libsystem_pthread.dylib 0x0000000181931344 pthread_kill$VARIANT$mp + 396
2 libsystem_c.dylib 0x000000018178cfb8 abort + 140
3 libsystem_malloc.dylib 0x0000000181863a08 nanozone_default_reader + 0
참고 충돌 는 발생하지 않습니다.
충돌의 원인을 찾아내는 데 도움이 될만한 것이 있습니까?
전환 후 현재 자식보기 컨트롤러를 해제 할 때 제스처 인식기를 사용하지 않아도됩니까?
이 question에는 유사한 증상이있는 것으로 보이지만 실제로 유용한 제안은 없습니다.
편집 : 나는 Dropbox에 충돌을 전시하는 프로젝트를 업로드 한
. 프로젝트를 컴파일하고 실행 한 후 다음을 살짝 두 번 누르고 왼쪽 및 오른쪽으로 두 번 터치 한 다음 뒤로를 살짝 누르고 다음을 클릭 한 다음 충돌이 발생할 때까지 반복하십시오. 때로는 충돌이 즉각적이며 때로는 20 개 이상의 조치가 필요할 수 있습니다.
전환 완료 블록에서 해당 부분을 제거하고 충돌이 계속 발생하는지 확인할 수 있습니까? 당신이 경쟁 조건에 부딪치고있는 것처럼 느껴지기 때문에 오류가 일치하지 않는 것입니다. (내 dev에 맥 또는 아이디 테스트에 더) – solenoid
단지 참조를 위해, 애플 리케이션은 사용자 정의 애니메이션 전환을 할 수있는 방법이 제공됩니다 https://developer.apple.com/documentation/uikit/uiviewcontrollertransitioningdelegate/1622037-animationcontroller – solenoid
@ 솔레노이드 'removeFromParentViewController', 그리고'didMove'도 제거하려고했습니다. 여전히 충돌이 발생했습니다. – Matt