はじめに
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
については解説はしません。
実際に動かしてみるとこんな感じです
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F774264%2Fd5de4fc6-cb35-a025-18c5-3806ec52dbe8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=460962659fec6ac189fef257a55fc9df)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F774264%2F194c5d57-e9f3-95c6-dc75-41ce0ae92fa1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=3c7f5aa59bf41c1bec1bda36ec13f30e)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F774264%2F761896be-2243-58e4-4629-6e542ce57d2e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fbf97cbfc074e4a97d6bb0b014ff07af)