2014-09-14 64 views
8

protokolüne uymuyor Xcode 6 GM kullanıyorum. Bu page view controller tutorial'u ancak Swift yerine Objective-C'yi uygulamak için çalışıyorum ama beklendiği gibi çalışmıyor.Swift: 'ViewController' yazın 'UIPageViewControllerDataSource'

Aslında bir başkasının aynı işi yaptığı bir git repo bulmayı başardım, ancak projelerini klonlayıp Xcode'ta açtıktan sonra, aldığım hataların aynısı var. UIPageViewControllerDataSource protokolünü uygularken protokol uyumsuzluğu sorunu dışında çoğu çoğunu çözmeyi başardım.

Dürüst olmak gerekirse, Swift'de ? ve ! kullanımını tam olarak anlamıyorum ve bu benim sorunuma neden oluyorsa. Çıkarılıyor! Protokol yöntemlerinin uygulanmasında değişkenlerden diğer hatalara neden olur.

Birisi size yardımcı olabilir mi?

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

cevap

9

UIPageViewControllerDataSource protokol yöntemi imzalarını güncelledi da ondan - kullandığınız:

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

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

ama şimdi onlar:

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

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

olmayan bir üzerinde şüphe konum protokolü, protokol adı üzerinde bir Komut + Tıklama protokolü doğru bir şekilde kendi arayüzünü uygulayıp uygulayamadığını görmek için protokol bildirimi getirecektir,

+1

Teşekkürler Antonio! Ben bunu tamir eder etmez, uygulama beklendiği gibi çalışır. Ve bahşiş için teşekkürler, bunu bilmeliydim ama sanırım sadece soru ve ünlem işaretlerini görmezden geliyordum. Bir Java/Eclipse arka planından geldiğimde, bir arabirimi, özel bir sınıfta bu arabirimi uygularken otomatik olarak kullanarak IDE'ye alışkınım. –

+0

Harika! Cmd + Tıklama hilesi, benim için diğer protokol ile çalışır. Teşekkürler! – pekpon

İlgili konular