wift 初学者です。
pageViewを用いた遷移を行いたいのですが、うまくいきません。
この記事を参考(https://qiita.com/REON/items/9e937128e611506f9027)
に写経してみたのですが、ビルドはできても真っ黒い画面になって進みません。
試しにpageViewControllerではないcontroller(本来1枚目に設定したいもの:写真1枚目右)にinitialViewControllerを設定するとビルド成功後に画面に表示されます。
ググってみたり、海外の方の動画を見て自分なりに修正してみましたが、解決できなかったので質問させていただきます。
ご教授ください
swift
1import UIKit 2 3 class PageViewController: UIPageViewController { 4 5 private var controllers = [UIViewController]() 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 setupPageViewController() 11 12 } 13 14 private func setupPageViewController() { 15 16 let firstVC = storyboard?.instantiateViewController( 17 withIdentifier: "startViewController" 18 ) as! startViewController 19 let secondVC = storyboard?.instantiateViewController( 20 withIdentifier: "nikkiTableViewController" 21 ) as! nikkiTableViewController 22 23 controllers = [firstVC, secondVC] 24 setViewControllers([controllers[0]], direction: .forward, animated: true, completion: nil) 25 26 self.dataSource = self 27 } 28 29} 30 31extension PageViewController: UIPageViewControllerDataSource { 32 33 func presentationCount(for pageViewController: UIPageViewController) -> Int { 34 return controllers.count 35 } 36 37 //前に進む 38 func pageViewController(_ pageViewController: UIPageViewController, 39 viewControllerBefore viewController: UIViewController) -> UIViewController? { 40 41 if let index = controllers.firstIndex(of: viewController), 42 index < controllers.count - 1 { 43 return controllers[index + 1] 44 } 45 46 return nil 47 } 48 49 //後へ進む 50 func pageViewController(_ pageViewController: UIPageViewController, 51 viewControllerAfter viewController: UIViewController) -> UIViewController? { 52 53 if let index = controllers.firstIndex(of: viewController), 54 index > 0 { 55 return controllers[index - 1] 56 } 57 58 return nil 59 } 60 61 62}
「startView」のStoryboardの「Page View Controller」のIdentityインスペクタのClassは「PageViewController」になっていますでしょうか?
デバッグした時にPageViewControllerクラスのviewDidLoadでブレイクポイントは止まるでしょうか(viewDidLoadが動いているでしょうか)?
xg63ex2bさん わかりやすい回答ありがとうございます。
IdentityインスペクタのClassは「PageViewController」はCustom ClassのClassのことで間違い無いでしょうか? その部分であればClass設定はしております。
ブレイクポイントが適切に止まるというのは、PageViewControllerクラスのviewDidLoadの下に設定して
ビルドした時に緑色のラインがでるということでしょうか?初心者なので相違があったらすみません。
ブレイクポイントを設定してビルドしても緑色のラインは出ませんでした。
コメントありがとうございます。
> IdentityインスペクタのClassは「PageViewController」はCustom ClassのClassのことで間違い無いでしょうか?
そうです、Custom ClassのClassのことです。
そこが「PageViewController」であればPageViewController.viewDidLoadは動きそうですよね。
> ブレイクポイントが適切に止まるというのは、PageViewControllerクラスのviewDidLoadの下に設定して ビルドした時に緑色のラインがでるということでしょうか?
ビルドしたときというか、メニューバーからProduct-Runしたときですね(あるいは「▶︎」マーク)。
ブレイクポイント(行番号のところの青いマーク)をつけておけば緑色のラインが出ますよね。
pageViewControllerのファイル名は小文字から始まると思いますが、
質問欄の実際のクラスの名前を見ると、大文字から始まる(PageViewController)ように見えます。
大文字小文字も間違いなく、IdentityインスペクタのCustom ClassのClassは設定されていますでしょうか?
(手元の環境で大文字小文字が異なるように設定してみたところ、真っ黒な画面が表示されました)
回答ありがとうございます!!
おっしゃる通りに大文字に変えるとブレイクポイントで緑色のラインが出ました!!ありがとうございます
以下の新たなエラーが出てAppDelegateのファイルに飛ばされます
最初の質問とは違うのですがこちらも最後に教えていただけませんか?
"Storyboard (<UIStoryboard: 0x600002ca8900>) doesn't contain a view controller with identifier 'nikkiTableViewController'"
```swift
let secondVC = storyboard?.instantiateViewController(
withIdentifier: "nikkiTableViewController"
) as! nikkiTableViewController
````
この部分ですが、Storyboardが分割されているために、「storyboard」からnikkiTableViewControllerを参照することができないのだと思います。
次のような感じで「nikkiTableView」という名前のStoryboardを生成してから参照してみたらどうでしょうか。
```swift
let storyboard2: UIStoryboard = UIStoryboard(name: "nikkiTableView", bundle: nil)
let secondVC = storyboard2.instantiateViewController(
withIdentifier: "nikkiTableViewController"
) as! nikkiTableViewController
```
ドキュメントも参照してみてください。
https://developer.apple.com/documentation/uikit/uistoryboard/1616216-init
ありがとうございます!
最初の画面に目的の画面を表示することができました!
新たなエラーが出たので、まず自分で考えてみてできなければまた質問させていただきます、その際はよろしくお願いします
ベストアンサーにさせていただきたいので、回答欄に記載をお願いします!
回答1件
あなたの回答
tips
プレビュー