0

Im trying to create generic UIPageViewControlller and for that I want to use default implementation in protocol extension but Im getting this weir error

Objective-C method 'pageViewController:viewControllerBefore:' provided by method 'pageViewController(_:viewControllerBefore:)' does not match the requirement's selector ('pageViewController:viewControllerBeforeViewController:')

This is how my code looks like

protocol ViewModel {}

protocol PagerCard: class {
    var viewModel: ViewModel? { get set }
}


protocol Pager: UIPageViewControllerDataSource {

    associatedtype Card: UIViewController, PagerCard
    associatedtype CardModel: ViewModel
    var pagerController: UIPageViewController! { get set }
    var cards: Array<Card> { get set }
    var cardModels: Array<CardModel> { get set }

    func cardFactory() -> Card
    func viewControllerAtIndex(_ index: Int) -> Card?
}

extension Pager {
    func viewControllerAtIndex(_ index: Int) -> Card? {
        if (cardModels.count == 0) ||
            (index >= cardModels.count || index < 0) {
            return nil
        }

        // Get already configured controller
        if self.cards.count > index {
            return self.cards[index]
        }

        let cardVC = self.cardFactory()
        cardVC.viewModel = cardModels[index]
        cards.append(cardVC)
        return cardVC
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let index = self.cards.index(of: viewController as! Card )!
        return self.viewControllerAtIndex(index - 1)
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let index = self.cards.index(of: viewController as! Card)!
        return self.viewControllerAtIndex(index + 1)
    }
}

Problem is in Pager extension in last two methods, xcode complains about functions declarations but they are exactly the same as in UIPageViewControllerDataSource, if I use exactly the same code in UIViewController, everything works. Any ideas?? thank you

beretis
  • 899
  • 1
  • 9
  • 24
  • This may be stupid, but what happens if you rename your params to `func pageViewController(_ pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController)` and ` func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController)` ? – Losiowaty Nov 21 '16 at 10:44
  • @Losiowaty thank you for reply.....Its weird but I'm getting segmentation fault if I use your suggestion....It seems like bug in xcode :/ – beretis Nov 21 '16 at 11:19
  • Well it seems, that this is not doable at the moment. Have you seen this : http://stackoverflow.com/questions/39487168/non-objc-method-does-not-satisfy-optional-requirement-of-objc-protocol ? – Losiowaty Nov 21 '16 at 12:21
  • @Losiowaty that's exactly my problem, I don't know how I didn't find it....ok so its not possible, f*ck – beretis Nov 21 '16 at 12:26

0 Answers0