今回の記事はページ遷移後にページを更新するためにdelegateを設定してページ遷移後に走る処理を指定する方法をご紹介します。
自作のdelegateを使用せずに「ViewDidAppear」を使用する簡単な方法は下記記事を参考にしてみてください。
「【Swift】viewDidAppearを使ってページ遷移時に画面の更新を行う方法。」
ページ遷移時に「Delegate」を使用する
このページ移動時のDelegateという仕組みによって今回は画面の更新を行います。画面の更新とは「viewdidload」を行うことを今回は指します。流れを説明すると下記のようなイメージです。
「ページ1(viewdidloadで画面作成)」→「ボタンクリックで移動」→「ページ2(viewdidloadで画面構成)」
ここまでは通常の処理として動くのでページ1で変更した変数などはページ2でうまく更新されています。
「ページ1(viewdidloadで画面作成)」→「ボタンクリックで移動」→「ページ2(viewdidloadで画面構成)」→「ページ2でページ1に関係する変数変更」→「ページ戻る(ページ2でボタンクリックにてページ1に戻る )」→「ページ2で変更した値がページ1で更新されていない」
このことからページを戻る際は「viewdidload」が行われていないことがわかります。その為、画面更新を行うには「delegate」を入れて下記のように設定を行う必要があります。
「ページ1(viewdidloadで画面作成)」→「ボタンクリックで移動」→「ページ2(viewdidloadで画面構成)」→「ページ2でページ1に関係する変数変更」→「ページ戻る(ページ2でボタンクリックにてページ1に戻る+delegate起動 )」→「delegateとセットのProtocolで関数(viewdidload)を起動」→「ページ2で変更した値がページ1で更新されていない」
では上記の設定を行うためにどのように行なっていくかを確認してみましょう。
ページ移動先から戻る際に元ページ更新方法
delegate作成方法
まずは移動前のページ1に下記のような表記を行います。
import ...
protocol TestDelegate {
func test()
}
class ViewController: UIViewController,TestDelegate {
func test() {
viewDidLoad()
}
override func viewDidLoad() {
super.viewDidLoad()
}
//...(省略)...
@IBAction func to_page2(_ sender: Any) {
let page2 = self.storyboard?.instantiateViewController(withIdentifier: "page2") as! Page2
//let [変数名] = self.storyboard?.instantiateViewController(withIdentifier: "[移動先のページidentifer名]") as! [移動先のクラス名】
//使用するdelegate,こちらをclassの横にも書きます。
page2.TestDelegate = self
//ページ移動の関数
self.present(page2,animated: true,completion: nil)
//下記の「performSegue」ではダメでした。?
//self.performSegue(withIdentifier: "page2", sender: nil)
}
}
ここではまだページ2の設定ができていないのでエラーになっていますが気にせずに。また、「performSegue」ではdelegateがうまく働きません。
次にページ2に記載する内容をみていきましょう。
import ...
class Page2: UIViewController {
//delegateを設定
var TestDelegate:TestDelegate!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func back_page1(_ sender: Any) {
//下記の「performSegue」でもこちらはOKです。
//self.performSegue(withIdentifier: "page1", sender: nil)
dismiss(animated: true, completion: {
//設定したdelegateのtest関数を起動する
self.TestDelegate.test()
})
}
}
上記でdelegateとセットのprotocolに格納したtest関数をページを戻る際に実行することができるのでページ更新ができます。
値などをセットして簡単なものから設定してみてください。
コメント