【iOS】push,pop和present,dismiss

文章目錄

  • 前言
  • push和pop
  • present和dismiss
    • 基本方法
    • 屬性說明
    • 常見的用法
    • 運行演示
  • push和present區別

前言

在之前的學習中,我們發現iOS有兩種用于推出新界面的常用方法,分別是push和present,但是二者存在很多區別

present只能返回自己的上一級視圖,而push的所有視圖都是由視圖棧控制,可以返回上一級,也可以返回根視圖或者其他視圖

在iOS13之后,我們present推出的頁面不會完全覆蓋之前的界面,上面會留有一條縫隙,并且我們可以通過向下拖動直接關閉當前的頁面

push和pop

push和pop用于在導航控制器UINavigationController中,對視圖控制器的添加與移除

原理是導航控制器會維護一個棧,在經過push后,新的view會被壓到棧頂,所以在刪除或者添加時要先對棧頂的進行操作

對根視圖進行pop時是一個無效的操作,除非用setViewControllers: 直接替換整個棧或者把整個 UINavigationController dismiss 掉。

  • pushViewController: animated:

    就是把一個新的視圖控制器壓入棧頂,導航控制器會顯示這個新的控制器。

    (相當于進棧 → 顯示新頁面)

  • popViewControllerAnimated:

    就是把當前棧頂的控制器移除,導航控制器會顯示下一個棧頂(之前的那個控制器)。

    (相當于出棧 → 回到上一個頁面)

與此同時,除了對單個的push和pop,你也可以用以下兩個方法

  • popToRootViewControllerAnimated: 一次性回到根控制器
  • popToViewController:animated: 一次性回到棧中某個已存在的控制器

若你直接pop到根視圖或者下面的某個指定視圖控制器,會將其上面的全部釋放

部分代碼演示:

首先,我們要先設置一個根視圖控制器

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {self.window.frame = [UIScreen mainScreen].bounds;VCRoot* root = [[VCRoot alloc] init];UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController: root];self.window.rootViewController = nav;[self.window makeKeyAndVisible];
}

之后我們再在根視圖上添加跳轉函數及對根視圖的初始化

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.title = @"First";self.navigationItem.title = @"根視圖";self.view.backgroundColor = [UIColor whiteColor];self.navigationController.navigationBar.barStyle = UIBarStyleDefault;UIBarButtonItem* next = [[UIBarButtonItem alloc] initWithTitle: @"下一級界面" style: UIBarButtonItemStylePlain target: self action: @selector(pressNext)];self.navigationItem.rightBarButtonItem = next;
}- (void)pressNext {VCSecond* vcsecond = [[VCSecond alloc] init];[self.navigationController pushViewController: vcsecond animated: YES];
}

后面幾個視圖也如法炮制,并在最后一個視圖設置跳轉到根視圖的方法

運行結果:

請添加圖片描述

present和dismiss

present和dismiss分別用來從當前控制器模態彈出視圖控制器和關閉模態視圖控制器,兩個方法分別為

模態彈出的意思是,一個新的頁面(控制器)以覆蓋的形式展示在當前頁面之上,用戶必須 處理完 / 關閉這個頁面(通過 dismiss),才能回到之前的頁面

基本方法

  • presentViewController:

    使用其彈出一個視圖之后,當前控制器會持有一個presentedViewController,被展示的控制器(B)會有一個 presentingViewController 指向 A。

  • dismissViewController:

    默認只能 dismiss 自己或自己上層的控制器,不能直接跨級 dismiss。

屬性說明

這里提到了兩個之前未接觸的屬性,presentedViewController和presentingViewController

  • presentedViewController:

    當前控制器所呈現的控制器 A.presentedViewController = B

  • presentingViewController:

    當前控制器的呈現者 B.presentingViewController = A

常見的用法

  1. A -> B的跳轉
SecondViewController *second = [[SecondViewController alloc] init];
[self presentViewController:second animated:YES completion:nil];

所產生的效果:

  • A present出 B
  • A.presentedViewController = B
  • B.presentingViewController = A
  1. B -> A的返回
[self dismissViewControllerAnimated:YES completion:nil];

即收起b返回a

  1. 多級返回:D -> A

假設層級是:A -> B -> C -> D如果想直接從 D 返回到 A,可以找到最頂層的 presentingViewController:

UIViewController *rootVC = self.presentingViewController;
while (rootVC.presentingViewController) {rootVC = rootVC.presentingViewController;
}
[rootVC dismissViewControllerAnimated:YES completion:nil];
  1. 多級返回:D -> B

