Swift 中的 PageViewController,索引一直评估为 nil
PageViewController in Swift, index keeps evaluating to nil
我学习了关于使用 Storyboard 制作 UIPageViewController 的最流行的在线教程之一 (http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/),并尝试将其转换为 Swift。
不出所料,我遇到了一些问题。
这是我的代码:
PageContentViewController.swift
import UIKit
class PageContentViewController: UIViewController {
@IBOutlet weak var backgroundImageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
var pageIndex:Int!
var titleText:String!
var imageFile:String!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.backgroundImageView.image = UIImage(named: self.imageFile)
self.titleLabel.text = self.titleText
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
ViewController.swift
import UIKit
class ViewController: UIViewController, UIPageViewControllerDataSource {
@IBAction func startWalkthrough(sender: AnyObject) {
}
var pageViewController:UIPageViewController!
var pageTitles:Array<String>!
var pageImages:Array<String>!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.pageTitles = ["Over 200 Tips and Tricks", "Discover Hidden Features", "Bookmark Favorite Tip", "Free Regular Update"]
self.pageImages = ["page1.png", "page2.png", "page3.png", "page4.png"]
// Create page view controller
self.pageViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController
self.pageViewController.dataSource = self
var startingViewController:PageContentViewController = self.viewControllerAtIndex(0)!
var viewControllers:Array<PageContentViewController> = [startingViewController]
self.pageViewController.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30)
self.addChildViewController(pageViewController)
self.view.addSubview(pageViewController.view)
self.pageViewController.didMoveToParentViewController(self)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return self.pageTitles.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return 0
}
//helper method to get the index of current page
func viewControllerAtIndex(index: Int)-> PageContentViewController?{
if((self.pageTitles.count == 0) || (index >= self.pageTitles.count))
{
return nil
}
var pageContentViewController: PageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController
pageContentViewController.imageFile = self.pageImages[index]
pageContentViewController.titleText = self.pageTitles[index]
pageContentViewController.pageIndex = index
return pageContentViewController
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?{
var index: Int? = PageContentViewController().pageIndex!
if ((index! == 0) || index! == NSNotFound)
{
return nil
}
else {
index! = index! - 1
println(index!)
return viewControllerAtIndex(index!)
}
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?{
var index:Int? = PageContentViewController().pageIndex!
println(index!)
if (index! == NSNotFound)
{
return nil
}
index! = index! + 1
if(index! == self.pageTitles.count)
{
return nil
}
println(index!)
return viewControllerAtIndex(index!)
}
}
问题如下:
1) 当我 运行 应用程序时,它加载了第一张图片,但向右滑动会导致 运行 时间错误,这表明页面索引等于 nil。然后我尝试在 PageContentViewController
中初始化索引
var pageIndex:Int! = 0
但这不起作用。索引不再为零,但左右滑动的整个逻辑都下降了。它仅从 0 计数到 1,然后返回到 0,而不是递增到 2。
2)第二件事是我的标签和按钮不可见,好像被图片遮住了,不知道为什么
如果有人对这个索引问题有任何想法,我将不胜感激
提前致谢!
您在委托方法中使用的不是局部变量 pageViewController.pageIndex!
,而是静态变量 PageContentViewController().pageIndex!
。这就是 pageIndex
始终相同的原因。
以下是我的实现方式,因此您可以做类似的事情。
func viewControllerAtIndex(index: Int) -> FeaturedRecipeViewController {
let featuredRecipeViewController = FeaturedRecipeViewController(nibName: "FeaturedRecipeViewController", bundle: nil)
featuredRecipeViewController.pageIndex = index
return featuredRecipeViewController
}
请注意,我正在为 ViewController 对象设置索引。
当我寻找下一个 ViewController 时,我会这样做:
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let index = (viewController as! FeaturedRecipeViewController).pageIndex // This is the line you are looking for
if index == pages.count - 1 {
index = 0
} else {
index++
}
return viewControllerAtIndex(index)
}
我更改了代码,因为它在我的情况下做了一些非常奇怪的事情,但这应该与您正在寻找的东西相似。
我学习了关于使用 Storyboard 制作 UIPageViewController 的最流行的在线教程之一 (http://www.appcoda.com/uipageviewcontroller-storyboard-tutorial/),并尝试将其转换为 Swift。
不出所料,我遇到了一些问题。
这是我的代码:
PageContentViewController.swift
import UIKit
class PageContentViewController: UIViewController {
@IBOutlet weak var backgroundImageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
var pageIndex:Int!
var titleText:String!
var imageFile:String!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.backgroundImageView.image = UIImage(named: self.imageFile)
self.titleLabel.text = self.titleText
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
ViewController.swift
import UIKit
class ViewController: UIViewController, UIPageViewControllerDataSource {
@IBAction func startWalkthrough(sender: AnyObject) {
}
var pageViewController:UIPageViewController!
var pageTitles:Array<String>!
var pageImages:Array<String>!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.pageTitles = ["Over 200 Tips and Tricks", "Discover Hidden Features", "Bookmark Favorite Tip", "Free Regular Update"]
self.pageImages = ["page1.png", "page2.png", "page3.png", "page4.png"]
// Create page view controller
self.pageViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController
self.pageViewController.dataSource = self
var startingViewController:PageContentViewController = self.viewControllerAtIndex(0)!
var viewControllers:Array<PageContentViewController> = [startingViewController]
self.pageViewController.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30)
self.addChildViewController(pageViewController)
self.view.addSubview(pageViewController.view)
self.pageViewController.didMoveToParentViewController(self)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return self.pageTitles.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return 0
}
//helper method to get the index of current page
func viewControllerAtIndex(index: Int)-> PageContentViewController?{
if((self.pageTitles.count == 0) || (index >= self.pageTitles.count))
{
return nil
}
var pageContentViewController: PageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController
pageContentViewController.imageFile = self.pageImages[index]
pageContentViewController.titleText = self.pageTitles[index]
pageContentViewController.pageIndex = index
return pageContentViewController
}
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?{
var index: Int? = PageContentViewController().pageIndex!
if ((index! == 0) || index! == NSNotFound)
{
return nil
}
else {
index! = index! - 1
println(index!)
return viewControllerAtIndex(index!)
}
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?{
var index:Int? = PageContentViewController().pageIndex!
println(index!)
if (index! == NSNotFound)
{
return nil
}
index! = index! + 1
if(index! == self.pageTitles.count)
{
return nil
}
println(index!)
return viewControllerAtIndex(index!)
}
}
问题如下:
1) 当我 运行 应用程序时,它加载了第一张图片,但向右滑动会导致 运行 时间错误,这表明页面索引等于 nil。然后我尝试在 PageContentViewController
中初始化索引var pageIndex:Int! = 0
但这不起作用。索引不再为零,但左右滑动的整个逻辑都下降了。它仅从 0 计数到 1,然后返回到 0,而不是递增到 2。
2)第二件事是我的标签和按钮不可见,好像被图片遮住了,不知道为什么
如果有人对这个索引问题有任何想法,我将不胜感激
提前致谢!
您在委托方法中使用的不是局部变量 pageViewController.pageIndex!
,而是静态变量 PageContentViewController().pageIndex!
。这就是 pageIndex
始终相同的原因。
以下是我的实现方式,因此您可以做类似的事情。
func viewControllerAtIndex(index: Int) -> FeaturedRecipeViewController {
let featuredRecipeViewController = FeaturedRecipeViewController(nibName: "FeaturedRecipeViewController", bundle: nil)
featuredRecipeViewController.pageIndex = index
return featuredRecipeViewController
}
请注意,我正在为 ViewController 对象设置索引。
当我寻找下一个 ViewController 时,我会这样做:
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
let index = (viewController as! FeaturedRecipeViewController).pageIndex // This is the line you are looking for
if index == pages.count - 1 {
index = 0
} else {
index++
}
return viewControllerAtIndex(index)
}
我更改了代码,因为它在我的情况下做了一些非常奇怪的事情,但这应该与您正在寻找的东西相似。