お世話になっております。
今回、ご質問させて頂きたい内容は、PageViewControllerとContenerViewを使い、スワイプ又はボタンで配列に格納した複数のViewController(今回は3つ)を遷移にて行き来できる、という内容を実装したいと思っております。
しかし、エラー自体は出ていないのですが、下記のような意図しない動きをしてしまい困っております。
① 立ち上げ時、配列の2番目に入っているViewControllerの画面が2つ分表示される(3ページ分しか用意していないはずが、4ページ分のスワイプができてしまう)
② 上部に配置したボタンで各ViewControllerに遷移する方法で、ページ3(サンプルでは"red")からページ1(サンプルでは"green")又は、ページ2(サンプルでは"blue")に遷移した際も、①と同じ現象が起きてします。
以上の意図しない動きが出てしまい、原因がわからず困っております。
わかりづらい表現で申し訳ありませんが、お分かりになる方がいらっしゃいましたら、原因と解決法をお教え頂きたく思います。
お手数ですが、ご回答をお願い致します。
※下記に開発コードと開発中のストーリーボード画面を記載させて頂きます。
※ストーリーボードのIDは全てswiftファイル名と同じです。
※PageViewControllerの移動法はScrollです。
コード //親のコンテナビュー側のswiftファイル import UIKit struct Page_new_Settings { //UIPageViewControllerに配置するUIViewControllerクラスの名称 static let pageControllerIdentifierList : [String] = ["green","blue","red"] //UIPageViewControllerに追加するViewControllerのリストを生成する static func generateViewControllerList2() -> [UIViewController] { var viewControllers2 : [UIViewController] = [] self.pageControllerIdentifierList.forEach { viewControllerName in //ViewControllerのIdentifierからViewControllerを作る let viewController = UIStoryboard(name: "Main", bundle: nil) .instantiateViewControllerWithIdentifier("\(viewControllerName)") viewControllers2.append(viewController) } print(viewControllers2) return viewControllers2 } } class gamen3_ViewController: UIViewController, UIPageViewControllerDataSource{ // ページングして表示させる ViewControllerを保持する var pageViewController: UIPageViewController? var viewControllerIndex : Int = 0 override func viewDidLoad() { super.viewDidLoad() // ContainerView に Embed した UIPageViewController を取得する pageViewController = childViewControllers[0] as? UIPageViewController // dataSource を設定する pageViewController!.dataSource = self // 最初に表示する画面として配列の先頭の ViewController を設定する pageViewController!.setViewControllers([Page_new_Settings.generateViewControllerList2().first!], direction: .Forward, animated: false, completion: nil) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } // コンテナビュー側に配置した3つのボタンがタップされたらそれぞれのタグによってコントロラーを呼び出す @IBAction func handleButton(sender: UIButton) { switch sender.tag { case 0: let targetViewControllers : [UIViewController] = Page_new_Settings.generateViewControllerList2() pageViewController!.setViewControllers([targetViewControllers[0]], direction: .Forward, animated: false, completion: nil) if self.viewControllerIndex == 0 { return } else { self.viewControllerIndex = self.viewControllerIndex - 1 } case 1: let targetViewControllers : [UIViewController] = Page_new_Settings.generateViewControllerList2() pageViewController!.setViewControllers([targetViewControllers[1]], direction: .Forward, animated: false, completion: nil) if self.viewControllerIndex == 1 { return } else { self.viewControllerIndex = self.viewControllerIndex + 1 } case 2: let targetViewControllers : [UIViewController] = Page_new_Settings.generateViewControllerList2() pageViewController!.setViewControllers([targetViewControllers[2]], direction: .Forward, animated: false, completion: nil) if self.viewControllerIndex == 2 { return } else if(self.viewControllerIndex == 1){ self.viewControllerIndex = self.viewControllerIndex + 1 } else { self.viewControllerIndex = self.viewControllerIndex + 2 } default: break } } // 戻る方向にページ送りした時に呼ばれるメソッド func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { let targetViewControllers : [UIViewController] = Page_new_Settings.generateViewControllerList2() if self.viewControllerIndex == 0 { return nil } else { self.viewControllerIndex = self.viewControllerIndex - 1 } return targetViewControllers[self.viewControllerIndex] } // 進む方向にページ送りした時に呼ばれるメソッド func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { let targetViewControllers : [UIViewController] = Page_new_Settings.generateViewControllerList2() if self.viewControllerIndex == targetViewControllers.count - 1 { return nil } else { self.viewControllerIndex = self.viewControllerIndex + 1 } return targetViewControllers[self.viewControllerIndex] } }
//1ページ目 import UIKit class green: UIViewController { override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
//2ページ目 import UIKit class blue: UIViewController { override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
//3ページ目 import UIKit class red: UIViewController { override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
回答1件
あなたの回答
tips
プレビュー