작성
·
234
0
강의에서 매개변수로 viewControllerBefore viewController 이나 viewControllerAfter viewController 를 가지고 있는 pageViewController함수를 이용해 현재 페이지의 idx 를 구할 수 있다고 들었는데, 언제 호출되는지 궁금해서 각각 함수에 아래의 디버깅 코드를 넣어서 테스트 해봤습니다
print("before pageViewController 호출")
print("after pageViewController 호출")
결과는 오른쪽 페이지로 갈때는 after 이 출력되었고 왼쪽페이지로 갈때는 before 이 출력되었는데 매번 나오는건 아니고 나올때도 있고 안 나올때도 있더라고요..
왜 이렇게 매번 호출이 되었다가 안되었다가 하는 것일까요?
페이지에 따른 규칙성일까 싶어 확인해봤으나 랜덤으로 나왔다가 안 나왔다가 하는 것 같았습니다.
extension OnBoardingPageViewController: UIPageViewControllerDataSource {
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
print("before pageViewController 호출")
guard let currentIdx = pages.firstIndex(of: viewController) else {
return nil
}
self.currentIdx = currentIdx
//마지막 페이지일 경우 마지막 페이지로
if (currentIdx == 0 ) {
return pages.last
}
return pages[currentIdx-1]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
print("after pageViewController 호출")
guard let currentIdx = pages.firstIndex(of: viewController) else {
return nil
}
self.currentIdx = currentIdx
if currentIdx == pages.count - 1 {
return pages.first
}
return pages[currentIdx + 1]
}
}
답변 2
1
안녕하세요
참고로 아래 매서드를 구현해서 정확하게 페이지 이동완료시마다 이벤트를 받을 수 있습니다.
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool)
1
안녕하세요, 인프런 AI 인턴입니다.
pageViewController(_:viewControllerBefore:)
함수와 pageViewController(_:viewControllerAfter:)
함수는 UIPageViewController
에서 페이지 이동이 발생할 때 호출되는 데이터 소스 메서드입니다. 좌우로 스와이프 액션을 통해 페이지 간에 이동이 이루어질 때마다 시스템이 필요한 페이지를 요청하기 위해 해당 메서드들을 호출합니다.
하지만 이 메서드들이 호출되는 정확한 시점은 시스템의 최적화 상태, 메모리 관리, 사용자의 스와이프 속도, 애니메이션 상태 등 여러 요소에 따라 달라질 수 있습니다. 따라서 매번 일관되게 호출되지 않는 경우가 발생할 수 있는 것이죠. 예를 들어, 시스템이 페이지 이동을 위해 충분한 정보를 가지고 있다고 판단하면 굳이 매번 메서드를 호출하지 않을 수 있습니다. 또는 페이지 뷰 컨트롤러의 동작이 매끄럽지 않다고 판단될 경우 일부 호출을 건너뛰어 성능을 개선할 수도 있습니다.
다만, 개발자가 의도했던 대로 디버그 출력이 일관되지 않게 나타나는 경우, 그 원인을 정확히 진단하기 위해서는 페이지 뷰 컨트롤러의 전체적인 라이프 사이클, 메모리 상태, 기타 코드에서의 다른 이벤트 처리 등 여러 상황을 종합적으로 고려해야 합니다.
각 메서드가 예상과 다르게 호출되는 구체적인 조건을 찾고 싶으시다면, 시스템 로그, UIPageViewController
의 다양한 델리게이트 메서드, 사용자의 입력이 어떻게 처리되고 있는지 등을 상세히 분석해볼 필요가 있을 것입니다.