Illust & Music 月の高いところ

今日のプリン言

謎のプリン語る。
一人書く人増えました。

Swift4、UINavigationControllerで戻ってきた時に関数を実行

2017年12月03日

みやびプリン 140 87

500 320

Swift4、UINavigationControllerで戻ってきた時に関数を実行 - サムネイル

※この記事は2年以上前の記事です。
現在は状況が異なる可能性がありますのでご注意ください。

どうも。
自学がやっと、残り一時間となったみやびです。
仮免までめっちゃ長くかかったのに、
卒業までの教習、二ヶ月もかかっておらん。
仮免までどんだけ、なまけてたっちゅうねん。

さて、本題に移ろう。。。

表記の件、なんだかなかなかいい方法が見つからなかったので、最終的に自分で考えてやったヨ。
ってわけで備忘録。

まず、下記エントリーを参照して、Storyboad使わずにUINavigationControllerを配置する方法をやってください。
(本エントリーがやりたいことは、Storyboad使っても多分できますが、本エントリーでは、Storyboad無しの方法です)

storyboardを使わず、Swiftでナビゲーションバーをつくる(UINavigationControllerとか)

では、流れの説明。
AとBのビューがありまして、
AからBビューを表示して、その後、
BからAに戻った時に、Aビューのメソッドを実行、ってことをします。

まずAビューの準備。

import UIKit

class AViewController: UIViewController {
  // ボタンを用意
  private var nextBtn: UIBarButtonItem!

  override func viewDidLoad() {
    super.viewDidLoad()

    self.title = "Aビュー"
    
    setNavigation()
  }
  
  // ナビゲーションの準備
  func setNavigation(){
    self.nextBtn = UIBarButtonItem(title: "Bビューへ", style: .plain, target: self, action: #selector(AViewController.toNextView(sender: )))
    let font = UIFont.boldSystemFont(ofSize: 16)
    self.nextBtn.setTitleTextAttributes([NSAttributedStringKey.font: font], for: UIControlState.normal)
    self.navigationItem.rightBarButtonItem = self.nextBtn
  }
  
  func toNextView(sender: Any){
    // この二行で、アニメーションつきで移動
    let nextView = BViewController()
    self.navigationController?.pushViewController(nextView, animated: true)
  }

  func backToTheFuture(){
    // 戻ってきた時に実行するメソッド
    print("懐かしいなをい")
  }
}

お次は、次ビューの、Bビューだ。

import UIKit

class BViewController: UIViewController {
  // ボタンを用意
  private var prevBtn: UIBarButtonItem!

  override func viewDidLoad() {
    super.viewDidLoad()

    self.title = "Bビュー"
    
    setNavigation()
  }
  
  // ナビゲーションの準備
  func setNavigation(){
    self.prevBtn = UIBarButtonItem(title: "Aビューへ", style: .plain, target: self, action: #selector(BViewController.toPrevView(sender: )))
    let font = UIFont.boldSystemFont(ofSize: 16)
    self.prevBtn.setTitleTextAttributes([NSAttributedStringKey.font: font], for: UIControlState.normal)
    self.navigationItem.leftBarButtonItem = self.prevBtn
  }
  
  func toPrevView(sender: Any){
    // アニメーションつきで移動
    let vcCount = (self.navigationController?.viewControllers.count)! - 2
    let vcBefore = self.navigationController?.viewControllers[vcCount] as? AViewController
    
    // ここで、前ページで実行したいメソッドを実行する
    vcBefore?.backToTheFuture()
    
    self.navigationController?.popToViewController(vcBefore!, animated: true)
  }

}

見てもらえればわかると思うが、
戻る移動をする時に、戻り先のインスタンスを使い、メソッドを実行すればいい。

これ、戻り先の方で、戻ってきた時を検知して、そのビュー内で実行したかったのだが、
どうやってもうまくいかなかったので、この方法を編み出しました。

やっぱり、スクリプト言語に慣れた自分にとっては、難しいわ、オブジェクト指向・・・。

さて、まだまだ頑張るか。

黒い砂漠 - メイン

トラックバック(0)

トラックバックURL:

コメントする