[UIKit] (기록용)setViewControllers(_:direction:animated:completion:) 의 콜백함수가 호출되지 않는 문제

성실한 베짱이·2025년 5월 17일

UIKit을 사용하던 도중, 예상과는 다르게 동작하는 부분이 있어 기록용으로 남겨둠.

UIPageViewController의 메서드 중에

setViewControllers(_:direction:animated:completion:)

라는 메서드가 있다. 특정 뷰컨트롤러(들)로 이동하게 해 주는 메서드인데,
사용자가 스크롤하는 경우가 아닌, 개발자가 직접 (programatically) 페이징해야 하는 경우 사용할 수 있다.
(정확히는 page view controller에 어떤 뷰컨트롤러를 띄울 지 설정할 수 있는 것이며, 이때 새 뷰컨트롤러를 띄우면서 자연스러운 애니메이션이 가능하도록 지원하는 것)

이때 애니메이션 동작 후 completion 콜백 함수가 호출되는데,

일부 상황에서는 콜백 함수가 호출되지 않음.

다음 두 조건이 동시에 만족하면 콜백 함수가 호출되지 않는다.

  1. setViewControllers(_:direction:animated:completion:) 의 첫 번째 인자로 들어간 뷰컨트롤러가 page view controller에 현재 떠 있는 뷰컨트롤러와 같은 객체인 경우
  2. setViewControllers(_:direction:animated:completion:) 메서드의 animated 매개변수에 true값을 할당하는 경우

🔗 공식 문서 에서는 콜백 함수에 대해 다음과 같이 설명하고 있다.

  • completion
    A block to be called when the page-turn animation completes.

The block takes the following parameters:

  • finished
    true if the animation finished; false if it was skipped.

설명에 "page-turn animation이 끝나면 호출된다" 라고 적혀있었으니 엄밀히 말해서는 애니메이션이 적용되지 않는 위의 상황에서는 호출되지 않는 게 당연하다...고 볼 수 있지만,

그렇다기엔 animatedfalse인 경우에는 또 콜백 함수가 잘 호출된다.
아마 설정된 뷰컨트롤러가 같은 값이면 함수 실행을 조기 종료하도록 최적화하는 과정에서 부작용이 생긴 게 아닐까...싶음.

profile
print("Hello, Swift!")

0개의 댓글