你真的瞭解UIViewController跳轉嗎?

来源:http://www.cnblogs.com/wujy/archive/2016/08/30/5822806.html
-Advertisement-
Play Games

一:UIViewController模態跳轉 知識點1: a: 在官方文檔中,建議這兩者之間通過delegate實現交互。例如使用UIImagePickerController從系統相冊選取照片或者拍照,imagePickerController和彈出它的VC之間就通過UIImagePickerCo ...


一:UIViewController模態跳轉

//展示模態視圖
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);

//關閉模態視圖
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0);

//只到IOS6
- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

//只到IOS6
- (void)dismissModalViewControllerAnimated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 6_0);

知識點1

a: 在官方文檔中,建議這兩者之間通過delegate實現交互。例如使用UIImagePickerController從系統相冊選取照片或者拍照,imagePickerController和彈出它的VC之間就通過UIImagePickerControllerDelegate實現交互的。

b: 控制器的中的只讀屬性:presentedViewController和presentingViewController,他們分別就是被present的控制器和正在presenting的控制器。

c: Modal的效果:預設是新控制器從屏幕的最底部往上鑽,直到蓋住之前的控制器為止。但可以通過自定義轉場來改變展現view的動畫,大小,位置,是否移除跳轉之前的view.這個效果可以用來模擬ipad特有的Popover彈出框。

d: 需要註意的是,預設他的實現過程是移除跳轉之前的控制器的view,並將新的控制器的view展示,但跳轉之前的控制器並沒有被釋放,而是被強引用這的。區別於導航控制器的push。

e: 通過 dismissViewControllerAnimated 來返回前一個界面的

知識點2:例如在當前A控制器利用模態跳轉到另一個B控制器

1.當前A控制器,跳轉代碼
RecipeAddViewController *addController = [[RecipeAddViewController alloc] init]; 
addController.modalPresentationStyle = UIModalPresentationFullScreen; 
addController.transitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentViewController:addController animated:YES completion: nil]; 


2.返回當前A控制器,在剛纔跳到的B控制器中,加上返回代碼
[self dismissViewControllerAnimated:YES completion:NULL];

知識點3:兩個重要的枚舉對象

//彈出時的動畫風格
typedef NS_ENUM(NSInteger, UIModalTransitionStyle) {
    UIModalTransitionStyleCoverVertical = 0,  //從底部滑入
    UIModalTransitionStyleFlipHorizontal,  //水平翻轉進入
    UIModalTransitionStyleCrossDissolve,  //交叉溶解
    UIModalTransitionStylePartialCurl NS_ENUM_AVAILABLE_IOS(3_2),  //翻頁
};

//彈出風格
typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
        UIModalPresentationFullScreen = 0,  //代表彈出VC時,VC充滿全屏
        UIModalPresentationPageSheet NS_ENUM_AVAILABLE_IOS(3_2),  //VC的高度和當前屏幕高度相同,寬度和豎屏模式下屏幕寬度相同,剩餘未覆蓋區域將會變暗並阻止用戶點擊.這種彈出模式下,豎屏時跟UIModalPresentationFullScreen的效果一樣,橫屏時候兩邊則會留下變暗的區域;
        UIModalPresentationFormSheet NS_ENUM_AVAILABLE_IOS(3_2),  //VC的高度和寬度均會小於屏幕尺寸,VC居中顯示,四周留下變暗區域;
        UIModalPresentationCurrentContext NS_ENUM_AVAILABLE_IOS(3_2),  //VC的彈出方式和彈出VC的VC的父VC的方式相同
      //自定義轉場 模態轉場 需要代理實現
        UIModalPresentationCustom NS_ENUM_AVAILABLE_IOS(7_0),
        UIModalPresentationOverFullScreen NS_ENUM_AVAILABLE_IOS(8_0),
        UIModalPresentationOverCurrentContext NS_ENUM_AVAILABLE_IOS(8_0),
        UIModalPresentationPopover NS_ENUM_AVAILABLE_IOS(8_0),
        //告訴Presentation控制器忽視緊湊環境並繼續使用前面的Presentation風格
        UIModalPresentationNone NS_ENUM_AVAILABLE_IOS(7_0) = -1,         
};

二:導航控制器UINavigationController跳轉

//推出界面
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

//返回 將棧頂的控制器移除
- (nullable UIViewController *)popViewControllerAnimated:(BOOL)animated; 
 
