TextKit框架詳細(xì)解析 (八) —— 文本編程指南之管理Text Fields and Text Views(四)

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.09.01

前言

TextKit框架是對(duì)Core Text的封裝往枣,用簡(jiǎn)潔的調(diào)用方式實(shí)現(xiàn)了大部分Core Text的功能。 TextKit是一個(gè)偏上層的開發(fā)框架移层,在iOS7以上可用拯钻,使用它可以方便靈活處理復(fù)雜的文本布局膀估,滿足開發(fā)中對(duì)文本布局的各種復(fù)雜需求。TextKit實(shí)際上是基于CoreText的一個(gè)上層框架荞怒,其是面向?qū)ο蟮娜髯痢=酉聛?lái)幾篇我們就一起看一下這個(gè)框架。感興趣的看下面幾篇文章褐桌。
1. TextKit框架詳細(xì)解析 (一) —— 基本概覽和應(yīng)用場(chǎng)景(一)
2. TextKit框架詳細(xì)解析 (二) —— 基本概覽和應(yīng)用場(chǎng)景(二)
3. TextKit框架詳細(xì)解析 (三) —— 一個(gè)簡(jiǎn)單布局示例(一)
4. TextKit框架詳細(xì)解析 (四) —— 一個(gè)簡(jiǎn)單布局示例(二)
5. TextKit框架詳細(xì)解析 (五) —— 文本編程指南之簡(jiǎn)介(一)
6. TextKit框架詳細(xì)解析 (六) —— 文本編程指南之展示文本內(nèi)容(二)
7. TextKit框架詳細(xì)解析 (七) —— 文本編程指南之排版概念(三)

Managing Text Fields and Text Views - 管理Text Fields and Text Views

Text fields and text views有兩個(gè)主要功能:顯示文本和啟用文本的輸入和編輯衰抑。 幾個(gè)編程任務(wù)與這些簡(jiǎn)單目的相關(guān)聯(lián),包括配置文本對(duì)象荧嵌,訪問(wèn)當(dāng)前文本停士,驗(yàn)證用戶輸入的內(nèi)容以及在Text fields中顯示疊加視圖(如書簽按鈕)挖帘。

UITextFieldUITextView對(duì)象的委托負(fù)責(zé)大多數(shù)這些任務(wù)。 委托必須采用UITextFieldDelegateUITextViewDelegate協(xié)議并實(shí)現(xiàn)一個(gè)或多個(gè)協(xié)議方法恋技。 所有協(xié)議方法的實(shí)現(xiàn)都是可選的拇舀。 要調(diào)用這些方法,必須以編程方式或在Interface Builder中設(shè)置text fields and text views的代理屬性蜻底。


The Sequence of Messages to the Delegate - 代理的消息序列

在大多數(shù)情況下骄崩,當(dāng)給定文本對(duì)象的第一響應(yīng)者狀態(tài)發(fā)生更改(或即將發(fā)生的更改)時(shí),UITextFieldUITextView類的實(shí)例會(huì)向其委托發(fā)送一系列命名相似的消息薄辅。當(dāng)用戶點(diǎn)擊文本對(duì)象時(shí)要拂,它自動(dòng)成為第一響應(yīng)者;結(jié)果站楚,系統(tǒng)顯示鍵盤并開始為該文本對(duì)象編輯會(huì)話脱惰。當(dāng)用戶點(diǎn)擊另一個(gè)文本對(duì)象或點(diǎn)擊按鈕以結(jié)束編輯時(shí),當(dāng)前文本對(duì)象將退出第一響應(yīng)者狀態(tài)窿春。如果未選擇其他文本對(duì)象拉一,系統(tǒng)將隱藏鍵盤;另一方面旧乞,如果用戶選擇另一個(gè)文本對(duì)象蔚润,則它成為第一響應(yīng)者并顯示該對(duì)象的鍵盤尺栖。

這種常見行為有幾個(gè)例外嫡纠。在iPad上,如果視圖控制器使用“form sheet”樣式以模態(tài)方式顯示其視圖延赌,則鍵盤一旦顯示除盏,就不會(huì)隱藏,直到用戶點(diǎn)擊關(guān)閉鍵或模式視圖控制器以編程方式解除挫以。此行為的目的是避免在用戶在大部分(但不完全是)text fields的視圖之間移動(dòng)時(shí)過(guò)多的動(dòng)畫者蠕。另一個(gè)例外是自定義輸入視圖。輸入視圖可替代分配給text view or a custom viewinputView屬性的系統(tǒng)鍵盤屡贺。當(dāng)存在輸入視圖時(shí)蠢棱,即使文本對(duì)象是第一響應(yīng)者锌杀,UIKit也可能交換鍵盤甩栈,并且可能代表開發(fā)人員為非文本對(duì)象顯示類似鍵盤的輸入視圖。

text views and text fields發(fā)送給其代理的消息序列如下:

  • 1)Just before a text object becomes first responder - 就在文本對(duì)象成為第一個(gè)響應(yīng)者之前 - textFieldShouldBeginEditing:(text field)textViewShouldBeginEditing:(text view)糕再。代理可以通過(guò)返回YES(默認(rèn)值)或NO來(lái)驗(yàn)證文本對(duì)象是否應(yīng)成為第一響應(yīng)者量没。
  • 2)Just after a text object becomes first responder - 在文本對(duì)象成為第一個(gè)響應(yīng)者之后 -textFieldDidBeginEditing:(text field)textViewDidBeginEditing:(text view)。代理可以通過(guò)更新狀態(tài)信息或例如在編輯會(huì)話期間顯示覆蓋視圖來(lái)響應(yīng)此消息突想。
  • 3)During the editing session - 在編輯會(huì)話期間 - 各種殴蹄。當(dāng)用戶輸入和編輯文本時(shí)究抓,文本對(duì)象會(huì)調(diào)用某些代理方法(如果已實(shí)現(xiàn))。例如袭灯,text view的代理可以在任何文本更改時(shí)接收textViewDidChange:消息刺下。當(dāng)用戶點(diǎn)擊文本字段的清除按鈕時(shí),text field的代理可以接收textFieldShouldClear:消息稽荧;代理返回一個(gè)布爾值橘茉,指示是否應(yīng)清除該文本。
  • 4)Just before a text object resigns first responder - 就在文本對(duì)象撤消第一個(gè)響應(yīng)者 - textFieldShouldEndEditing:(text field)textViewShouldEndEditing:(text view)之前姨丈。代理實(shí)施這些方法的主要原因是驗(yàn)證輸入的文本畅卓。例如,如果文本應(yīng)符合給定格式蟋恬,則代理在此處驗(yàn)證輸入的字符串翁潘,如果字符串不符合則返回NO。默認(rèn)返回值為YES歼争。text field的相關(guān)方法是textFieldShouldReturn:拜马。當(dāng)用戶點(diǎn)擊return鍵時(shí),text field類向委托發(fā)送textFieldShouldReturn:消息矾飞,詢問(wèn)是否應(yīng)該重新簽名第一響應(yīng)者一膨。
  • 5)Just after text a object resigns first responder - 在文本對(duì)象取消第一響應(yīng)者 - textFieldDidEndEditing:(text field)textViewDidEndEditing:(text view)。代理可以實(shí)現(xiàn)這些方法來(lái)獲取用戶剛剛輸入或編輯的文本洒沦。

通過(guò)觀察通知豹绪,可以向代理以外的對(duì)象通知text views and text fields的第一響應(yīng)者狀態(tài)的變化。 (但是申眼,它們不能批準(zhǔn)或拒絕轉(zhuǎn)換到新狀態(tài)瞒津。)通知的名稱包括UITextFieldTextDidBeginEditingNotificationUITextViewTextDidEndEditingNotificationUITextViewTextDidChangeNotification括尸。 與textFieldDidEndEditing:textViewDidEndEditing:一樣巷蚪,觀察和處理UITextFieldTextDidEndEditingNotificationUITextViewTextDidEndEditingNotification通知的主要原因是訪問(wèn)相關(guān)text field or text view中的文本。 請(qǐng)參閱UITextField Class ReferenceUITextView Class Reference以了解有關(guān)這些類發(fā)布的通知的更多信息濒翻。


