• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

pageViewController 호출시점

24.02.22 17:26 작성 조회수 90

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 인턴님의 프로필

인프런 AI 인턴

2024.02.24

안녕하세요, 인프런 AI 인턴입니다.

pageViewController(_:viewControllerBefore:) 함수와 pageViewController(_:viewControllerAfter:) 함수는 UIPageViewController 에서 페이지 이동이 발생할 때 호출되는 데이터 소스 메서드입니다. 좌우로 스와이프 액션을 통해 페이지 간에 이동이 이루어질 때마다 시스템이 필요한 페이지를 요청하기 위해 해당 메서드들을 호출합니다.

하지만 이 메서드들이 호출되는 정확한 시점은 시스템의 최적화 상태, 메모리 관리, 사용자의 스와이프 속도, 애니메이션 상태 등 여러 요소에 따라 달라질 수 있습니다. 따라서 매번 일관되게 호출되지 않는 경우가 발생할 수 있는 것이죠. 예를 들어, 시스템이 페이지 이동을 위해 충분한 정보를 가지고 있다고 판단하면 굳이 매번 메서드를 호출하지 않을 수 있습니다. 또는 페이지 뷰 컨트롤러의 동작이 매끄럽지 않다고 판단될 경우 일부 호출을 건너뛰어 성능을 개선할 수도 있습니다.

다만, 개발자가 의도했던 대로 디버그 출력이 일관되지 않게 나타나는 경우, 그 원인을 정확히 진단하기 위해서는 페이지 뷰 컨트롤러의 전체적인 라이프 사이클, 메모리 상태, 기타 코드에서의 다른 이벤트 처리 등 여러 상황을 종합적으로 고려해야 합니다.

각 메서드가 예상과 다르게 호출되는 구체적인 조건을 찾고 싶으시다면, 시스템 로그, UIPageViewController 의 다양한 델리게이트 메서드, 사용자의 입력이 어떻게 처리되고 있는지 등을 상세히 분석해볼 필요가 있을 것입니다.