遷移元の画面に値を渡してその値によって遷移元を再描画させたいのですが、セグエで遷移して戻ると(dismissやunwindなどで)遷移元の画面は遷移前の状態のままで変化がありません。
そこで、デリゲートを使ってみたのですが、それでも遷移元には反映されていません。
コード記述のどこかが間違っているのか、やり方が間違っているのか・・・
解る方がいらっしゃいましたら教えて頂けないでしょうか。
宜しくお願い致します。
詳細説明
ナビゲーションコントローラーを1枚目のテーブルビューに埋め込んで、1枚目のテーブルビューから2枚目のテーブルビューに遷移して→PageViewControllerに遷移したら、コンテンツVCの各ページはスワイプで移動できるようになっています。
画面遷移はセグエを使用しています。
画像の左から4つ目のPageViewControllerのナビゲーションバー上にある「設定」ボタンから、画像下段のSettingViewControllerへ遷移します。
SettingViewControllerにて遷移元に反映させたい設定などをします。
実際に戻る画面は(戻った時に表示される画面)PageViewControllerの管理するコンテンツVCとなるPageContentViewControllerの遷移した時に表示されていたページが表示されます。
サンプルコードではviewの背景色を変えるメソッドにしておりますが、実際は設定項目が複数あるので、ひとつひとつデリゲートメソッドに抜き出して呼び出すよりは、再読込(リロードのような)させられるのならばその方法も知りたいです。
できれば、presentで遷移したような状態になりたいのですが・・・
(presentで遷移すれば再描画されるのですが、テーブルビューに戻るボタンが消えるなどのエラーがでてテーブルビューに戻れなくなってしまって詰まりました)
サンプルコードで試したこと
SettingViewController内の「OFF/ON]ボタンを選択して戻るボタンを押下すると、デリゲートメソッドのtest1(),test2()の中に記述したprint文はデバッグエリアに出力されるのですが、背景色を変更するようなことにはなりません。
<例>
設定を「ON」にして「戻る」押下
(ONにするとsoundSettingが1になります)
<print出力>
test1メソッドに入ったsoundSetting: 1
test2メソッドに入ったsoundSetting: 1
<遷移元画面>
変化なし
サンプルコード version Swift3
import Foundation protocol testDelegate: class { var soundSetting:Int { get set } func test1() func test2(soundSetting: Int) }
import UIKit class SettingViewController: UIViewController { weak var testdelegate: testDelegate? var soundSetting:Int = 0 var pageIndex:Int = 0 var selectedVC:Int = 0 var arrayLength:Int = 0 override func viewDidLoad() { super.viewDidLoad() // Viewを閉じる(VCへ戻る)dismisボタン作成 let backDMButton = UIButton() backDMButton.frame = CGRect(x: 0, y: 0, width: 120, height: 30) backDMButton.center = CGPoint(x: self.view.frame.midX, y: 35) backDMButton.setTitle("dismiss戻り", for: .normal) backDMButton.setTitleColor(UIColor.magenta, for: .normal) backDMButton.addTarget(self, action: #selector(backDMVC(sender:)), for: .touchUpInside) self.view.addSubview(backDMButton) // セグメントボタンを作成 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 = soundSetting uiSegmentedControl.backgroundColor = UIColor.white 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") } } // セグエで遷移した戻り func backDMVC(sender: AnyObject) { let nav = self.presentingViewController as! UINavigationController let pageViewController = nav.topViewController as! PageViewController pageViewController.soundSetting = soundSetting self.dismiss(animated: true, completion: nil) let delegate = PageContentViewController() self.testdelegate = delegate self.testdelegate?.soundSetting = soundSetting self.testdelegate?.test1() self.testdelegate?.test2(soundSetting: soundSetting) } }
import UIKit class PageContentViewController: UIViewController, testDelegate { //シーン移動の際に設定されるデータ var pageIndex:Int = 0 var selectedVC:Int = 0 var selectedSVC:Int = 0 var soundSetting:Int = 0 override func viewDidLoad() { super.viewDidLoad() (略) } func test1() { self.view.backgroundColor = UIColor.yellow print("test1メソッドに入った: (soundSetting)") } func test2(soundSetting: Int) { if soundSetting == 0 { self.view.backgroundColor = UIColor.red print("test2メソッドに入ったsoundSetting: (soundSetting)") } if soundSetting == 1 { self.view.backgroundColor = UIColor.brown print("test2メソッドに入ったsoundSetting: (soundSetting)") } } }
import UIKit class PageViewController: UIPageViewController, UIPageViewControllerDataSource { // シーン移動の際に渡される値 var selectedVC:Int = 0 // viewControllerで押されたセルのindex var selectedSVC: Int = 0 // SecondViewControllerで押されたセルのindex var arrayLength: Int = 0 var soundSetting: Int = 0 var pageIndex: Int = 0 // ページングするviewControllerを格納する配列のプロパティ宣言 var contentVCs = [UIViewController]() override func viewDidLoad() { super.viewDidLoad() dataSource = self for index in 0..<arrayLength { let contentVC = storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController contentVC.pageIndex = index contentVC.selectedSVC = selectedSVC contentVC.selectedVC = selectedVC contentVCs.append(contentVC) } self.setViewControllers([contentVCs[selectedSVC]], direction: .forward, animated: true, completion: nil) } // viewDidLoad()を閉じる // 設定ボタンからセグエで遷移 @IBAction func goSecondSettingBySegue(_ sender: Any) { performSegue(withIdentifier: "toSecondSetting", sender: nil) } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let settingVC = segue.destination as? SettingViewController { settingVC.pageIndex = pageIndex settingVC.selectedVC = selectedVC settingVC.arrayLength = arrayLength settingVC.soundSetting = soundSetting } } // MARK: - UIPageViewControllerDataSource func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { guard let index = contentVCs.index(of: viewController as! PageContentViewController), index > 0 else { return nil } let previousVC = contentVCs[index - 1] return previousVC } func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { guard let index = contentVCs.index(of: viewController as! PageContentViewController), index < contentVCs.count - 1 else { return nil } let nextVC = contentVCs[index + 1] return nextVC } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/28 04:58
2018/08/28 05:28
2018/08/29 06:26
2018/08/29 07:00
2018/09/05 03:43
2018/09/14 06:27
2018/09/21 16:26 編集
2018/09/18 08:58
2018/09/21 06:39
2018/09/21 09:33