『簡易說明Xcode』顯示下一個畫面方法(由程式觸發的方式 — push)

Shin Chao
Shin Chao
Apr 25, 2018 · 8 min read

看到了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上才能看到。

彼得潘的 Swift iOS App 開發教室

學習 Swift iOS App 開發的學生作品集

    Shin Chao

    Written by

    Shin Chao

    彼得潘的 Swift iOS App 開發教室

    學習 Swift iOS App 開發的學生作品集

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade