【Swift】UINavigationController、戻り時に処理実行

謎のプリン語る。
プログラミングの役立つ、エンジニア技術情報とか、どうでもいい雑談とか書いてます。
一人書く人増えました。

【Swift】UINavigationController、戻り時に処理実行

【Swift】UINavigationController、戻り時に処理実行 - サムネイル

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

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

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

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

まず、下記エントリーを参照して、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)
  }

}

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

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

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

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

著者

みやびプリン 職業:フロントエンドエンジニア
基本はイラストレイター(自称)だが、
本職は札幌市のフロントエンドエンジニア。
フロントエンドだけではなく、各種プログラミング言語に精通していると自負している。
HTML、CSSはもちろんのこと、JavaScript、TypeScript、PHP、Perl、Python、C#、Kotlin、Swift、Objective-Cなど多くの多くの言語に精通している他、
Movable Type、WordPressなど各種CMS、React.js、Angularなどフロントエンドフレームワークも扱える。
最近はUnityによる3Dコンテンツにも手を出している。

トラックバック(0)

トラックバックURL:

コメントする

ページトップへ戻る