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

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

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

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

Q&A

解決済

1回答

3472閲覧

Swift pageViewControllerでページを戻るとき初期表示に戻したい。

torkia

総合スコア24

Swift

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

0グッド

0クリップ

投稿2018/02/14 10:59

Swift3にて、pageViewControllerを用いてページ移動させているのですが、一度通ったページに戻った時、スクロールビューの位置や表示が切り替わったままの状態になってしまっているのを元に戻したい(viewDidLoadで設定されていた最初の表示)のですがどうすればよいでしょうか?

tableViewからセルをタップし、そのindex番号によってcsvファイルからテキストを読み込んで各ページのテキスト内容だけ変えています。NavigationBarの戻るボタンからtableViewに戻ってセルを押してページに入る時は更新(初期表示)になっているのですが、pageViewControllerの方でも更新(初期表示)されるようにしたいです。

よろしくお願い致します。

■ サンプルコード Swift3

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

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 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 (略) 13 14 // indexPageラベル 15 indexPageLabel.frame = CGRect(x: 150, y: 10, width: 100, height: 30) 16 indexPageLabel.text = "(labelStr!)" 17 scrollView.addSubview(indexPageLabel) 18 19 20 // CSVファイルを読み込む 21 let csvArray = loadCSV("test") 22 23 //csvArrayの行をタップされた番号で取得 24 dayArray = csvArray[pageIndex].components(separatedBy: ";") 25 26 (略) 27 } 28} 29 30 31

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

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

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

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

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

guest

回答1

0

ベストアンサー

UIViewControllerのライフサイクル が参考になります。

表示する直前に初期化するならviewWillAppearをoverrideしても良いと思います。
非表示になったときにviewDidDisappearのoverrideの処理で初期化しても良いと思います。

【追記】
処理が省略されているので可能か分かりませんが、viewDidLoadで表示した際の内容としたいのであればviewDidLoadで実行した内容をそのままviewWillAppearに書けば内容は同じになるかもしれません。
また、スクロールを一番上に戻すのであれば、【Swift】【Objective-C】一番上に、一番下にスクロールする方法などを参考にviewWillAppear内に記述すればよいと考えます。

Swift

1override func viewWillAppear() { 2 super.viewWillAppear() 3 //viewDidLoadの処理 4 //スクロール処理 5}

ただし、viewDidLoad内の以下の処理は多重に要素を登録してしまうのでviewWillAppearでは実行しない方が良いかもしれません。

Swift

1// indexPageラベル 2indexPageLabel.frame = CGRect(x: 150, y: 10, width: 100, height: 30) 3indexPageLabel.text = "(labelStr!)" 4scrollView.addSubview(indexPageLabel)

投稿2018/02/14 13:27

編集2018/02/16 14:42
nakasho_dev

総合スコア2655

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

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

torkia

2018/02/15 06:55

ご回答ありがとうございます。こちらの勉強不足で申し訳ないのですが、viewWillAppearをoverrideするのはどこで、どのように記述すればよいのでしょうか?
nakasho_dev

2018/02/15 14:35

「viewWillAppear」というキーワードをまったく検索していないようですので、まずは検索してはいかがでしょうか。Teratailは「思考するエンジニアのためのQAプラットフォーム」なので、まずはご自身で考え、分からなかった場合は考えたこと、対処したこと、エラーの内容を提示ください。
torkia

2018/02/16 12:22

ご回答ありがとうございます。教えて頂いた参考サイトはいの一番に拝見したのですが理解しきれず、他のサイトなども検索しながら、didifinishやBefore/Afterなどで呼び出してみたり、コンテンツの方でappearからsetviewcontrollerを呼び出したりと試行錯誤していたのですがエラー続きで、お恥ずかしながら再度質問してしまいました。 せっかく頂いた回答も、こちらが素人過ぎて理解できず申し訳ありませんでした。お手数をおかけ致しました。
torkia

2018/02/17 03:03

ご回答ありがとうございます。 やっと回答された意味がわかり解決できました。 させたい処理を個別にwillAppear内に記述することは全く思いつかず、 viewDidLoad()を記述してまるごと呼び出せると思い、見当違いな苦戦をしておりました。 > viewDidLoadで実行した内容をそのままviewWillAppearに書けば を参考に、実行させたい処理だけ記述して、やりたいことができました。 大変勉強になり、助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問