iOS 第三章設計模式

來源:互聯網
上載者:User

目標

    IOS 開發架構

    IOS 常用設計模式

    IOS 程式狀態

    IOS 程式生命週期—UIApplication

      IOS 開發中 IBOutlet  IBAction

    IOS 文字框及其代理類的使用

 

1、IOS 開發架構

什麼是開發架構?

   我們把常用的類,打包整理成一個庫,可以重複使用。

架構是實際的產品。

 

什麼是設計模式?

   為常見問題提供一組通用、可複用、經過測試的解決方案。

設計模式不是具體的某段固定的代碼。可以理解為寫作文時候的“總分總”的萬金油寫法。

設計模式是是一個綜合體。

 

開發架構與設計模式的關係?

   (1)架構定義了應用程式的整體結構(類圖)

(2)架構定義了類和對象的關係

(3)架構強調複用

(4)架構設計的時候通常使用各種設計模式

 

設計模式有什麼好處?

   設計模式不局限與某種語言,從生活中總結而來,應用到程式開發中。

一招鮮,吃遍天下----MVC

 

2、IOS 常用設計模式

MVC

資料模型(Model)– 介面視圖(View) – 代碼控制(Controller)

委託(Delegate)

把實現方法的責任委託給另一個不同的對象,讓兩個對象共同完成一件事情。

 

單體(單例)

全域對象

只有一個

應用中的其他類都可以訪問

 

分類

它允許我們為一個”已有的類”添加新的方法

 

3、IOS 程式狀態

IOS系統的資源是有限的,應用程式在前台和在背景狀態是不一樣的。在後台時,程式會受到系統的很多限制,這樣可以提高電池的使用和使用者體驗。

 

開發app,我們要遵循apple公司的一些指導原則,原則如下:

Application State
 應用程式狀態
 說明
 
Not running   
 未運行
 程式沒啟動
 
Inactive
 未啟用
 程式在前台運行,不過沒有接收到事件。在沒有事件處理情況下程式通常停留在這個狀態
 
Active
 啟用
 程式在前台運行而且接收到了事件。這也是前台的一個正常的模式
 
Backgroud
 後台
 程式在後台而且能執行代碼,大多數程式進入這個狀態後會在在這個狀態上停留一會。時間到之後會進入掛起狀態(Suspended)。有的程式經過特殊的請求後可以長期處於Backgroud狀態
 
Suspended
 掛起
 程式在後台不能執行代碼。系統會自動把程式變成這個狀態而且不會發出通知。當掛起時,程式還是停留在記憶體中的,當系統記憶體低時,系統就把掛起的程式清除掉,為前景程式提供更多的記憶體
 

  

 

4、IOS 程式生命週期—UIApplication

    查看 IOS 項目中的 main.m 檔案,發現裡面代碼都是這樣:

#import<UIKit/UIKit.h>

 

#import"XXXAppDelegate.h"

 

int main(int argc, char *argv[])

{

    @autoreleasepool {

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([XXXAppDelegate class]));

    }

}

 

UIApplicationMain函數作用,只在 main() 函數中被調用,建立 UIApplication 對象和 xxxDelegate 對象

 

完整的代碼應該如下:

intmain(int argc, char *argv[])

{

    @autoreleasepool {

        return UIApplicationMain(argc, argv, UIApplication, NSStringFromClass([AppDelegate class]));

    }

}

 

UIApplicationMain主要

(1)建立一個UIApplication對象和一個UIApplicationDelegate對象

(2)設定事件迴圈,然後開始處理事件。

 

例子:

開會:-UIApplicationMain

老闆+秘書

老闆:代表整個公司,會議中露面、講話;-UIApplication

秘書:安排整個會議的行程(會議的生命週期)-xxxxDelegate

    瞭解會議召開的資訊(時間、地點、主題);-NoRunning

    請示老闆批准參加會議; - Inactive

    準備會議檔案;         - Action

    聯絡衣食住行;         - background

    確定會議的時間表;     - Suspended

    會議結束整理會議紀要;

 

