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

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

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

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

Q&A

解決済

2回答

4621閲覧

遷移元に戻るときに値を渡して画面を再描画させたい

torkia

総合スコア24

Swift

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

0グッド

0クリップ

投稿2018/08/23 05:56

編集2018/08/25 03:23

ページビューコントローラの管理するコンテンツのvcからBarButtonItemのボタン押下で別の
画面に遷移して、遷移先で設定などをして得た値を戻るときに渡して、その値によって遷移元を再描画(再読込)させたいのですが、遷移した際の状態のまま画面が表示されてしまいます。
解る方がいらっしゃいましたら教えて頂けないでしょうか。
宜しくお願い致します。

詳細説明

画面遷移はセグエを使用しています。
PageViewController(画像の左から4つ目のvc)に配置した「設定」ボタン(BarButtonItem)からSecondSettingViewController(画像下段のvc)へドラッグしてセグエをつないでいます。

■ 試したこと
PageViewcontrollerを取得してsoundSettingプロパティに値を渡そうとしていたのですが、コンテンツのvc(遷移元)には渡せていませんでした。PageViewControllerまでは値を渡せているようなのですが・・・
コンテンツのvc(遷移元)に直接戻っているように思ったのでPageContentViewControllerを取得して値を渡そうとしてみたのですが、vcの取得が間違っているのかうまくいきません。

イメージ説明

該当のコード

// version Swift3 import UIKit class SecondSettingViewController: UIViewController { // シーン移動の際に渡される値を格納する変数 var soundSetting:Int = 1 var pageIndex:Int = 0 override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.lightGray // Viewを閉じる(遷移元に戻る)ボタン作成 let backVCButton = UIButton() backVCButton.frame = CGRect(x: 15, y: 20, width: 30, height: 30) backVCButton.setTitle("×", for: .normal) backVCButton.titleLabel?.font = UIFont.systemFont(ofSize: 30) backVCButton.setTitleColor(UIColor.gray, for: .normal) backVCButton.setTitleColor(UIColor.white, for: .highlighted) backVCButton.addTarget(self, action: #selector(backVC(sender:)), for: .touchUpInside) self.view.addSubview(backVCButton) // セグメントコントロール作成 let array : NSArray = ["OFF","ON"] let uiSegmentedControl: UISegmentedControl = UISegmentedControl(items: array as [AnyObject]) uiSegmentedControl.frame = CGRect(x: 0, y: 0, width: 200, height: 30) uiSegmentedControl.center = CGPoint(x: self.view.frame.width/2, y: 100) uiSegmentedControl.selectedSegmentIndex = 0 uiSegmentedControl.backgroundColor = UIColor.lightGray uiSegmentedControl.tintColor = UIColor.darkGray uiSegmentedControl.addTarget(self, action: #selector(self.segmentChanged(segcon:)), for: UIControlEvents.valueChanged) self.view.addSubview(uiSegmentedControl) } // viewDidLoadを閉じる // セグメントボタン押下時に実行するメソッド func segmentChanged(segcon: UISegmentedControl){ switch segcon.selectedSegmentIndex { case 0: soundSetting = 0 case 1: soundSetting = 1 default: print("Error") } } // Viewを閉じる(遷移元へ戻る)メソッド func backVC(sender: AnyObject) { //Navigation Controllerを取得 let nav = self.presentingViewController as! UINavigationController //遷移元のView Controllerを取得 let pageViewController = nav.topViewController as! PageViewController pageViewController.soundSetting = soundSetting /* // PageContentViewControllerを取得 ←このコードでは値を渡せませんでした。 let pcvc = pageViewController.contentVCs[pageIndex] as! PageContentViewController pcvc.soundSetting = soundSetting */ self.dismiss(animated: true, completion: nil) } }

その他のコード

import UIKit class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { // シーン移動の際に渡される値を格納する変数 var selectedVC:Int = 0 var selectedSVC:Int = 0 var arrayLength = 0 // settingから渡される値を格納する変数 var soundSetting:Int = 3 // コンテンツに渡すページindex var pageIndex:Int = 0 // ページングするviewControllerを格納する配列 var contentVCs = [UIViewController]() // 設定画面に遷移するボタンのOutlet接続 @IBOutlet weak var settingButtonItem: UIBarButtonItem! (略) override func viewDidLoad() { super.viewDidLoad() dataSource = self delegate = self // コンテンツvcを作成 for index in 0..<arrayLength { let contentVC = storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController contentVC.pageIndex = index contentVC.soundSetting = soundSetting contentVCs.append(contentVC) } self.setViewControllers([contentVCs[selectedSVC]], direction: .forward, animated: true, completion: nil) } // viewDidLoadを閉じる // 設定ボタン押下でセグエ遷移 @IBAction func goSecondSetting(_ sender: Any) { performSegue(withIdentifier: "toSecondSetting", sender: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let secondSettingVC = segue.destination as? SecondSettingViewController { secondSettingVC.pageIndex = currentIndex } } (略) } // classを閉じる
import UIKit import AVFoundation class PageContentViewController: UIViewController, UIScrollViewDelegate, AVAudioPlayerDelegate { // シーン移動の際に渡される値を格納するプロパティ var pageIndex:Int = 0 var selectedVC:Int = 0 var selectedSVC:Int = 0 // settingから預かるデータ var soundSetting:Int = 3 (略) override func viewDidLoad() { super.viewDidLoad() let label = UILabel() label.frame = CGRect(x: 100, y: 100 , width: 30, height: 30) label.text = "▶" label.textColor = UIColor.magenta if soundSetting == 1 { // 渡した値soundSettingを使用 scrollView.addSubview(label) } (略) } // viewDidLoadを閉じる (略) } // classを閉じる

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

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

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

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

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

guest

回答2

0

戻る場合
delegateか、AppDelegate経由でか、unwind segueを利用するか
かと思います。
お好きなものを利用して実現されるとよろしいかと思います。

投稿2018/08/23 08:26

t_obara

総合スコア5488

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

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

xAxis

2018/08/23 11:25

自分ならunwindが一番いいんじゃないかと感じます。destinationとsourceで両方のViewControllerのインスタンス取れて楽ですし。
guest

0

自己解決

「遷移元に戻るときに値を渡して画面を再描画させたい」のと、アプリ全体でその値を共有して画面表示に反映させたかったので、UserDefaultsを使用することで解決しました。

投稿2019/07/14 13:41

torkia

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問