UINavigationControllerを使うと複数のViewControllerを階層的に管理できます。
下の例はストーリーボードを使わずに3つのViewControllerをBarButtonを使って遷移させています。
Xcode 10.2.1
UINavigationController
Segueで画面遷移のようにしてもいいのですがUINavigationControllerをつかうとスマートにできるケースもあります。
ページ上にある barButtonSystemItem を使って前のページ、次のページとページ変更が簡単にできます。
ViewControllerの追加準備
2つのViewControllerをつかで作ります
それぞれの遷移は
- PreviousViewController
- NextViewController
とします。
新しいViewControllerはstoryboardに追加するのと合わせて「New File..」から「Cocoa Touch Class」を作成する必要があります。↓を参考にしてください
storyboardにはこのケースでは何もしません
barButtonSystemItem を使うと遷移先の設定がいらないので簡単なのですが
イメージ的に左ボタンで移動した画面は右ボタンで戻るようにしてみました
サンプルコード
AppDelegate にViewController を rootViewController として設定して UINavigationControllerを設置します。
AppDelegate.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var navigationController: UINavigationController? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let viewController: ViewController = ViewController() navigationController = UINavigationController(rootViewController: viewController) self.window = UIWindow(frame: UIScreen.main.bounds) self.window?.rootViewController = navigationController self.window?.makeKeyAndVisible() return true } ... } |
ViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import UIKit class ViewController: UIViewController { // ボタンを用意 var leftBarButton: UIBarButtonItem! var rightBarButton: UIBarButtonItem! override func viewDidLoad() { super.viewDidLoad() self.navigationItem.title = "Top Page" leftBarButton = UIBarButtonItem(title: "< Previous", style: .plain, target: self, action: #selector(ViewController.tappedLeftBarButton)) rightBarButton = UIBarButtonItem(title: "Next >", style: .plain, target: self, action: #selector(ViewController.tappedRightBarButton)) self.navigationItem.leftBarButtonItem = leftBarButton self.navigationItem.rightBarButtonItem = rightBarButton self.view.backgroundColor = UIColor.white } // ボタンをタップしたときのアクション @objc func tappedLeftBarButton() { let previousPage = PreviousViewController() self.navigationController?.pushViewController(previousPage, animated: true) } // ボタンをタップしたときのアクション @objc func tappedRightBarButton() { let nextPage = NextViewController() self.navigationController?.pushViewController(nextPage, animated: true) } } |
NextViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import UIKit class NextViewController: UIViewController { var leftBarButton: UIBarButtonItem! var rightBarButton: UIBarButtonItem! override func viewDidLoad() { super.viewDidLoad() self.navigationItem.title = "Next Page" leftBarButton = UIBarButtonItem(title: "< Top Page", style: .plain, target: self, action: #selector(NextViewController.tappedLeftBarButton)) rightBarButton = UIBarButtonItem(title: "", style: .plain, target: self, action: #selector(NextViewController.NoAction)) self.navigationItem.leftBarButtonItem = leftBarButton self.navigationItem.rightBarButtonItem = rightBarButton self.view.backgroundColor = UIColor.blue } // ボタンをタップしたときのアクション @objc func tappedLeftBarButton() { let topPage = ViewController() self.navigationController?.pushViewController(topPage, animated: true) } @objc func NoAction(){ // nothing to do } } |
PreviousViewController.swft
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import UIKit class PreviousViewController: UIViewController { var leftBarButton: UIBarButtonItem! var rightBarButton: UIBarButtonItem! override func viewDidLoad() { super.viewDidLoad() self.navigationItem.title = "Previous Page" leftBarButton = UIBarButtonItem(title: "", style: .plain, target: self, action: #selector(PreviousViewController.NoAction)) rightBarButton = UIBarButtonItem(title: "Top Page >", style: .plain, target: self, action: #selector(PreviousViewController.tappedRightBarButton)) self.navigationItem.leftBarButtonItem = leftBarButton self.navigationItem.rightBarButtonItem = rightBarButton self.view.backgroundColor = UIColor.green } // ボタンをタップしたときのアクション @objc func tappedRightBarButton() { let topPage = ViewController() self.navigationController?.pushViewController(topPage, animated: true) } @objc func NoAction(){ // nothing to do } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } |
PreviousViewControllerでは
システムボタンがデフォルトで表示されるのを
あえて隠すようにしました