iOS開發-UI (四)UIViewController

来源:http://www.cnblogs.com/fcug/archive/2017/01/18/6295316.html
-Advertisement-
Play Games

這篇知識很重要,最好全掌握: 知識點: 1.UIViewController基本認識 2.UIViewController之間的切換 3.UIViewController生命周期 4.多個Controller之間的數據如何交換 UIViewController 1.MVC設計模式 MVC設計模式:M ...


這篇知識很重要,最好全掌握:

知識點:

1.UIViewController基本認識

2.UIViewController之間的切換

3.UIViewController生命周期

4.多個Controller之間的數據如何交換

 

=========================

UIViewController

 

   1.MVC設計模式

MVC設計模式:Model模型 View視圖 Controller控制器

 

   2.window需要一個根視圖控制器

RootViewController *rootCtl = [[RootViewController alloc] init];

    

    //設置根視圖控制器

    //如果在不更換根視圖控制器的情況下,根視圖控制器是不會被釋放掉的

    self.window.rootViewController = rootCtl;

 

   3.UIViewController對象預設都會有一個自帶的view

//實例化一個視圖控制器

    UIViewController *ctl = [[UIViewController alloc] init];

    //每一個控制器上,都自帶了一個UIView

    ctl.view.alpha = 0.5;

    

    //設置控制器自帶View的背景色(預設無背景色)

    ctl.view.backgroundColor = [UIColor whiteColor];

    self.window.backgroundColor = [UIColor orangeColor];

 

   4.UIViewController和UIView的關係  

     1)UIViewController是視圖控制器,而UIView是視圖,也就是說UIViewController控制UIView 

    2)UIView需要顯示的內容(數據)也是要通過UIViewController來管理

     例子:UIViewController就是一個相框,而UIView就是一個相片

       相框可以隨時隨地的拿走這個相片而換另外一張相片,或者在這張相片上加一個新的相片

       而相片卻不能操縱相框 

 

=========================

UIViewController的基本用法

 

   1.實例化UIViewController 時調用init方法後,會自動跳轉到如下方法

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

//控制器的初始化方法

//init - > initWithNibName:nibNameOrNil bundle:

-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{


    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {

        //註意: 不允許執行跟UI有關係的操作,雖然執行有些沒報錯,但這樣既不嚴格也容易出現一些亂七八糟的問題

        //self.view.backgroundColor XXX

        //允許執行跟數據有關係的操作

        //例如:數組的實例化,字典的實例化等等  

    }
    return self;

}

 

 

   2.viewDidLoad的作用

     一般我們會在這裡做界面上的做一些額外操作,比如往view中添加一些子視圖、

     從資料庫或者網路載入模型數據裝配到子視圖中

 

   3.重寫viewDidLoad方法

 

=========================

UIViewController之間的切換

 

   1.分割功能到不同的Controller頁面上

 

   2.如何管理多個UIViewController之間的切換

     1)切換到新的視圖控制器

      - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion

//切換到新的控制器

    /*

     參數1:要切換至的控制器對象

     參數2:是否需要動畫

     參數3:回調block,一般為nil

     */

    

    //懶載入機制:這個對象需要使用的時候,才會去實例化

    

[self presentViewController:newCtl animated:YES completion:nil];

 

 

     2)關閉當前視圖控制器

      - (void)dismissViewControllerAnimated:(BOOL)flag 

        completion:(void (^)(void))completion

[self dismissViewControllerAnimated:YES completion:nil];

 

 

     3)模式切換方式:

modalTransitionStyle

 

UIModalTransitionStyleCoverVertical    從下向上

UIModalTransitionStyleCrossDissolve      漸變

UIModalTransitionStyleFlipHorizontal     橫向翻轉

UIModalTransitionStylePartialCurl           翻書

//設置切換的動畫效果

    

newCtl.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

 

 

=========================

UIViewController的生命周期

 順序:

   1.alloc創建對象,分配空間

   2.init初始化對象,初始化數據

   3.LoadView -- self.view創建 

   4.viewDidLoad作用

   5.viewDidLoad何時被調用

   6.viewWillAppear函數

   7.viewDidAppear函數

   8.viewWillDisappear函數

   9.viewDidDisappear函數

   10.dealloc視圖被銷毀

   //視圖即將消失

例子:

-(void)viewWillDisappear:(BOOL)animated{

    [super viewWillDisappear:animated];

    NSLog(@"viewWillDisappear");

}

 

 

=========================

多個Controller之間的數據如何交換

   

     1.正向傳值

VA —> VB

傳值一方:

例如RootViewController.m里傳值

NewViewController *newCtl = [NewViewController new];

    

    UILabel *label = (UILabel *)[self.view viewWithTag:100];

  1: newCtl.deliverStr = label.text;

獲取值一方:

   2:  NewViewController.h :  @property (nonatomic,copy)NSString *deliverStr;//接受傳遞過來的參數

   3:  NewViewController.m: label.text = self.deliverStr;

 

     2.反向傳值

VA <— VB

傳值一方

1:typedef void (^blockType)(NSString *);

 

@interface NewViewController : UIViewController

//回調的block

2:@property (nonatomic,copy)blockType block;

 

 

傳值一方

