2017-09-24 2 views
0

나는 스토리 보드에서 만든 5 개의 뷰 컨트롤러를 포함하는 UIPageViewController를 설정했습니다. 페이지는 스 와이프 제스처로 잘 변경되지만, 사용자가보기 컨트롤러 중 하나의 단추를 누른 후에 페이지가 변경되기를 원합니다. 내보기 컨트롤러 중 하나에 IBAction를에 여기 nextPageWithIndex 메소드를 호출UIPageViewController에서 페이지가 변경되지 않는 이유는 무엇입니까?

// PageVC.swift 

import Foundation 
import UIKit 

class PageVC: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

    lazy var VCArr: [UIViewController] = { 
     return [self.VCInstance(name: "OB1"), 
       self.VCInstance(name: "OB2"), 
       self.VCInstance(name: "OB3"), 
       self.VCInstance(name: "OB4"), 
       self.VCInstance(name: "OB5"), 
       self.VCInstance(name: "OB6")] 
    }() 

    private func VCInstance(name: String) -> UIViewController { 
     return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name) 

    } 

    override public func viewDidLoad() { 
     super.viewDidLoad() 
     self.dataSource = self 
     self.delegate = self 
     if let OB1 = VCArr.first { 
      setViewControllers([OB1], direction: .forward, animated: true, completion: nil) 
     } 
    } 

    public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?{ 
     guard let viewControllerIndex = VCArr.index(of: viewController) else { 
      return nil 
     } 

     let previousIndex = viewControllerIndex - 1 

     guard previousIndex >= 0 else { 
      return VCArr.last 
     } 

     guard VCArr.count > previousIndex else { 
      return nil 
     } 

     return VCArr[previousIndex] 
    } 

    public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?{ 
     guard let viewControllerIndex = VCArr.index(of: viewController) else { 
      return nil 
     } 

     let nextIndex = viewControllerIndex + 1 

     guard nextIndex < VCArr.count else { 
      return VCArr.first 
     } 

     guard VCArr.count > nextIndex else { 
      return nil 
     } 

     return VCArr[nextIndex] 
    } 

    public func presentationCount(for pageViewController: UIPageViewController) -> Int{ 

     return VCArr.count 

     } 

    public func presentationIndex(for pageViewController: UIPageViewController) -> Int{ 

     guard let OB1 = viewControllers?.first, 
      let OB1Index = VCArr.index(of: OB1) else { 
       return 0 

     } 

     return OB1Index 
    } 

    public func nextPageWithIndex(index: Int) 
    { 
     let nextVC = VCArr[index] 
     setViewControllers([nextVC], direction: .forward, animated: true, completion: nil) 

    } 


} 

: 여기 내 코드의 내가 그것에서 인쇄 할 수 있어요로서,

// OB1.swift 

import UIKit 

class OB1: UIViewController { 
    @IBOutlet var getStartedColorChange: UIButton! 


    override func viewDidLoad() { 
     super.viewDidLoad() 



    } 

    @IBAction func getStartedBtn(_ sender: Any) { 

     let getStarted = PageVC() 
     getStarted.nextPageWithIndex(index: 2) 

    } 

} 

버튼 작동하지만, 페이지 변화하지 않습니다. 버튼을 사용하여 페이지를 변경하려면 무엇을 변경해야합니까?

답변

2

문제는 코드에서 PageVC의 새로운 인스턴스를()입니다 :

let getStarted = PageVC() 

이미 생성 된 부모 컨트롤러에 대한 참조를 얻을해야합니다!

@IBAction func getStartedBtn(_ sender: Any) { 
     let getStarted = self.parent as! PageVC 
     getStarted.nextPageWithIndex(index: 2) 
    } 
관련 문제