2014-09-14 23 views
8

Tôi đang sử dụng Xcode 6 GM. Tôi đang cố gắng thực hiện điều này page view controller tutorial nhưng trong Swift thay vì Objective-C nhưng nó không hoạt động như mong đợi.Swift: Loại 'ViewController' không phù hợp với giao thức 'UIPageViewControllerDataSource'

Tôi đã thực sự quản lý để tìm một git repo nơi người khác đang làm tương tự, nhưng sau khi sao chép dự án của họ và mở nó trong Xcode, nó có cùng lỗi tôi nhận được. Tôi đã quản lý để giải quyết hầu hết trong số họ ngoại trừ các vấn đề tuân thủ giao thức khi thực hiện giao thức UIPageViewControllerDataSource.

Thành thật mà nói, tôi không hoàn toàn hiểu việc sử dụng ?! trong Swift và nếu điều đó gây ra sự cố của tôi. Di chuyển cái ! từ các biến trong việc thực hiện các phương thức của giao thức gây ra các lỗi khác.

Có thể ai đó vui lòng hỗ trợ?

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

Trả lời

9

Đó là bởi vì các giao thức UIPageViewControllerDataSource đã cập nhật chữ ký phương pháp - bạn đang sử dụng:

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

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

nhưng bây giờ họ là:

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

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

Khi bạn đang ở trong nghi ngờ về một tổ chức phi giao thức phù hợp, một Command + Click vào tên giao thức sẽ đưa bạn đến khai báo giao thức, nơi bạn có thể thấy nếu bạn đang thực hiện giao diện của nó một cách chính xác

+1

Cảm ơn một tấn Antonio! Ngay khi tôi sửa lỗi đó, ứng dụng hoạt động như mong đợi. Và cảm ơn cho tip, tôi nên biết điều đó nhưng tôi đoán tôi đã bỏ qua câu hỏi và dấu chấm than. Đến từ một nền Java/Eclipse, tôi được sử dụng để IDE tự động bao gồm các phương thức của giao diện khi thực hiện giao diện đó trong một lớp tùy chỉnh. –

+0

Tuyệt vời! Thủ thuật Cmd + Click làm việc với tôi với giao thức khác. Cảm ơn! – pekpon

Các vấn đề liên quan