NewViewController *newCtl = [NewViewController new];

    

    UILabel *label = (UILabel *)[self.view viewWithTag:100];

//設置block的主體實現

  3:  newCtl.block = ^(NSString *text){

        label.text = text;      

    };

 

3.通過AppDelegate對象傳值

1)獲取當前應用的sharedApplication對象:

       

+ (UIApplication *)sharedApplication 傳值一方

UILabel *label = (UILabel *)[self.view viewWithTag:100];

    

    //先給AppDelgate的中轉變數進行賦值

    

    //1.獲取UIAplication對象

    //2.獲取AppDelgate對象

    //3.賦值

    UIApplication *app = [UIApplication sharedApplication];

    AppDelegate *del = app.delegate;

    del.middleStr = label.text;

 

 

       2)獲取當前應用的AppDelegate對象:

       @property(nonatomic,assign) id<UIApplicationDelegate> delegate;

 

AppDelegate.h 里

//中轉的屬性變數

@property (nonatomic,copy)NSString *middleStr;

 

 

3)強制轉換為AppDelegate對象,然後通過該對象的setter和getter傳值

取值一方

例如在將出現的函數里調用

-(void)viewWillAppear:(BOOL)animated{

    [super viewWillAppear:animated];

  

    UIApplication *app = [UIApplication sharedApplication];

    AppDelegate *del = app.delegate;

    //判斷不為空

    if (del.middleStr.length!=0) {

        UILabel *label = (UILabel *)[self.view viewWithTag:100];

        label.text = del.middleStr;

    }

}

 

 

協議代理傳值方法

先創建一個協議.h文件,即 protocol 文件:內容如

#import <Foundation/Foundation.h>

@protocol Myprotocol <NSObject>

//代理需要完成的任務

-(void)showInfo:(NSString *)info;

@end

 

傳值一方:遵守協議

.h 文件:

@property (nonatomic,weak)id<Myprotocol> delegate;//指向代理對象

 

.m文件:

//讓代理對象執行方法

   

if ([_delegate respondsToSelector:@selector(showInfo:)]) {

        [_delegate showInfo:label.text];
    }  

 

 

    //協議代理

    //代理:能完成這個任務的對象

    //被代理:希望完成這個任務,但是本身不能實現的對象

    //設置代理:找到能同時獲取到代理和被代理對象的位置

 

獲取值一方:遵守協議

.h文件里:

@interface RootViewController : UIViewController<Myprotocol>

 

.m文件里:

-(void)showInfo:(NSString *)info{

    //刷新Label顯示的文字內容

    UILabel *label = (UILabel *)[self.view viewWithTag:100];

    label.text = info;  

}

 


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

-Advertisement-
Play Games
更多相關文章
  • 苦惱 每次看到別人的博客樣式都感覺很舒服,很好看。 當自己開通博客後,使用了預置的樣式也無法達到自己想要的頁面效果,怎麼辦? 廢話不多說,直奔主題 如何設置博客園自定義的樣式 還有這樣的功能,我怎麼不知道,後來也是看到園友發表過類似的文章才知道的。 首先我們要在後臺設置tab頁里,找到博客皮膚,下拉 ...
  • HTML DOM對象的屬性和方法介紹 DOM 是 Document Object Model(文檔對象模型)的縮寫。 DOM(文檔對象模型)是針對HTML和XML文檔的一個API(應用程式編程介面),它允許程式和腳本動態地訪問和更新文檔的內容,結構和樣式。 W3C DOM 標準被分為 3 個不同的部 ...
  • 簡單的說,versionCode是給機器看的,versionName是給人看的。更新的時候,機器根據versionCode判斷是升級還是降級,即使versionName(版本號)比以前的高,但是versionCode比以前的低,機器還是會判斷是降級。 ...
  • 先看需求效果圖: 幾個需求點: 1、顯示當月以及下個月的日曆 (可自行拓展更多月份) 2、首次點擊選擇“開始日期”,再次點擊選擇"結束日期" (1)、如果“開始日期” “結束日期” 相同 (2)、如果“開始日期” “結束日期” 不同,且“結束日期” 晚於 “開始日期” (3)、如果“結束日期” 早於 ...
  • 在報表填報成功後,發送消息至APP會提示數據已更新。再次期間用戶需要有查看該模板的許可權,如果沒有的話,則無法接受到提示信息。那麼在FineReport移動端中,如何手動推送APP消息呢? ...
  • Xcode8開放了新的一個Extension:Xcode Source Editor Extension,目的是讓開發者可以正規的自主為IDE編寫插件,雖然說系統現提供的功能還比較拮据,但是不妨礙我們瞭解和使用,本文主要介紹Xcode Source Editor Extension的功能,並演示一個 ...
  • 前言 Android開發中我們或多或少都會接觸到資料庫。Android中提供了一個占用記憶體極小的關係型資料庫 SQLite。雖然Android系統中提供了許多操作SQLite的API,但是我們還是需要手動去編寫SQL語句,這經常會出現一些莫名其妙的問題(
  • 蘋果的加急審核如何使用呢? 在iTunesconnect頁面,點擊右上角的“?”圖標,在彈出菜單中選擇“聯繫我們”, 聯繫我們 然後在Contact Us頁面,選擇“App Review” —> “App Store Review” —>” Request Expedited Review”, 加急 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...