你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 第三章設計模式

iOS 第三章設計模式

編輯:IOS開發綜合

目標

    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 之間的配合使用。

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved