版本記錄
版本號(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
中顯示疊加視圖(如書簽按鈕)挖帘。
UITextField
或UITextView
對(duì)象的委托負(fù)責(zé)大多數(shù)這些任務(wù)。 委托必須采用UITextFieldDelegate
或UITextViewDelegate
協(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í),UITextField
或UITextView
類的實(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 view
的inputView屬性的系統(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)瞒津。)通知的名稱包括UITextFieldTextDidBeginEditingNotification,UITextViewTextDidEndEditingNotification和UITextViewTextDidChangeNotification括尸。 與textFieldDidEndEditing:和textViewDidEndEditing:一樣巷蚪,觀察和處理UITextFieldTextDidEndEditingNotification和UITextViewTextDidEndEditingNotification
通知的主要原因是訪問(wèn)相關(guān)text field or text view
中的文本。 請(qǐng)參閱UITextField Class Reference和UITextView 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
UITextFieldDelegate或UITextViewDelegate協(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è)您聲明并連接名為SSN
的outlet
廊勃。您的代碼可能類似于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
)。 UITextField
或UITextView
的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ì)象坎拐;它們也可以反向工作烦磁,將NSDate
,NSNumber
和類似對(duì)象轉(zhuǎn)換為表示這些對(duì)象值的格式化字符串哼勇。 Foundation框架提供了抽象基類NSFormatter和該類的兩個(gè)具體子類NSDateFormatter和NSNumberFormatter都伪。 使用這些類,用戶可以在文本字段中輸入以下值:
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 label
的text
屬性哲嘲。
有關(guān)NSDateFormatter
和NSNumberFormatter的詳細(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-8
中 textViewShouldEndEditing:的實(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 field
的leftView
或rightView
屬性。 您可以控制在編輯會(huì)話期間何時(shí)顯示疊加視圖 - 例如域醇,在用戶開始輸入文本之前或僅在用戶開始輸入文本之后 - 通過(guò)向leftViewMode或rightViewMode屬性分配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:代理方法中將leftView或rightView屬性設(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中的選擇
UITextViewDelegate
的textViewDidChangeSelection:方法允許您跟蹤用戶在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)注~~~
`