Configuring Text Fields and Text Views - 配置Text Fields and Text Views

與UIKit框架提供的任何視圖對(duì)象一樣屁柏,您通常需要在顯示text fields and text views之前對(duì)其進(jìn)行配置。您可以通過(guò)編程方式或使用Interface Builder的屬性檢查器來(lái)配置它們有送。在任何一種情況下淌喻,您都要設(shè)置文本對(duì)象的property

某些屬性對(duì)于text fields and text views是通用的雀摘,而其他屬性特定于每種類型的對(duì)象裸删,包括以下內(nèi)容:

  • Text characteristics - 文本特征 - 文本顏色,對(duì)齊方式阵赠,字體系列涯塔,字體字體和字體大小肌稻。
  • Keyboard - 鍵盤 - 鍵盤類型,返回鍵名稱匕荸,安全文本條目和自動(dòng)啟用的返回鍵爹谭,所有這些都由UITextInputTraits協(xié)議聲明。 (請(qǐng)注意榛搔,與文本視圖關(guān)聯(lián)的自動(dòng)啟用的返回鍵在輕觸時(shí)充當(dāng)回車鍵旦棉。),有關(guān)詳細(xì)信息药薯,請(qǐng)參閱Configuring the Keyboard for Text Objects绑洛。
  • Text-field specific - 特定于文本字段 - 邊框,背景圖像童本,禁用圖像真屯,清除按鈕和占位符文本。作為UIControl對(duì)象穷娱,文本字段還具有highlighted, selected, enabled和其他屬性绑蔫。
  • Text-view specific - 特定于文本視圖 - 可編輯狀態(tài),數(shù)據(jù)檢測(cè)器(用于電話號(hào)碼和URL鏈接)泵额。由于文本視圖繼承自UIScrollView配深,因此您還可以通過(guò)設(shè)置適當(dāng)?shù)膶傩詠?lái)管理滾動(dòng)視圖行為。

Tracking Multiple Text Fields or Text Views - 跟蹤多個(gè)Text Fields or Text Views

UITextFieldDelegateUITextViewDelegate協(xié)議的所有方法都有一個(gè)參數(shù)嫁盲,用于標(biāo)識(shí)text field or text view篓叶,其中包括第一響應(yīng)者狀態(tài)的更改,值的更改或作為代理消息的原因的任何其他更改羞秤。如果當(dāng)前顯示的視圖中只有一個(gè)文本對(duì)象缸托,則該參數(shù)引用的文本對(duì)象的標(biāo)識(shí)是顯而易見的。但是瘾蛋,如果當(dāng)前顯示的視圖具有多個(gè)text field or text view俐镐,則代理必須找到一種方法來(lái)標(biāo)識(shí)作為代理消息主題的文本對(duì)象。

您可以使用以下兩種方法之一進(jìn)行此確定:outlets or tags哺哼。對(duì)于outlets方法佩抹,聲明一個(gè)outlets實(shí)例變量(使用IBOutlet關(guān)鍵字),然后make an outlet connection.取董。在您的代理方法中棍苹,使用指針比較測(cè)試傳入的文本對(duì)象是否與outlet引用的對(duì)象相同。例如甲葬,假設(shè)您聲明并連接名為SSNoutlet廊勃。您的代碼可能類似于Listing 3-1懈贺。

// Listing 3-1  Identifying the passed-in text object using an outlet

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    if (textField == SSN) {
            // .....
            return NO;
        }
    return YES;
}

當(dāng)您需要將字符串值寫入這些對(duì)象時(shí)经窖,定義視圖中文本對(duì)象的outlet連接特別有用坡垫,甚至是必不可少的,而不僅僅是獲取它們画侣。

對(duì)于tag方法冰悠,聲明一組枚舉常量,每個(gè)標(biāo)記一個(gè)常量配乱。

enum {
    NameFieldTag = 0,
    EmailFieldTag,
    DOBFieldTag,
    SSNFieldTag
};

