はじめに
Storyboard
を使わずにアプリを作るために、色々と調べていたわけですが、ナビゲーションバーについてはネットに転がっているコードをコピペしても動きませんでした。
自分と同じような状況に陥っている方の助けになれば良いと思い、解決策を置いておこうと思います。
※この解決策で良くないよーってところがあれば指摘していただければと思います。
環境
- Xcode version 12.2
- Swift 5.3.1
StoryBoardを使わずにナビゲーションバーを実装する
まず、SceneDelegate.swift
にコードを追加します。
SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// 初期設定では _ なので scene に書き換えます
guard let scene = (scene as? UIWindowScene) else { return }
// firstViewControllerは最初に表示される画面です(rootViewController)
let firstViewController = ViewController()
let navigationController = UINavigationController(rootViewController: firstViewController)
window = UIWindow(windowScene: scene)
window?.rootViewController = navigationController
window?.makeKeyAndVisible()
}
window
はiOS13のアップデートでAppDelegate
からSceneDelegate
に移動してまして、検索してもAppDelegate
にコードを追加している情報がほとんどです。
「今まではAppDelegate
で実装していたが、今はSceneDelegate
に記述する必要がある」という風に考えていただければ良いと思います。
次に、ナビゲーションバーを実装するコードを書いていきます。
ViewController.swift
class ViewController: UIViewController {
var button: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
title = "First"
button = UIBarButtonItem(barButtonSystemItem: .fastForward, target: self, action: #selector(click))
navigationItem.rightBarButtonItem = button
}
@objc func click() {
let second = SecondViewController()
navigationController?.pushViewController(second, animated: true)
}
}
SecondViewController.swift
class SecondViewController: UIViewController {
var button: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
title = "Second"
view.backgroundColor = .systemTeal
button = UIBarButtonItem(barButtonSystemItem: .fastForward, target: self, action: #selector(click))
navigationItem.rightBarButtonItem = button
}
@objc func click() {
let third = ThirdViewController()
navigationController?.pushViewController(third, animated: true)
}
}
ThirdViewController.swift
class ThirdViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = "Third"
view.backgroundColor = .purple
}
}
動いてる感を出すために遷移の動作を2回入れてみました。
ちなみに、この記事はナビゲーションバーを実装することが目的なので、UIWindow
や@objc
については解説はしません。
実際に動かしてみるとこんな感じです