2016-09-01 7 views

답변

7

스위프트 3의 경우 위임자 정의에서 animationControllerForPresented ( 대신 animationController(forPresented:을 사용하는 것이 매우 중요합니다.

extension DataViewController: UIViewControllerTransitioningDelegate { 
    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
      return PresentMenuAnimator() //your replacement 
    } 
} 

그렇지 않으면 제안 된 애니메이터가 무시됩니다.

Xcode의 자동 수정 코드로 플래그가 지정되지 않았습니다.

+0

컴파일러에서 메서드 서명이 잘못되었음을 표시하지 않은 경우 (Swift 3) 버그 보고서를 제출해야합니다. – matt

+0

나는 그것을 할 것이다. –

1

이 문제는 Swift 3 수정으로 인해 발생합니다. 특히 Clang Importer는 선택적 프로토콜 방법에 문제가 있습니다. 컴파일러가 이전 선언을 항상 새롭고 수정 된 선언과 일치시키는 것은 아닙니다. 따라서 메서드는 호출되지 않는 쓸모없는 함수가됩니다. 올바르게 구현하지 못한 메서드는 선택적이지만 런타임에 Objective-C에서 메서드를 볼 수 없기 때문에 컴파일러에서 문제에 대한 경고를받지 못합니다. 찾고있는 함수로 선언 된 함수이므로 호출하지 않습니다.

다음은이 문제를 몰래하고 해결하기위한 I 개발 한 몇 가지 도움말 :

  • 항상 명시 적으로 프로토콜을 채택 확장에 선언합니다. 컴파일러는 입니다. 확실하지 않은 경우에는 메서드가 표시되지 않습니다. (나는 이것을 Swift에서 버그로 간주하고 제기했다.)

  • 오른쪽에있는 빠른 도움말 속성에서 함수 이름 안에 선택을 넣는다. 도움말을 볼 수 없다면 (즉, 함수 선언이 모두 보이는 경우) 대리자 함수가 올바르게 일치하지 않은 것입니다.

  • 문서를보십시오! 이 경우 https://developer.apple.com/reference/uikit/uiviewcontrollertransitioningdelegate은 수정 된 서명을 보여줍니다. 헤더도 마찬가지입니다. UIViewControllerTransitioningDelegate라는 명령을 클릭하면 명령이 표시됩니다.

  • 의심 스럽다면 @objc(...) 속성을 사용하여 메서드의 Objective-C 이름을 붙이십시오. 이를 통해 Objective-C는 자신의 방법을 볼 수 있습니다. 일시적인 문제이지만 적어도 코드가 다시 작동하게 만들었을 것입니다.