2014-09-14 17 views
8

Sto utilizzando Xcode 6 GM. Sto tentando di implementare questo page view controller tutorial ma in Swift invece di Objective-C ma non funziona come previsto.Swift: digitare 'ViewController' non conforme al protocollo 'UIPageViewControllerDataSource'

In realtà sono riuscito a trovare uno git repo dove qualcun altro sta facendo lo stesso, ma dopo aver clonato il loro progetto e averlo aperto in Xcode, ha gli stessi errori che sto ottenendo. Sono riuscito a risolvere la maggior parte di loro tranne il problema di conformità del protocollo durante l'implementazione del protocollo UIPageViewControllerDataSource.

Per essere onesto, non capisco completamente l'utilizzo di ? e ! in Swift e se ciò sta causando il mio problema. Rimozione del! dalle variabili nell'implementazione dei metodi del protocollo provoca altri errori.

Qualcuno potrebbe aiutare?

class ViewController: UIViewController, UIPageViewControllerDataSource { 

var pageViewController : UIPageViewController? 
var pageTitles = ["Over 200 Tips and Tricks", "Discover Hidden Features", "Bookmark Favorite Tip", "FreeRegular Update"] 
var pageImages = ["page1.png", "page2.png", "page3.png", "page4.png"] 
var currentIndex = 0 

@IBAction func startWalkthrough(sender: UIButton) { 
    var startingViewController : PageContentViewController = self.viewControllerAtIndex(0)! 
    var viewControllers : NSArray = [startingViewController] 
    self.pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //Create page view controller 
    self.pageViewController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil) 
    self.pageViewController!.dataSource = self 

    let startingViewController : PageContentViewController = self.viewControllerAtIndex(0)! 
    let viewControllers: NSArray = [startingViewController] 
    self.pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil) 

    // Change the size of page view controller 
    self.pageViewController!.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30); 

    self.addChildViewController(self.pageViewController!) 
    self.view.addSubview(self.pageViewController!.view) 
    self.pageViewController!.didMoveToParentViewController(self) 

} 

func pageViewController(pageViewController: UIPageViewController!, 
    viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! { 

     var index = (viewController as PageContentViewController).pageIndex 

     if index == 0 || index == NSNotFound { 
      return nil 
     } 

     index!-- 

     println("Decreasing Index: \(index)") 

     return self.viewControllerAtIndex(index!) 
} 

func pageViewController(pageViewController: UIPageViewController!, 
    viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! { 

     var index = (viewController as PageContentViewController).pageIndex 

     if index == NSNotFound { 
      return nil 
     } 

     index!++ 

     println("Increasing Index: \(index)") 

     if index == self.pageTitles.count { 
      return nil; 
     } 
     return self.viewControllerAtIndex(index!); 
} 

func viewControllerAtIndex(index : Int) -> PageContentViewController? { 

    if self.pageTitles.count == 0 || index >= self.pageTitles.count { 
     return nil; 
    } 

    // Create a new view controller and pass suitable data. 
    let pageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as PageContentViewController 
    pageContentViewController.imageFile = self.pageImages[index] 
    pageContentViewController.titleText = self.pageTitles[index] 
    pageContentViewController.pageIndex = index 

    return pageContentViewController; 
} 

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return self.pageTitles.count 
} 

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return 0 
} 
} 

risposta

9

E 'perché il protocollo UIPageViewControllerDataSource ha aggiornato il metodo di firme - si sta utilizzando:

func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! 

func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! 

ma ora sono:

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? 

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? 

Quando sei in dubbio su un non protocollo conforme, un comando + clic sul nome del protocollo ti porterà alla dichiarazione del protocollo, dove puoi vedere se stai implementando la sua interfaccia correttamente

+1

Grazie mille Antonio! Non appena ho risolto il problema, l'app funziona come previsto. E grazie per il suggerimento, avrei dovuto saperlo, ma immagino di aver semplicemente ignorato la domanda e i punti esclamativi. Venendo da uno sfondo Java/Eclipse, sono abituato all'IDE automaticamente includendo i metodi di un'interfaccia quando si implementa quell'interfaccia in una classe personalizzata. –

+0

Fantastico! Il trucco Cmd + Click funziona per me con un altro protocollo. Grazie! – pekpon

Problemi correlati