然后以編程方式或在Interface Builder的屬性檢查器中將整數(shù)值分配給文本對(duì)象的tag屬性溉卓。 (tag屬性由UIView聲明。)在委托方法中搬泥,您可以使用switch語(yǔ)句來(lái)評(píng)估傳入文本對(duì)象的tag值并相應(yīng)地繼續(xù)(如Listing 3-2所示)桑寨。

// Listing 3-2  Identifying the passed-in text object using tags

- (void)textFieldDidEndEditing:(UITextField *)textField {
 
    switch (textField.tag) {
        case NameFieldTag:
            // do something with this text field
            break;
        case EmailFieldTag:
             // do something with this text field
            break;
        // remainder of switch statement....
    }
}

Getting the Entered Text and Setting Text - 獲取輸入的文本和設(shè)置文本

用戶在text field or text view中輸入或編輯文本并且編輯會(huì)話結(jié)束后,委托應(yīng)獲取文本并將其存儲(chǔ)在應(yīng)用程序的數(shù)據(jù)模型中忿檩。 獲取輸入文本的最佳代理方法是textFieldDidEndEditing:(text fields)textViewDidEndEditing:(text views)尉尾。

Listing 3-3說(shuō)明了如何獲取用戶在text field中輸入的文本(使用標(biāo)記區(qū)分視圖中的多個(gè)text field)。 UITextFieldUITextView的text屬性保存文本對(duì)象當(dāng)前顯示的字符串燥透。 代理從此屬性獲取字符串沙咏,并使用為每個(gè)字段定義的鍵將其存儲(chǔ)在字典對(duì)象中。 如果text field沒(méi)有字符串值 - 也就是說(shuō)班套,該text field包含空字符串 - 代理只返回肢藐。

// Listing 3-3  Getting the text entered into a text field

- (void)textFieldDidEndEditing:(UITextField *)textField {
    if ([textField.text isEqualToString:@""])
        return;
 
    switch (textField.tag) {
        case NameFieldTag:
            [thePerson setObject:textField.text forKey:MyAppPersonNameKey];
            break;
        case EmailFieldTag:
            [thePerson setObject:textField.text forKey:MyAppPersonEmailKey];
            break;
        case SSNFieldTag:
            [thePerson setObject:textField.text forKey:MyAppPersonSSNKey];
            break;
        default:
            break;
    }
}

Listing 3-4顯示了textViewDidEndEditing:方法的實(shí)現(xiàn),該方法從文本視圖中獲取顯示的字符串并將其存儲(chǔ)在字典中吱韭。 這里該方法不要求text view取消第一響應(yīng)者吆豹。 (當(dāng)用戶在視圖的用戶界面中點(diǎn)擊“完成”按鈕時(shí),調(diào)用的resignFirstResponder方法在之前調(diào)用的操作方法中被調(diào)用理盆。)

// Listing 3-4  Getting the text entered into a text view

- (void)textViewDidEndEditing:(UITextView *)textView {
    NSString *theText = textView.text;
    if (![theText isEqualToString:@""]) {
        [thePerson setObject:theText forKey:MyAppPersonNotesKey];
    }
    doneButton.enabled = NO;
}

如果需要將字符串值寫入文本對(duì)象 - 通常在從應(yīng)用程序的數(shù)據(jù)模型中檢索它們之后 - 只需將字符串分配給文本對(duì)象的text屬性即可瞻讽。 例如:

NSString *storedValue = [thePerson objectForKey:MyAppPersonEmailKey];
emailField.text = storedValue;

為此,為每個(gè)要寫入字符串值的text field or text view定義outlets
很有用(在此示例中為emailField)熏挎。


Using Formatters with Text Fields

Formatter objects自動(dòng)解析特定格式的字符串速勇,并將字符串轉(zhuǎn)換為表示數(shù)字,日期或其他值的對(duì)象坎拐;它們也可以反向工作烦磁,將NSDateNSNumber和類似對(duì)象轉(zhuǎn)換為表示這些對(duì)象值的格式化字符串哼勇。 Foundation框架提供了抽象基類NSFormatter和該類的兩個(gè)具體子類NSDateFormatterNSNumberFormatter都伪。 使用這些類,用戶可以在文本字段中輸入以下值:

11/15/2010
-1,348.09

