画面遷移で、遷移元のvcにデリゲートを使って値を渡そうとしているのですが、NavigationBarのbackボタンからテーブルビューのあるSecondViewControllerに戻るときに値が渡せなくて困っております。
わかる方がいらっしゃいましたら、教えて頂けないでしょうか。
よろしくお願い致します。
やりたいこと
設定画面で設定した値によって、コンテンツVCすべてにその設定値を共有してもらって、画面レイアウトや音設定を再描画させたいです。
● 現在の状況
デリゲートを使って設定画面から戻る遷移では値を渡し、コンテンツVC内ではページ移動の際に値を渡すことができているのですが、コンテンツVCのページから2枚目のテーブルビューのあるVC(SecondViewController)に戻ると設定画面で変更した値が初期値にリセットされてしまいます。
初期値は1枚目のテーブルビューがあるVC(ViewController)でセットしています。
● 試してみたこと
Storyboardで埋め込んだNavigationControllerのbackボタンから戻っているので、テーブルビューに戻るときに渡したい値をどこでセットすればいいのか分からず、ページ管理VCやコンテンツVCなどのviewWillDissappearなどに記述してみたのですが、うまくいきませんでした。
記述場所やコード記述が間違っているのかと思うのですが・・・
import Foundation protocol testDelegate: class { var soundSetting:Int! { get set } var soundRate:Float! { get set } func test1() func test2(soundSetting: Int) }
import UIKit class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { let sectionTitle = ["(略)"] // セルに表示する配列 let section0 = ["(略)"] // セルに表示する配列 @IBOutlet var secondTableView: UITableView! weak var testdelegate: testDelegate? // シーン移動の際に渡される値 var selectedVC: Int! var soundSetting:Int! var soundRate:Float! let currentIndex:Int? = nil // 選択されたセルを覚える変数 var chosenCell: Int! override func viewDidLoad() { super.viewDidLoad() secondTableView.delegate = self secondTableView.dataSource = self } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if testdelegate?.soundSetting != nil { soundSetting = testdelegate?.soundSetting soundRate = testdelegate?.soundRate } } (略) // PageViewControllerへ遷移するための準備(セグエ遷移) override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let pageViewController = segue.destination as? PageViewController { (略) } }
import UIKit class PageViewController: UIPageViewController, UIPageViewControllerDataSource,UIPageViewControllerDelegate { weak var testdelegate: testDelegate? // ナビゲーションバーのNext/Backボタン @IBOutlet weak var navNextButton: UIBarButtonItem! @IBOutlet weak var navBackButton: UIBarButtonItem! // シーン移動の際に渡される値 var selectedVC:Int = 0 // viewControllerで押されたセルのindex var selectedSVC: Int = 0 // SecondViewControllerで押されたセルのindex var arrayLength: Int = 0 // SVCの配列の要素数が作成ページ数となる var soundSetting: Int! // 設定画面で設定する音設定 var soundRate:Float! // 設定画面で設定する音速度 var pageIndex: Int = 0 // コンテンツVC作成時に各vcにセットするindex // ページングするviewControllerを格納する配列 var contentVCs = [UIViewController]() // delegateメソッドで取得する値 var pendingIndex: Int = 0 var previousIndex: Int = 0 var currentIndex: Int = 0 // 現在indexのプロパティ override func viewDidLoad() { super.viewDidLoad() dataSource = self delegate = self // コンテンツViewControllerを作成 for index in 0..<arrayLength { let contentVC = storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController contentVC.pageIndex = index contentVC.selectedSVC = selectedSVC contentVC.selectedVC = selectedVC contentVC.soundSetting = soundSetting contentVC.soundRate = soundRate contentVCs.append(contentVC) } self.setViewControllers([contentVCs[selectedSVC]], direction: .forward, animated: true, completion: nil) // テーブルビューから遷移したらセルのindexを代入 currentIndex = selectedSV } // viewDidLoad()を閉じる override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) /*// デリゲートの設定(試して失敗したコード) let secVC = storyboard!.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController secVC.testdelegate?.soundSetting = soundSetting secVC.testdelegate?.soundRate = soundRate */ } // 設定画面へセグエで遷移 (SecondSettingViewControllerへ) override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let secondSettingVC = segue.destination as? SecondSettingViewController { secondSettingVC.soundSetting = soundSetting secondSettingVC.soundRate = soundRate let currentVC = contentVCs[currentIndex] secondSettingVC.testdelegate = currentVC as? testDelegate } } (略) }
import UIKit import AVFoundation class PageContentViewController: UIViewController, AVAudioPlayerDelegate, testDelegate { // デリゲートの型を設定 weak var testdelegate: testDelegate? //シーン移動の際に設定されるデータ var pageIndex:Int = 0 var selectedVC:Int = 0 var selectedSVC:Int = 0 var arrayLength:Int = 0 var soundSetting:Int! var soundRate:Float! override func viewDidLoad() { super.viewDidLoad() (略) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) /*// デリゲートの設定(試して失敗したコード) let secVC = storyboard!.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController secVC.testdelegate?.soundSetting = soundSetting secVC.testdelegate?.soundRate = soundRate */ } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) test1() test2(soundSetting: soundSetting) } // デリゲートメソッド func test1() { // soundSettingとRateのラベルの表示を更新する soundSettingLabel.text = "soundSetting: (soundSetting)" soundRateLabel.text = "soundRate: (soundRate)" } func test2(soundSetting: Int) { // 再生ボタンを非表示にし、viewの背景色を赤にする if soundSetting == 0 { for i in 0..<soundArray.count { self.view.backgroundColor = UIColor.red soundButtons[i].isHidden = true } } if soundSetting == 1 { // 再生ボタンを表示させ、viewの背景色を茶色にする for i in 0..<soundArray.count { self.view.backgroundColor = UIColor.brown soundButtons[i].isHidden = false } } } (略) }
回答1件
あなたの回答
tips
プレビュー