即使我有这个教程要工作,这个例子只是改变一个基于存储在数组中的图像.
我如何得到它加载ViewControllers而不是图像
我有4个ViewController:
> ViewController1
> ViewController2
> ViewController3
> ViewController4
我想幻灯片一个显示ViewController1和slide2加载ViewController2等….
这是我的主要ViewController:
import UIKit class ViewController: UIViewController,UIPageViewControllerDataSource { // MARK: - Variables private var pageViewController: UIPageViewController? // Initialize it right away here private let contentImages = ["nature_pic_1.png","nature_pic_2.png","nature_pic_3.png","nature_pic_4.png"]; // MARK: - View Lifecycle override func viewDidLoad() { super.viewDidLoad() createPageViewController() setupPageControl() } private func createPageViewController() { let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as UIPageViewController pageController.dataSource = self if contentImages.count > 0 { let firstController = getItemController(0)! let startingViewControllers: NSArray = [firstController] pageController.setViewControllers(startingViewControllers,direction: UIPageViewControllerNavigationDirection.Forward,animated: false,completion: nil) } pageViewController = pageController addChildViewController(pageViewController!) self.view.addSubview(pageViewController!.view) pageViewController!.didMoveToParentViewController(self) } private func setupPageControl() { let appearance = UIPageControl.appearance() appearance.pageIndicatorTintColor = UIColor.grayColor() appearance.currentPageIndicatorTintColor = UIColor.whiteColor() appearance.backgroundColor = UIColor.darkGrayColor() } // MARK: - UIPageViewControllerDataSource func pageViewController(pageViewController: UIPageViewController,viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { let itemController = viewController as PageItemController if itemController.itemIndex > 0 { return getItemController(itemController.itemIndex-1) } return nil } func pageViewController(pageViewController: UIPageViewController,viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { let itemController = viewController as PageItemController if itemController.itemIndex+1 < contentImages.count { return getItemController(itemController.itemIndex+1) } return nil } private func getItemController(itemIndex: Int) -> PageItemController? { if itemIndex < contentImages.count { let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("ItemController") as PageItemController pageItemController.itemIndex = itemIndex pageItemController.imageName = contentImages[itemIndex] return pageItemController } return nil } // MARK: - Page Indicator func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { return contentImages.count } func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 }
这里是我的PageItemController:
import UIKit class PageItemController: UIViewController { // MARK: - Variables var itemIndex: Int = 0 var imageName: String = "" { didSet { if let imageView = contentImageView { imageView.image = UIImage(named: imageName) } } } @IBOutlet var contentImageView: UIImageView? // MARK: - View Lifecycle override func viewDidLoad() { super.viewDidLoad() contentImageView!.image = UIImage(named: imageName) } }
我刚刚进入Swift / iOS开发,真正试图通过开发进入它.谢谢你的答案:)
编辑:让问题清楚
如何使它有一个与UIPageViewController左/右对应的视图控制器数组?
所以当我在ViewController1上向左滑动时,UIViewController2被加载并反向扫描右边.
解决方法
override func viewDidLoad() { super.viewDidLoad() populateControllersArray() createPageViewController() setupPageControl() }
实现方法如下:
var controllers = [PageItemController]() func populateControllersArray() { for i in 0...3 { let controller = storyboard!.instantiateViewControllerWithIdentifier("ViewController\(i)") as PageItemController controller.itemIndex = i controllers.append(controller) } }
并将您的createPageViewController()定义如下
private func createPageViewController() { let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as UIPageViewController pageController.dataSource = self if !controllers.isEmpty { pageController.setViewControllers([controllers[0]],completion: nil) } pageViewController = pageController addChildViewController(pageViewController!) self.view.addSubview(pageViewController!.view) pageViewController!.didMoveToParentViewController(self) }
那么在你的两个代表之前和之后的方法:
func pageViewController(pageViewController: UIPageViewController,viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { if let controller = viewController as? PageItemController { if controller.itemIndex > 0 { return controllers[controller.itemIndex - 1] } } return nil } func pageViewController(pageViewController: UIPageViewController,viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { if let controller = viewController as? PageItemController { if controller.itemIndex < controllers.count - 1 { return controllers[controller.itemIndex + 1] } } return nil }
并在计数方式
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { return controllers.count }
事实上,您可以使用要显示的任何视图控制器填充控制器,只需将其类作为PageItemController设置在storyboard中(以便具有索引属性).
或者您可以将每个视图控制器设置为自己的类,并使用运行时属性获取和设置.
使用controller.valueForKey(“itemIndex”)作为Int在前后方法而不是controller.itemIndex
使用controller.setValue(i,forKey:“itemIndex”),而不是controller.itemIndex =我在populateControllersArray()中.
只需确保每个控制器类具有Int属性itemIndex,或者您的应用程序将崩溃.
import UIKit import UIKit class ViewController: UIViewController,UIPageViewControllerDataSource { // MARK: - Variables private var pageViewController: UIPageViewController? // MARK: - View Lifecycle override func viewDidLoad() { super.viewDidLoad() populateControllersArray() createPageViewController() setupPageControl() } var controllers = [PageItemController]() func populateControllersArray() { for i in 0...3 { let controller = storyboard!.instantiateViewControllerWithIdentifier("ViewController\(i)") as PageItemController controller.itemIndex = i controllers.append(controller) } } private func createPageViewController() { let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as UIPageViewController pageController.dataSource = self if !controllers.isEmpty { pageController.setViewControllers([controllers[0]],completion: nil) } pageViewController = pageController addChildViewController(pageViewController!) self.view.addSubview(pageViewController!.view) pageViewController!.didMoveToParentViewController(self) } private func setupPageControl() { let appearance = UIPageControl.appearance() appearance.pageIndicatorTintColor = UIColor.grayColor() appearance.currentPageIndicatorTintColor = UIColor.whiteColor() appearance.backgroundColor = UIColor.darkGrayColor() } // MARK: - UIPageViewControllerDataSource func pageViewController(pageViewController: UIPageViewController,viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { if let controller = viewController as? PageItemController { if controller.itemIndex < controllers.count - 1 { return controllers[controller.itemIndex + 1] } } return nil } // MARK: - Page Indicator func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { return controllers.count } func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { return 0 }