并且您的應(yīng)用程序可以使用formatter對(duì)象將字符串分別轉(zhuǎn)換為NSDate對(duì)象和NSNumber對(duì)象积担。

以下代碼清單使用日期格式化程序?qū)ο髞?lái)說(shuō)明格式化程序的使用陨晶。 (當(dāng)然,您可以使用UIDatePicker對(duì)象進(jìn)行日期輸入而不是text field,但是帶有附加日期格式化程序的text field是另一種選擇先誉。)Listing 3-5中的代碼創(chuàng)建了一個(gè)NSDateFormatter對(duì)象并將其分配給實(shí)例變量湿刽。 它將日期格式化程序配置為使用日期的“short style”,但是以對(duì)日歷褐耳,區(qū)域設(shè)置和時(shí)區(qū)的更改作出響應(yīng)的方式诈闺。 它還以給定格式將今天的日期指定為占位符字符串,以便用戶在輸入日期時(shí)可以使用模型铃芦。

// Listing 3-5  Configuring a date formatter

- (void)viewDidLoad {
    [super viewDidLoad];
    dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setGeneratesCalendarDates:YES];
    [dateFormatter setLocale:[NSLocale currentLocale]];
    [dateFormatter setCalendar:[NSCalendar autoupdatingCurrentCalendar]];
    [dateFormatter setTimeZone:[NSTimeZone defaultTimeZone]];
    [dateFormatter setDateStyle:NSDateFormatterShortStyle]; // example: 4/13/10
    DOB.placeholder = [NSString stringWithFormat:@"Example: %@", [dateFormatter stringFromDate:[NSDate date]]];
 
    // code continues....
}

配置日期格式化程序后雅镊,代理可以在格式化程序上調(diào)用dateFromString:方法,將輸入的日期字符串轉(zhuǎn)換為NSDate對(duì)象刃滓,如Listing 3-6所示仁烹。

// Listing 3-6  Using an NSDateFormatter object to convert a date string to a date object

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [textField resignFirstResponder];
    if ([textField.text isEqualToString:@""])
        return;
    switch (textField.tag) {
        case DOBField:
            NSDate *theDate = [dateFormatter dateFromString:textField.text];;
            if (theDate)
                [inputData setObject:theDate forKey:MyAppPersonDOBKey];
            break;
        // more switch case code here...
        default:
            break;
    }
}

格式化程序的使用并不保證輸入的字符串包含有效值 - 例如,用戶可以在公歷中為月份編號(hào)輸入13咧虎。為確保用戶輸入了正確的值晃危,代理必須按照Validating Entered Text中的說(shuō)明驗(yàn)證字符串。并且因?yàn)轵?yàn)證通常需要已知格式和有效值范圍老客,如果您配置日期格式化程序僚饭,如Listing 3-5所示,以便它對(duì)不同的日歷和區(qū)域設(shè)置敏感胧砰,則無(wú)法確定地知道格式鳍鸵。要指定已知的日期格式,請(qǐng)通過(guò)調(diào)用setDateFormat:來(lái)配置日期格式化程序尉间,傳入Unicode標(biāo)準(zhǔn)定義的格式模式偿乖。

您還可以反轉(zhuǎn)上面顯示的過(guò)程:通過(guò)調(diào)用NSDateFormatter方法stringFromDate:將日期對(duì)象轉(zhuǎn)換為給定格式的字符串,然后將該字符串分配給text field, text view, or labeltext屬性哲嘲。

有關(guān)NSDateFormatterNSNumberFormatter的詳細(xì)信息贪薪,請(qǐng)參閱Data Formatting Guide


Validating Entered Text - 驗(yàn)證輸入的文本

應(yīng)用程序有時(shí)在驗(yàn)證該值之前無(wú)法接受在text fields and text views中輸入的字符串眠副。 也許字符串必須是某種格式画切,或者值(在轉(zhuǎn)換為數(shù)值后)必須在一定范圍內(nèi)。 驗(yàn)證輸入字符串的最佳代理方法是textFieldShouldEndEditing:用于text fields囱怕, textViewShouldEndEditing:用于text views霍弹。 在text field or text view退出第一響應(yīng)者狀態(tài)之前調(diào)用這些方法。 返回NO可防止發(fā)生這種情況娃弓,因此文本對(duì)象仍然是編輯的焦點(diǎn)典格。 如果輸入的字符串無(wú)效,您還應(yīng)顯示警告以通知用戶該錯(cuò)誤台丛。

