2016-10-18 8 views
0

Я создал простую раскадровку с контроллером PageView.Почему не работает DataSource моего PageViewController?

Я перевернусь между двумя другими контроллерами View.

My PageView Controller - это пользовательский класс TutorialPageViewController. Я также создал собственный класс DataSource.

В классе DataSource ожидается, что при попытке прокрутки будут вызваны методы. Однако, это не так. У меня есть точки разрыва в обоих методах, и они никогда не называются.

Первый контроллер просмотра «Страница первый» подходит правильно, но попытка прокрутки не вызывает методы, поэтому я не могу их использовать (следовательно, теперь они возвращают нуль).

Если я установил DataSource своего контроллера вида на self и разместил там методы, они будут вызваны правильно. Но я хочу переместить методы в отдельный класс для лучшего управления кодом. Так почему же это не работает?

Я попытался

  • Настройка моего класса DataSource быть UIScrollViewDelegate, а также UIPageViewControllerDelegate и настройка контроллера представления delegate быть DataSource
  • стиль перехода просмотра страницы является Scroll

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 dataSourcedelegate) являются слабыми.

Вы создаете свой TutorialPageDataSource экземпляр в методе reset, присвоить его слабую dataSource, а затем экземпляр TutorialPageDataSource выходит из области видимости и будет освобождён, потому что нет сильной ссылки на него больше. Итак, теперь контроллер просмотра страницы dataSource становится nil.

Вам необходимо уделить особое внимание экземпляру TutorialPageDataSource. Используйте переменную экземпляра, чтобы сохранить ссылку.

+0

спасибо. Я запомню это в будущем :) –