『簡易說明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上才能看到。

--

--