質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

430閲覧

Swift3 pageViewControllerでボタンでの遷移方法

torkia

総合スコア24

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/02/20 07:23

編集2018/02/20 12:56

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()を閉じる

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakasho_dev

2018/02/20 12:44

エラーが出ましたとありますが、どのようなエラーかを書いた方が良いと考えます。
torkia

2018/02/20 12:57

追記ありがとうございます。エラー内容を本文に追加致しました。
guest

回答1

0

ベストアンサー

エラー文が何か分かりませんがbuttonEventNextに@objcをつけたら動きませんか。

【追記】
エラー文から配列に含まれている要素数よりも多いIndexを選択していると思われます。
PageContentViewControllerのcontentVCsは空のようです。
以下のようにしてpageViewControllerのcontentVCsを該当箇所で使う必要があります。

Swift

1pageViewController.setViewControllers([pageViewController.contentVCs[nextIndex]], direction: .forward, animated: true, completion: nil)

また現在のコードでは、pageIndexの数値もゼロのままなので何らかの方法で渡す必要があります。

一般的にはこのような選択はせずPageViewControllerでページ遷移のためのDelegateを実装して、各子要素にDIするほうがコードがきれいになります。

投稿2018/02/20 12:47

編集2018/02/20 13:07
nakasho_dev

総合スコア2655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

torkia

2018/02/20 13:01

ご回答ありがとうございます。 > @objcをつけたら動きませんか。 をつけてみましたが、同じエラー[fatal error: Index out of range]がでました。 pageViewController自体を呼び出せていないということでしょうか。
torkia

2018/02/20 14:22

ご回答ありがとうございます。 【追記】のコードで遷移できるようになりました。 配列を呼ぶときもpageViewControllerをつけるべきだったんですね。 丁寧な説明ありがとうございました。 > Delegateを実装して、各子要素にDIするほうがコードがきれいになります。 DelegateやDIなどはまだ使えてませんが、今後勉強していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問