//指定返回跳到詳細的哪一個上 回到指定的子控制器
- (nullable NSArray<__kindof UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; 

//返回到最頂級 回到根控制器(棧底控制器)
- (nullable NSArray<__kindof UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated;

知識點1:popToViewController用法

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2]
animated:YES];

或

UIViewController *popCtl;
for (UIViewController *ctl in self.navigationController.viewControllers) {
    if ([ctl isKindOfClass:[MyViewController class]]) {
        popCtl = ctl;
        break;
    }
}
if (popCtl) {
    [self.navigationController popToViewController:popCtl animated:YES];
}

知識點2:iOS解決使用模態視圖 導致無法pushViewController

模態視圖預設從界面底部滑出並占據整個界面,並短暫地顯示與之前不同的界面,直到用戶完成某項操作。模態視圖完成和程式主功能有關係的獨立任務,尤其適合於主功能界面中欠缺的多級子任務。例如撰寫新郵件時的模態視圖.

例如:
當登錄界面的作為模態視圖的話. 當我們離開當前界用presentViewController彈出登錄界面的話..就會導致在登錄界面這個模態視圖中視圖間的跳轉會失效. 這是由於模態視圖其實是不同於導航控制器的新的視圖, 並且只有將這個視圖處理完成後才能回到原來的視圖. 模態視圖就相當於死衚衕 進入就必須原路返回, 也就是不可以在模態視圖中執行頁面跳轉.

也就是模態中無法獲取導航控制器 表現在代碼里則:self.navigationController是空的,哪如何讓模態中的self.navigationController不空呢, 也就很簡單了, 只需要將登錄這個視圖控制器封裝成navigationController 彈出來, 而這個模態只作為這個navigationController的rootViewController即可

UINavigationController* navi = [[UINavigationController alloc] initWithRootViewController:loginVC];

[self.navigationController presentViewController:navi animated:YES completion:nil];

然後, 在這個模態中視圖的跳轉就可以有我們傳過來的這個導航控制器完成了,表現在代碼;則:self.navigationController是存在的. 如果再想跳轉就可以用pushViewController了;因為包裝了一層navigationController這個'模態'會有導航欄 自行隱藏即可

退出模態視圖:

[self dismissViewControllerAnimated:YES completion:nil];

知識點3:解決使用[self.navigationController pushViewController:VC animated:YES]; push卡頓

UIViewController *vc = [UIViewController new];
[self.navigationController pushViewController:vc animated:YES];
上述代碼推出界面會卡頓

解決辦法:
UIViewController *vc = [UIViewController new];
vc.view.backgroundColor = [UIColor 推出時你想要的控制器View的顏色]

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 javascript之 this 關鍵字詳解 文章中,談及瞭如下內容,做一個簡單的回顧: 1.this對象的涵義就是指向當前對象中的屬性和方法。 2.this指向的可變性。當在全局作用域時,this指向全局;當在某個對象中使用this時,this指向該對象;當把某個對象的方法賦值給另外一個對象時 ...
  • 學習如何創建並設置標簽和按鈕(Label & Button)的相關屬性。 ...
  • 目前 Android 已經不推薦使用下列方式創建 Notification實例: 最好採用下列方式: ...
  • UIScrollView的封裝 效果 特點 1.用法簡單,尺寸大小,隨意設置位置 2.可以有多個數據源的數據,可以定製不通的界面(如同上圖,一個有文字,一個沒有文字) 3.能夠實現點擊事件 用法 1.從源代碼中,將這幾個文件考過來(ScrollViewImageProtocol.h 和 Custom ...
  • 一:首先查看一下關於UIApplication的定義 UIApplication的核心作用是提供了iOS程式運行期間的控制和協作工作。它的基類是UIResponder;每一個程式在運行期必須有且僅有一個UIApplication(或則其子類)的一個實例;在程式開始運行的時候,UIApplicatio ...
  • Swift - 計算文本高度 效果 源碼 ...
  • #import <UIKit/UIKit.h> @interface SearchBar : UITextField @property (nonatomic,strong) UIButton *button; + (instancetype)searchBar; @end #import "Sea ...
  • //這裡設置游標位置,讓游標位置後移10 textField.leftView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 10, 0)]; textField.leftViewMode = UITextFieldViewModeAlways; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...