確定人手 、 分工.

UIApplicationMain(argc,argv, UIApplication, NSStringFromClass([AppDelegate class]));

開會(xx,xx,老闆,秘書);

 

說明了程式運行過程中,所有參與程式啟動並執行對象。有些對象我們不能修改,有些對象我們可以修改。

體現了三種設計模式:MVC、代理(Application Delegate)、單例(UIApplication、UIWindow這兩個對象,不允許我們修改,整個程式中只建立一次)


 

 

 

 

Application 生命週期 在協議 UIApplicationDelegate 中定義

(1)didFinishLaunchingWithOptions-載入完成,即將顯示

(2)applicationDidBecomeActive-進入活動狀態,正在運行

 

 Application windows are expected to have a root view controller at the endof application launch

 

(3)applicationWillResignActive-釋放活動狀態

(4)applicationDidEnterBackground-釋放活動狀態,自動進入後台

(5)applicationWillEnterForeground-從後台再次進入前台狀態,自動進入 Active 狀態

 

 

 

//正常啟動

-------1 didFinishLaunchingWithOptions   只運行一次,確保介面載入一次

-------5 applicationDidBecomeActive

//按 Home 鍵

-------2 applicationWillResignActive

-------3 applicationDidEnterBackground

//按表徵圖,重新啟動

-------4 applicationWillEnterForeground

-------5 applicationDidBecomeActive

//按  Home 鍵

-------2 applicationWillResignActive

-------3 applicationDidEnterBackground

//在後台刪除程式

--------6 applicationWillTerminate

 

5、IOS 開發中 IBOutlet  IBAction

在 IOS 開發中,採用 MVC 設計模式,把 View 介面通過IB(InterfaceBuilder) xxxViewController.xib 來建立。

如果希望介面上的組件,點擊後有反映,需要用代碼控制,代碼在

xxxViewController.h    xxxViewController.m 控制器中。

 

問題:如何知道代碼中的某個量 或 函數,指向介面上的某個組件?

解決:在 OC 代碼中,添加兩個 “標示符”

 IBOutlet 關聯組件和代碼,代碼能夠控制組件上的”值”;

 IBAction 關聯組件和代碼,代碼能夠對按鈕的 “事件”做響應;

 

如何?:

(1)先在控制類中 手寫 IBOutlet IBAction  代碼,然後在 xib 中連線;

(2)不寫代碼,直接通過  IB 的“助手”工具,直接連線並且自動產生 IBOutlet

    IBAction  代碼 (強烈推薦)

 

 

6、IOS 文字框及其代理類的使用

IOS 庫中提供了為所有 UIKit組件,都提供了兩個定義,一個是類定義、一個是協議定義。如文字框:

UITextField : 提供了介面的各個屬性,僅限於介面

UITextFieldDelegate : 提供了能夠對文字框所做操作的定義

 

API 原文

The UITextFieldDelegate protocol defines themessages sent to a text field delegate as part of the sequence of editing itstext. All of the methods of this protocol are optional.

翻譯

UITextFieldDelegete 協議定義了在一個文字框中,按照順序,編輯裡面文字的時候,傳遞給它的 delegete 的訊息。

 

協議方法說明

 

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ 

    //返回一個BOOL值,指定是否循序文字欄位開始編輯

    return YES;

 

-(void)textFieldDidBeginEditing:(UITextField *)textField{

    //開始編輯時觸發,文字欄位將成為first responder,一般預設

    [textField becomeFirstResponder];

}

 

-(BOOL)textFieldShouldEndEditing:(UITextField *)textField{

    //返回BOOL值,指定是否允許文字欄位結束編輯,當編輯結束,文字欄位會讓出first responder

    //要想在使用者結束編輯時阻止文字欄位消失,可以返回NO

    //這對一些文字欄位必須始終保持活躍狀態的程式很有用,比如立即訊息

    return NO;

}

 

