2016-10-18 2 views
0

PageView 컨트롤러가있는 간단한 스토리 보드를 만들었습니다.PageViewController의 DataSource가 올바르게 작동하지 않는 이유는 무엇입니까?

두 개의 다른보기 컨트롤러 사이를 뒤집습니다.

내 PageView Controller는 사용자 지정 클래스 TutorialPageViewController입니다. 또한 맞춤 DataSource 클래스를 만들었습니다.

DataSource 클래스에서 스크롤하려고하면 pageViewController 메서드가 호출 될 것으로 예상됩니다. 그러나 이것은 그렇지 않습니다. 나는 두 가지 방법 모두에서 break point를 가지고 있으며 결코 호출되지 않는다.

첫 번째보기 컨트롤러 인 "첫 번째 페이지"는 올바르게 표시되지만 스크롤하려고하면 메서드가 호출되지 않으므로 아직 사용할 수 없습니다 (따라서 현재는 nil을 반환합니다).

내보기 컨트롤러의 데이터 소스를 self으로 설정하고 거기에 메서드를 넣으면 제대로 호출됩니다. 그러나 더 나은 코드 관리를 위해 메서드를 별도의 클래스로 옮기고 싶습니다. 그럼 왜 작동하지 않습니까? 나는뿐만 아니라 UIPageViewControllerDelegateUIScrollViewDelegate을로 내 데이터 소스 클래스를 설정하고 뷰 컨트롤러의 delegate

  • 페이지 뷰의 전환 스타일은
  • 스크롤 인 데이터 소스로 설정
    • 을 시도했습니다

    Storyboard overview

    class TutorialPageViewController : UIPageViewController { 
        override func viewDidLoad() { 
         reset() 
        } 
    
        func reset() { 
         let dataSource = TutorialPageDataSource(storyBoard: storyboard!) 
         let content = dataSource.firstContentViewController 
    
         self.dataSource = dataSource 
    
         self.setViewControllers([content], direction: .forward, animated: true, completion: nil) 
        } 
    } 
    
    class TutorialPageDataSource : NSObject, UIPageViewControllerDataSource { 
        private var _storyboard: UIStoryboard 
    
        var firstContentViewController: UIViewController 
        var secondContentViewController: UIViewController 
    
        init(storyBoard: UIStoryboard) { 
         _storyboard = storyBoard 
         firstContentViewController = _storyboard.instantiateViewController(withIdentifier: "FirstContentViewController") 
         secondContentViewController = _storyboard.instantiateViewController(withIdentifier: "FirstContentViewController") 
        } 
    
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
         // break point here never reached 
         return nil 
        } 
    
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
         // break point here never reached 
         return nil 
        } 
    } 
    

    답변

    1

    UIPageViewController dataSource (및 delegate)은 약합니다.

    당신은 reset 방법에 TutorialPageDataSource 인스턴스를 생성 약한 dataSource에 할당 한 다음 TutorialPageDataSource 인스턴스가 범위를 벗어나과에 더 강한 참조가 더 이상 없기 때문에 할당이 해제됩니다. 이제 페이지 뷰 컨트롤러의 dataSourcenil이됩니다.

    TutorialPageDataSource 인스턴스에 대한 강력한 참조를 유지해야합니다. 참조를 유지하려면 인스턴스 변수를 사용하십시오.

    +0

    감사합니다. 나는 그 것을 미래에 기억할 것이다 :) –

    관련 문제