Swift 2 용으로 작성된 사용자 정의 전환을 추가하는 자습서를 따라 왔지만 사용자 정의 전환이 기존 전환을 대체하지 않습니다.UIViewControllerTransitioningDelegate로 변경 Swift 3에 대한 정의가 전환을 방지합니다.
답변
스위프트 3의 경우 위임자 정의에서 animationControllerForPresented (
대신 animationController(forPresented:
을 사용하는 것이 매우 중요합니다.
extension DataViewController: UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return PresentMenuAnimator() //your replacement
}
}
그렇지 않으면 제안 된 애니메이터가 무시됩니다.
Xcode의 자동 수정 코드로 플래그가 지정되지 않았습니다.
이 문제는 Swift 3 수정으로 인해 발생합니다. 특히 Clang Importer는 선택적 프로토콜 방법에 문제가 있습니다. 컴파일러가 이전 선언을 항상 새롭고 수정 된 선언과 일치시키는 것은 아닙니다. 따라서 메서드는 호출되지 않는 쓸모없는 함수가됩니다. 올바르게 구현하지 못한 메서드는 선택적이지만 런타임에 Objective-C에서 메서드를 볼 수 없기 때문에 컴파일러에서 문제에 대한 경고를받지 못합니다. 찾고있는 함수로 선언 된 함수이므로 호출하지 않습니다.
다음은이 문제를 몰래하고 해결하기위한 I 개발 한 몇 가지 도움말 :
가항상 명시 적으로 프로토콜을 채택 확장에 선언합니다. 컴파일러는 입니다. 확실하지 않은 경우에는 메서드가 표시되지 않습니다. (나는 이것을 Swift에서 버그로 간주하고 제기했다.)
오른쪽에있는 빠른 도움말 속성에서 함수 이름 안에 선택을 넣는다. 도움말을 볼 수 없다면 (즉, 함수 선언이 모두 보이는 경우) 대리자 함수가 올바르게 일치하지 않은 것입니다.
문서를보십시오! 이 경우 https://developer.apple.com/reference/uikit/uiviewcontrollertransitioningdelegate은 수정 된 서명을 보여줍니다. 헤더도 마찬가지입니다. UIViewControllerTransitioningDelegate라는 명령을 클릭하면 명령이 표시됩니다.
의심 스럽다면
@objc(...)
속성을 사용하여 메서드의 Objective-C 이름을 붙이십시오. 이를 통해 Objective-C는 자신의 방법을 볼 수 있습니다. 일시적인 문제이지만 적어도 코드가 다시 작동하게 만들었을 것입니다.
컴파일러에서 메서드 서명이 잘못되었음을 표시하지 않은 경우 (Swift 3) 버그 보고서를 제출해야합니다. – matt
나는 그것을 할 것이다. –