若想從D返回到B,我們可以走兩次presenting,即一次一次退出:

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];

亦或者我們可以先找到指定類再 dismiss

UIViewController *rootVC = self.presentingViewController;
while (![rootVC isKindOfClass:[SecondViewController class]]) {rootVC = rootVC.presentingViewController;
}
[rootVC dismissViewControllerAnimated:YES completion:nil];

這樣我們可以指定返回到某個具體頁面

運行演示

請添加圖片描述

push和present區別

  • push必須嵌套于導航控制器,且原理是把新控制器壓入導航棧,主要用于一層一層的層級導航,且自動有返回按鈕方便返回
  • present可在任何控制器上使用,且不會完全覆蓋,返回時除了下滑必須手動添加按鈕進行關閉,主要適用于獨立的彈出提示等放面

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編寫后端JAR包藍綠發布腳本

前端發布腳本的功能 保留每一個發布版本,防止新版本異常,方便回撤用戶無感知,防止發布過程中的宕機 原理: 發布的JAR包只是一個軟連接,新的JAR啟動正常后,切換軟連接指向即可。藍綠JAR包綁定端口不同&…

Kafka 和 RabbitMQ的選擇

h5打開以查看 選擇 Kafka 還是 RabbitMQ(或其他傳統消息隊列)并不是一個誰比誰更好的問題,而是 “哪種工具更適合你的特定場景” 的問題。 它們的設計哲學、核心架構和目標用例有根本性的不同。簡單來說: RabbitMQ 是一個消息代理…

LeetCode 刷題【66. 加一、67. 二進制求和】

66. 加一 自己做 解&#xff1a;逢十進位 class Solution { public:vector<int> plusOne(vector<int>& digits) {int add 1; //進位vector<int> res(digits.size() 1); //防止多一位的情況&#xff1a;9 1 10for(int i (int)digits…

《MATLAB 批量把振動 CSV(含中文“序號/采樣頻率”)穩健轉成 .mat:自動解析+統一換算+按 H/I/O/F-rpm-fs-load 命名》

一文搞定&#xff1a;批量把中文頭信息的 CSV&#xff08;含“序號/采樣頻率”等&#xff09;穩健轉成 .mat&#xff0c;并按規則重命名&#xff08;H/I/O/F-rpm-fs-load&#xff09;1. 項目背景 在振動/故障診斷采集里&#xff0c;我們經常得到一批 CSV 文件&#xff0c;文件名…

Unity與硬件交互終極指南:從Arduino到自定義USB設備

這篇教程將遵循“是什么-為什么-怎么做”的結構,從宏觀思路講起,再深入到具體的技術實現,并附上可以直接使用的詳細代碼和注釋,確保不同水平的讀者都能從中受益。 前言:當虛擬照進現實 在游戲開發和交互設計的世界里,我們常常滿足于鍵盤、鼠標和手柄。但當你想要創造真正…

Tomcat 日志文件名的命名規范

1. 核心日志類型及命名規范 (1) Catalina 日志&#xff08;引擎級日志&#xff09; 文件名&#xff1a;catalina.<yyyy-MM-dd>.log說明&#xff1a;記錄 Tomcat 啟動、關閉、嚴重錯誤等全局事件。示例&#xff1a;catalina.2025-09-07.log (2) Access 日志&#xff08;訪…

.vsdx文件轉pdf、word、ppt等文件在線分享(免費版)

網址如下&#xff1a; https://www.easeconvert.com/visio-to-pdf/ 只需要把.vsdx文件放到網址中即可

如何在Docker容器之間進行通信?

