2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[初心者向け] コードでNavigationBarを実装する

Posted at

はじめに

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については解説はしません。

実際に動かしてみるとこんな感じです

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?