xcode Swift:类型“ViewController”不符合协议“UIPageViewControllerDataSource”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25831897/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Swift: Type 'ViewController' does not conform to protocol 'UIPageViewControllerDataSource'
提问by Illya Lapko
I'm using Xcode 6 GM. I'm attempting to implement this page view controller tutorialbut in Swift instead of Objective-C but it's not working as expected.
我正在使用 Xcode 6 GM。我正在尝试实现这个页面视图控制器教程,但使用 Swift 而不是 Objective-C,但它没有按预期工作。
I've actually managed to find a git repowhere someone else is doing the same, but after cloning their project and opening it in Xcode, it has the same errors I'm getting. I've managed to resolve most of them except for the protocol conformance issue when implementing the UIPageViewControllerDataSource protocol.
我实际上已经找到了一个git repo,其他人也在做同样的事情,但是在克隆他们的项目并在 Xcode 中打开它之后,我遇到了同样的错误。除了在实现 UIPageViewControllerDataSource 协议时的协议一致性问题之外,我已经设法解决了其中的大部分问题。
To be honest, I don't completely understand the usage of ?
and !
in Swift and if that's causing my issue. Removing the ! from the variables in the implementation of the protocol's methods causes other errors.
老实说,我并不完全了解Swift 中 和的用法,?
以及!
这是否会导致我的问题。删除!来自协议方法实现中的变量会导致其他错误。
Could someone please assist?
有人可以帮忙吗?
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
}
}
回答by Antonio
It's because the UIPageViewControllerDataSource
protocol has updated method signatures - you're using:
这是因为UIPageViewControllerDataSource
协议更新了方法签名 - 您正在使用:
func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController!
func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController!
but now they are:
但现在他们是:
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?
When you're in doubt on a non conforming protocol, a Command+Click on the protocol name will bring you to the protocol declaration, where you can see if you are implementing its interface correctly
当您对不符合的协议有疑问时,Command+单击协议名称会将您带到协议声明,在那里您可以查看是否正确实现了其接口