Listing 3-7使用正則表達(dá)式來(lái)驗(yàn)證在“Social Security Number”字段中輸入的字符串是否符合這些號(hào)碼的格式耍缴。

// Listing 3-7  Validating the format of a text field’s string using a regular expression

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    if (textField == SSN) { // SSN is an outlet
        NSString *regEx = @"[0-9]{3}-[0-9]{2}-[0-9]{4}";
        NSRange r = [textField.text rangeOfString:regEx options:NSRegularExpressionSearch];
        if (r.location == NSNotFound) {
            UIAlertView *av = [[[UIAlertView alloc] initWithTitle:@"Entry Error"
                message:@"Enter social security number in 'NNN-NN-NNNN' format"
                delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
            [av show];
            return NO;
        }
    }
        return YES;
}

Listing 3-8textViewShouldEndEditing:的實(shí)現(xiàn)對(duì)文本視圖中輸入的文本強(qiáng)制執(zhí)行字符限制。

// Listing 3-8  Validating a text view’s string for allowable length

- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
      if (textView.text.length > 50) {
        UIAlertView *av = [[[UIAlertView alloc] initWithTitle:@"Entry Error"
            message:@"You must enter less than 50 characters." delegate:self cancelButtonTitle:@"OK"
            otherButtonTitles:@"Clear", nil] autorelease];
        [av show];
        return NO;
    }
    return YES;
}

通過(guò)實(shí)現(xiàn)textField:shouldChangeCharactersInRange:replacementString:方法,代理還可以在輸入文本字段時(shí)驗(yàn)證每個(gè)字符防嗡。 Listing 3-9中的代碼驗(yàn)證每個(gè)輸入的字符(字符串)代表一個(gè)數(shù)字变汪。 (您可以通過(guò)為文本字段指定UIKeyboardTypeNumberPad鍵盤來(lái)實(shí)現(xiàn)相同的目標(biāo)。)

// Listing 3-9  Validating each character as it’s entered

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
    if ([string isEqualToString:@""]) return YES;
    if (textField.tag == SalaryFieldTag) {
        unichar c = [string characterAtIndex:0];
        if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:c]) {
            return YES;
        } else {
            return NO;
        }
    }
 
    return YES;
}

您還可以實(shí)現(xiàn)textField:shouldChangeCharactersInRange:replacementString:方法本鸣,以便在用戶輸入文本時(shí)為其提供可能的單詞補(bǔ)全或更正。


Using Overlay Views in Text Fields - Text Fields中使用疊加視圖

疊加視圖是插入text field左右角的小視圖硅蹦。 當(dāng)用戶點(diǎn)擊它們(通常是按鈕)并作用于text field的當(dāng)前內(nèi)容時(shí)荣德,它們充當(dāng)控件。 搜索和書簽是疊加視圖的兩個(gè)常見任務(wù)童芹,但其他任務(wù)都是可能的涮瞻。 此疊加視圖使用text field中的(部分)URL加載Web瀏覽器:

要實(shí)現(xiàn)疊加視圖,請(qǐng)創(chuàng)建一個(gè)大小適合text field高度的視圖假褪,并為視圖提供適當(dāng)大小的圖像署咽。 如果視圖是按鈕或其他控件,請(qǐng)指定目標(biāo)對(duì)象生音,操作選擇器和觸發(fā)控件事件宁否。 通常,當(dāng)text field是編輯焦點(diǎn)時(shí)缀遍,您希望顯示疊加視圖慕匠,因此請(qǐng)將其分配給代理的textFieldDidBeginEditing:方法中的text fieldleftViewrightView屬性。 您可以控制在編輯會(huì)話期間何時(shí)顯示疊加視圖 - 例如域醇,在用戶開始輸入文本之前或僅在用戶開始輸入文本之后 - 通過(guò)向leftViewModerightViewMode屬性分配UITextFieldViewMode常量台谊。 Listing 3-10說(shuō)明了如何實(shí)現(xiàn)疊加視圖。

