Swift3にて、pageViewControllerでの遷移でスワイプでの遷移に加えて、ボタンでの遷移ができずに苦戦しております。教えて頂ければ助かります。
スワイプでの遷移はできているのですが、pageViewControllerとは別のviewController(PageContentViewController)にボタンを配置し、ボタン押下でも次のページに遷移できるようにしたいです。
宜しくお願い致します。
<やってみたこと>
PageContentViewController内でのボタンイベントでsetViewControllersを呼び出そうとしましたが、[fatal error: Index out of range] のようなエラーがでました。
■ サンプルコード Swift3 PageViewController
Swift3
1class PageViewController: UIPageViewController, UIPageViewControllerDataSource { 2 3 var data: [String] = [] 4 5 var selectedIndex = 0 6 7 var contentVCs = [UIViewController]() 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 dataSource = self 13 14 for index in 0..<20 { 15 let contentVC = storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 16 contentVC.labelStr = index.description // index確認用 17 contentVC.pageIndex = index 18 contentVC.data = data[index] 19 contentVCs.append(contentVC) 20 } 21 22 setViewControllers([contentVCs[selectedIndex]], direction: .forward, animated: true, completion: nil) 23 24 } // viewDidLoad()を閉じる 25 26 27 func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 28 guard let index = contentVCs.index(of: viewController as! PageContentViewController), index > 0 else { 29 return nil 30 } 31 let previousIndex = index - 1 32 return contentVCs[previousIndex] 33 } 34 35 36 func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 37 guard let index = contentVCs.index(of: viewController as! PageContentViewController), index < contentVCs.count - 1 else { 38 return nil 39 } 40 let nextVC = contentVCs[index + 1] 41 return nextVC 42 } 43 44} // class()を閉じる
■ サンプルコード Swift3 PageContentViewController
Swift3
1class PageContentViewController: UIViewController, UIScrollViewDelegate { 2 3 var pageIndex:Int = 0 4 var data:String? 5 6 var labelStr: String? 7 let indexPageLabel = UILabel() 8 var contentVCs = [UIViewController]() 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 (略) 14 15 // indexPageラベル 16 indexPageLabel.frame = CGRect(x: 150, y: 10, width: 100, height: 30) 17 indexPageLabel.text = "(labelStr!)" 18 scrollView.addSubview(indexPageLabel) 19 20 // Nextへボタン 21 nextButton.frame = CGRect(x:305, y:680, width: 50, height: 30) 22 nextButton.setTitle("Next>", for: .normal) 23 nextButton.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14) 24 nextButton.setTitleColor(UIColor.white, for: .normal) 25 nextButton.backgroundColor = UIColor.green 26 nextButton.layer.cornerRadius = 15.0 27 nextButton.layer.borderWidth = 2.0 28 nextButton.layer.borderColor = UIColor.green.cgColor 29 nextButton.addTarget(self, action: #selector(buttonEventNext(sender:)), for: .touchUpInside) 30 scrollView.addSubview(nextButton) 31 32 33 // CSVファイルを読み込む 34 let csvArray = loadCSV("test") 35 36 //csvArrayの行をタップされた番号で取得 37 dayArray = csvArray[pageIndex].components(separatedBy: ";") 38 39 (略) 40 } // viewDidLoad()を閉じる 41 42 func buttonEventNext(sender: AnyObject) { 43 let pageViewController = self.parent as! PageViewController 44 let nextIndex = pageIndex + 1 45 pageViewController.setViewControllers([contentVCs[nextIndex]], direction: .forward, animated: true, completion: nil) 46 47} // class()を閉じる
回答1件
あなたの回答
tips
プレビュー