2014-09-14 8 views
8

Ich verwende Xcode 6 GM. Ich versuche, diese page view controller tutorial aber in Swift anstelle von Objective-C zu implementieren, aber es funktioniert nicht wie erwartet.Swift: Typ "ViewController" entspricht nicht dem Protokoll "UIPageViewControllerDataSource"

Ich habe es tatsächlich geschafft, eine git repo zu finden, wo jemand anderes dasselbe tut, aber nachdem ich ihr Projekt geklont und es in Xcode geöffnet habe, hat es die gleichen Fehler, die ich bekomme. Ich habe es geschafft, die meisten von ihnen außer dem Problem der Protokollkonformität bei der Implementierung des UIPageViewControllerDataSource-Protokolls zu lösen.

Um ehrlich zu sein, ich verstehe nicht vollständig die Verwendung von ? und ! in Swift und wenn das mein Problem verursacht. Entferne den ! von den Variablen in der Implementierung der Protokollmethoden verursacht andere Fehler.

Könnte jemand bitte helfen?

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 
} 
} 

Antwort

9

Es ist, weil die UIPageViewControllerDataSource Protokoll Methodensignaturen aktualisiert - Sie verwenden:

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

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

aber jetzt sind sie:

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

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

Wenn Sie Zweifel an einem nicht sind konformes Protokoll, ein Befehl + Klick auf den Protokollnamen bringt Sie zur Protokolldeklaration, wo Sie sehen können, ob Sie seine Schnittstelle korrekt implementieren

+1

Vielen Dank Antonio! Sobald ich das behoben habe, funktioniert die App wie erwartet. Und danke für den Tipp, ich hätte das wissen müssen, aber ich denke, ich habe nur die Frage- und Ausrufezeichen ignoriert. Ausgehend von einem Java/Eclipse-Hintergrund bin ich gewohnt, dass die IDE bei der Implementierung dieser Schnittstelle in einer benutzerdefinierten Klasse automatisch die Methoden einer Schnittstelle verwendet. –

+0

Super! Der Cmd + Click Trick funktioniert es für mich mit anderen Protokoll. Vielen Dank! – pekpon

Verwandte Themen