『簡易說明Xcode』顯示下一個畫面方法(由程式觸發的方式 — push)
看到了push大家因該就知道了這是Navigation Controller獨有的方式了,其他的View Controller都是用present的方式顯示下一頁,所以push跟present的用法相似,都可以顯示下一個畫面,只是使用的時機不同。
不建立Segue的方式進入下一個畫面:
由程式透過Storyboard ID進入下一個畫面,不需要在Storyboard拉Segue。
Step1:必須要設定Storyboard ID,而且這必須是唯一的,因為要從程式指定Storyboard ID產生對應的Controller,才能到這畫面。在Storyboard點選該畫面的View Controller,則可在Show The Identity Inspector內的Inspector設定Storyboard ID。
Step2:從程式產生Storyboard上的Controller,利用storyboard?.instantiateViewController()產生Controller。
instantiateViewController(),主要有一個參數,分敘如下:
- identifier: 就是要生成的Storyboard ID。Storyboard ID必須輸入正確,若是錯誤會Crash。如果在第一個Storyboard傳入第二個Storyboard裡Storyboard ID,也是會找不到而Crash。
Step3:呼叫pushViewController()顯示Controller畫面,透過pushViewController()顯示畫面與segue設定show的一樣效果,並且會建立Navigation Bar。
pushViewController(),主要有兩個參數,分敘如下:
- UIViewController:哪一個Controller要顯示。
- animated:是否需要動畫效果。
不建立Segue的方式返回上一個畫面:
使用popViewController()可以返回之前由呼叫pushViewController()顯示這個畫面的Controller,因為是由Navigation Controller控制,所以pop就是移除最後一個View Controller,也就是Stack的最上面一個Controller。
主要有一個參數,分敘如下:
- animated:是否需要動畫效果。
傳送資料到下一個畫面:
可以將資料設定在要生成畫面的Controller,但是要使用as?轉型才能讀取新生成畫面Controller的property。如我要從第一個畫面傳送到第二個畫面,必須在storyboard?.instantiateViewController()產生Controller後面接上as? Page2ViewController。
由程式建立Navigation Controller:
利用rootViewController指定那一個Controller是第一個Controller。
轉移Navigation Controller:
可以利用setViewControllers(),清除現在的Navigation Controller的資料,改由新的Navigation Controller處理。
實用技巧:
- 透過viewControllers[]可以讀到這Navigation Controller內所有的Controllers。
最後一個畫面是self.navigationController!.viewControllers.count -1,所以讀取最後一個畫面的Controller是self.navigationController?.viewControllers[self.navigationController!.viewControllers.count -1]
- 使用popToRootViewControllerAnimated(), 回到Navigation Controller的第一個Controller,不論現在是在第幾頁都回到第一頁。
- 使用popToViewController(),直接跳到這個Navigation Controller的任何一頁,透過viewControllers[],就可以跳到想去的頁面。
範例說明:
建立Page1ViewController.swift、Page2ViewController.swift與Page3ViewController.swift三個Controller,在Page1ViewController設定Storyboard ID為Page1,Page2ViewController設定Storyboard ID為Page2,Page3ViewController設定Storyboard ID為Page3,並點選Page1ViewController加入Navigation Controller。
Step1:在Page1ViewController.swift裡的@IBAction按鍵內,利用instantiateViewController()生成Page2的Controller,並且用as?轉型為Page2ViewController,然後修改Page2ViewController的property,最後用pushViewController()顯示畫面。
Step2:在Page2ViewController.swift裡的@IBAction Back按鍵內,利用popViewController()返回前一頁。
Step3:在Page2ViewController.swift裡的viewDidLoad(),將Page1修改過的property更新。
Step4:在Page2ViewController.swift裡的@IBAction goToPage3按鍵內,利用instantiateViewController()生成Page3的Controller然後用pushViewController()顯示畫面。因為不傳遞資料,所以可以不用as?轉型成Page3ViewController。
Step5:在Page3ViewController.swift裡的@IBAction popToRoot按鍵內,利用popToRootViewController()回到第一個頁面。註解部分是利用popToViewController()回到倒數第二個畫面,也就是Page2。
補充說明:由程式pushViewController()所顯示的畫面,在Storyboard上看不到Navigation Bar,需要在Simulator上才能看到。