UINavigationControllerを使って作られる初期の戻るボタンにactionをつけたい
お世話になります。
iOSのアプリをSwift3とXcode8.2.1で作っています。
やりたいこと
UINavigationControllerの下でshowセグエで画面1と画面2を結びました。
画面2に自動で作られた戻るボタンをタップした時に何か判定を入れて画面1に戻ることをキャンセルしたいです。
また戻るアイコンを揃えたいので自動で作られる戻るボタンを使いたいです。
試したこと
画面2でnavigationItem.backBarButtonItem
を取得してactionを追加しようとしたのですが取得出来ませんでした。
ここでnavigationItem.backBarButtonItem
は遷移先のボタンのことなのだと思って画面1の方で以下のようにactionを設定したのですがtestは呼び出されませんでした。
// 画面1のコード
override func viewDidLoad() {
super.viewDidLoad()
let button = UIBarButtonItem(title: "戻るボタン", style: .plain, target: self, action: #selector(ViewController1.test))
self.navigationItem.backBarButtonItem = button
}
func test() {
print("画面1で追加されました。")
}
できれば画面2内に関係するコードを収めておきたいです。
どうしたらいいでしょうか。よろしくお願いします。
追記: iOSのものと似た画像を使い戻るボタン自体を作る方法も試してみました。
ここを参考にして戻るボタンを作る方法も試してみたのですが調整項目が多くなんだか泥沼へ進んでいる気がします。
// 画面2のコード
override func viewDidLoad() {
super.viewDidLoad()
guard let controllers = self.navigationController?.viewControllers else {
return
}
let backButton = UIButton(type: .system)
backButton.sizeToFit()
backButton.setImage(#imageLiteral(resourceName: "戻るアイコンに似た画像"), for: .normal)
backButton.titleEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 0)
backButton.setTitle(controllers[controllers.count - 2].navigationItem.title, for: .normal)
backButton.titleLabel?.font = UIFont.systemFont(ofSize: 17)
backButton.addTarget(self, action: #selector(ViewController2.test), for: .touchUpInside)
let barButton = UIBarButtonItem(customView: backButton)
barButton.width = 0
let spacer = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
spacer.width = -18
self.navigationItem.leftBarButtonItems = [spacer, barButton]
}
一つ前のViewController
のnavigationItem
についているtitle
を戻るボタンに設定しているのですが、その文字列の長さによって戻るボタンの見た目が大きく変わってしまいます。