// Listing 3-10  Displaying an overlay view in a text field

- (void)textFieldDidBeginEditing:(UITextField *)textField {
     if (textField.tag == NameField && self.overlayButton) {
        textField.leftView = self.overlayButton;
        textField.leftViewMode = UITextFieldViewModeAlways;
    }
}
 
@dynamic overlayButton;
 
- (UIButton *)overlayButton {
    if (!overlayButton) {
        overlayButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
        UIImage *overlayImage = [UIImage imageNamed:@"bookmark.png"];
        if (overlayImage) {
            [overlayButton setImage:overlayImage forState:UIControlStateNormal];
            [overlayButton addTarget:self action:@selector(bookmarkTapped:)
                forControlEvents:UIControlEventTouchUpInside];
        }
    }
    return overlayButton;
}

如果對(duì)覆蓋視圖使用控件譬挚,請(qǐng)確保實(shí)現(xiàn)action方法锅铅。

要?jiǎng)h除覆蓋視圖,只需在textFieldDidEndEditing:代理方法中將leftViewrightView屬性設(shè)置為nil减宣,如Listing 3-11所示盐须。

// Listing 3-11  Removing the overlay view

- (void)textFieldDidEndEditing:(UITextField *)textField {
 
    if (textField.tag == NameFieldTag) {
        textField.leftView = nil;
    }
    // remainder of implementation....
}

Tracking the Selection in Text Views - 跟蹤Text Views中的選擇

UITextViewDelegatetextViewDidChangeSelection:方法允許您跟蹤用戶在text view中所做選擇的更改。 您可以實(shí)現(xiàn)該方法以獲取所選子字符串并對(duì)其執(zhí)行某些操作漆腌。Listing 3-12是一個(gè)示例丰歌,它使所選子字符串中的所有字符都為大寫。

// Listing 3-12  Getting the selected substring and changing it

- (void)textViewDidChangeSelection:(UITextView *)textView {
    NSRange r = textView.selectedRange;
    if (r.length == 0) {
        return;
    }
    NSString *selText = [textView.text substringWithRange:r];
    NSString *upString = [selText uppercaseString];
    NSString *newString = [textView.text stringByReplacingCharactersInRange:r withString:upString];
    textView.text = newString;
}

后記

本篇主要講述了管理Text Fields and Text Views屉凯,感興趣的給個(gè)贊或者關(guān)注~~~

`

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末立帖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悠砚,更是在濱河造成了極大的恐慌晓勇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绑咱,居然都是意外死亡绰筛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門描融,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铝噩,“玉大人,你說(shuō)我怎么就攤上這事窿克】ビ梗” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵年叮,是天一觀的道長(zhǎng)具被。 經(jīng)常有香客問(wèn)我,道長(zhǎng)只损,這世上最難降的妖魔是什么一姿? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮跃惫,結(jié)果婚禮上叮叹,老公的妹妹穿的比我還像新娘。我一直安慰自己爆存,他們只是感情好衬横,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著终蒂,像睡著了一般蜂林。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拇泣,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天戴质,我揣著相機(jī)與錄音混埠,去河邊找鬼怕敬。 笑死柒凉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的债朵。 我是一名探鬼主播子眶,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼序芦!你這毒婦竟也來(lái)了臭杰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谚中,失蹤者是張志新(化名)和其女友劉穎渴杆,沒(méi)想到半個(gè)月后寥枝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磁奖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年囊拜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比搭。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冠跷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出身诺,到底是詐尸還是另有隱情蜜托,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布戚长,位于F島的核電站盗冷,受9級(jí)特大地震影響怠苔,放射性物質(zhì)發(fā)生泄漏同廉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一柑司、第九天 我趴在偏房一處隱蔽的房頂上張望迫肖。 院中可真熱鬧,春花似錦攒驰、人聲如沸蟆湖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)隅津。三九已至,卻和暖如春劲室,著一層夾襖步出監(jiān)牢的瞬間伦仍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工很洋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留充蓝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓喉磁,卻偏偏與公主長(zhǎng)得像谓苟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子协怒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容