目錄 1. 使用 Docker 網絡(推薦) 步驟: 特點: 2. 端口映射(主機中轉) 步驟: 特點: 3. 使用 link(不推薦,已過時) 4. 跨主機容器通信 總結 在 Docker 中,容器之間的通信可以通過多種方式實現,選擇哪種方式取決于你的具體需求(如網絡隔離性、跨主機通信等…

從 “Hello AI” 到企業級應用:Spring AI 如何重塑 Java 生態的 AI 開發

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

震驚!僅用10張照片就能隨意編輯3D人臉?韓國KAIST最新黑科技FFaceNeRF解析!

FFaceNeRF模塊 論文《FFaceNeRF: Few-shot Face Editing in Neural Radiance Fields》 深度交流Q裙&#xff1a;1051849847 全網同名 【大嘴帶你水論文】 B站定時發布詳細講解視頻 視頻地址&#xff0c;點擊查看論文詳細講解&#xff0c;每日更新&#xff1a; https://b23.t…

spring-ai-alibaba-deepresearch 學習(十四)——CoderNode

本篇為spring-ai-alibaba學習系列第四十篇前面介紹 ParalellExecutorNode 會為后續的 m 個 CoderNode 分配任務現在來看一下處理型任務的處理節點 coder_{i}該類節點主要負責執行一些操作&#xff0c;例如執行python代碼、調用mcp等提示詞以下是該文檔的中文翻譯&#xff1a;--…

基于STM32設計的激光充電控制系統(華為云IOT)_277

文章目錄 一、前言 1.1 項目介紹 【1】項目開發背景 【2】設計實現的功能 【3】項目硬件模塊組成 【4】設計意義 【5】國內外研究現狀 【6】摘要 1.2 設計思路 1.3 系統功能總結 1.4 開發工具的選擇 【1】設備端開發 【2】上位機開發 1.5 參考文獻 1.6 系統框架圖 1.7 系統原理…

【牛客拼數最大對比從左至右每位break與continue】2022-11-5

緣由牛客拼數最大問題&#xff0c;不從結果出發那種做法-編程語言-CSDN問答 思路倒序數后從右逐位比較大小 int 反序數(int n) {int nn 0;while (n)nn nn * 10 n % 10, n / 10;return nn; } void 牛客拼數位最大對比() {//4 7 13 4 246;3 13 312 343;3 1 2 3int a[20]{}, x…

【考研C語言編程題】數組元素批量插入實現(含圖示+三部曲拆解)

【考研C語言編程題】數組元素批量插入實現&#xff08;含圖示三部曲拆解&#xff09; 一、題目要求 編寫C語言程序&#xff0c;實現將數組b的所有元素批量插入到數組a的指定位置&#xff08;位置從0開始計數&#xff09;。要求嚴格遵循“騰出空間→插入元素→更新長度”的操作三…

監控系統 | 腳本案例

1、監控系統中的cpu、內存、硬盤、、使用率超過80%進行郵件告警&#xff08;可使用郵箱QQ&#xff09;詳細步驟說明&#xff1a;1. 腳本初始化#!/bin/bash&#xff1a;指定使用bash shell執行dateMax80&#xff1a;設置資源使用率閾值&#xff08;80%&#xff09;2. 資源監控CP…

Vulkan 學習(20)---- UniformBuffer 的使用

目錄UniformBufferDescriptorSetLayout 和 VkBuffer頂點著色器定義描述符布局(DescriptorSetLayout)創建 UniformBuffer描述符池(DescriptorSet Pool)描述符集(DescriptorSet)更新描述符集使用描述符集使用多個 DescriptorUniformBuffer 本篇文檔是通過 Uniform Buffer 的使用…

[光學原理與應用-461]:波動光學 - 波片實現偏振態的轉換或調整

波片&#xff08;Wave Plate&#xff09;是一種基于雙折射效應的光學元件&#xff0c;其核心功能是通過控制光波中尋常光&#xff08;o光&#xff09;和非尋常光&#xff08;e光&#xff09;的相位差&#xff0c;實現偏振態的轉換或調整。以下是波片的主要功能及其原理的詳細說…

Flutter之riverpod狀態管理詳解

一、riverpod狀態管理中所涉及到的provider對比分析Provider 類型核心用途最佳適用場景優勢劣勢/注意事項Provider(v1)暴露一個恒定不變的&#xff08;或不需要Riverpod管理的&#xff09;對象或值。依賴注入&#xff08;如&#xff1a;Repository, Logger, ApiClient&#xff…

昇騰310i Pro固件說明

目錄 驅動和固件 驅動固件文件 firware固件 24.2版本對應的固件 驅動和固件共同文件 燒結到flash中的固件 總結 啟動流程 固件關系猜測 啟動關鍵信息 efuse atu大小 GPU的bar 總結 驅動和固件 以最新的25.2 對應的驅動和固件為例說明&#xff1a; 驅動固件文件…

【LeetCode熱題100道筆記】二叉樹的右視圖

題目描述 給定一個二叉樹的 根節點 root&#xff0c;想象自己站在它的右側&#xff0c;按照從頂部到底部的順序&#xff0c;返回從右側所能看到的節點值。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,3,null,5,null,4] 輸出&#xff1a;[1,3,4] 解釋&#xff1a;示例 2&am…