-(BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString *)string{

    //當使用者使用自動校正功能,把輸入的文字修改為推薦的文字時,就會調用這個方法。

    //這對於想要加入撤銷選項的應用程式特別有用

    //可以跟蹤欄位內所做的最後一次修改,也可以對所有編輯做日誌記錄,用作審計用途。 

    //要防止文字被改變可以返回NO

    //這個方法的參數中有一個NSRange對象,指明了被改變文字的位置,建議修改的文本也在其中

    return YES;

}

/////////////////////////////////////

//限制使用者輸入字元長度,超過長度,自動截取

-(BOOL)textField:(UITextField *)textFieldshouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string

{

 if ([textField.text length] > MAXLENGTH)

 {

  textField.text = [textField.textsubstringToIndex:MAXLENGTH-1];

  return NO;

 }

 return YES;

}

/////////////////////////////////////

 

-(BOOL)textFieldShouldClear:(UITextField *)textField{

    //返回一個BOOL值指明是否允許根據使用者請求清除內容

    //可以設定在特定條件下才允許清除內容

    return YES;

}

-(BOOL)textFieldShouldReturn:(UITextField*)textField{

    //返回一個BOOL值,指明是否允許在按下斷行符號鍵時結束編輯

    //如果允許要調用resignFirstResponder 方法,這回導致結束編輯,而鍵盤會被收合

    [textField resignFirstResponder];//查一下resign這個單詞的意思就明白這個方法了

    return YES;

}

 

 

--------------------------------

練習一:掌握UITextFieldDelegate 與 UITextField 配合應用

(1)當text field 獲得焦點時,是把text field 的背景色設定為綠色.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{

    NSLog(@"textFieldShouldBeginEditing:");

    return YES; 

}

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    NSLog(@"textFieldDidBeginEditing:");

    textField.backgroundColor =[UIColor greenColor];

}

 

(2)當text field失去焦點之前會調用textFieldShouldEndEditing。在樣本中,我們使用textFieldShouldEndEditing:讓背景色返回最初的顏色。

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{

    NSLog(@"textFieldShouldEndEditing:");

    textField.backgroundColor =[UIColor whiteColor];

    return YES;

}

- (void)textFieldDidEndEditing:(UITextField *)textField{

    NSLog(@"textFieldDidEndEditing:");

}

(3)當使用者輸入字元的時候,需要監測輸入字元的長度,大於10,不允許輸入

- (BOOL)textField:(UITextField *)textFieldshouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

    NSCharacterSet*doneButtonCharacterSet = [NSCharacterSet newlineCharacterSet];

    NSRange replacementTextRange =[text rangeOfCharacterFromSet:doneButtonCharacterSet];

    NSUInteger location =replacementTextRange.location;

    if (textView.text.length +text.length > 10){

    if (location != NSNotFound){

        [textViewresignFirstResponder];

   }

    return NO;

    }

    else if (location !=NSNotFound){

    [textViewresignFirstResponder];

    return NO;

    }

    return YES;

}

 

每次使用者通過鍵盤輸入字元時,在字元顯示在text Field之前,textField:shouldChangeCharactersInRange:replacementString方法會被調用。這個方法中可以方便的定位測試使用者輸入的字元,並且限制使用者輸入特定的字元。在上面的代碼中,我使用done鍵來隱藏鍵盤:通過檢測看replacement文本中是否包含newLineCharacterSet任意的字元。

 

如果有一個字元是來自newLineCharacterSet的,那麼說明done按鈕被按過了,因此應該將鍵盤隱藏起來。另外,在使用者每次輸入內容時,還檢測text Field當前常值內容的長度,如果大於140個字元,則返回NO,這樣text Field就可以限制輸入10個字元了。

 

 

練習二:與文字框類似的一個組件,UITextView  允許使用者輸入多行文字,請自己查詢API ,練習上述同樣的例子,仔細理解 UITextView  與 UITextViewDelegate 之間的配合使用。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.