iOS SDK基礎:UITextView和UITextViewDelegate
我們計劃創建UITextView,實現UITextViewDelegate協議方法,使用NSLog檢查該方法何時被調用。我們還會接觸到如何在TextView中限制字符的數量,以及如何使用return鍵隱藏keyboard。看看如何在你的app中實現這些功能。
第一步:創建一個新的Xcode項目
運行Xcode,依次點擊File > New > Project,然后在左邊點擊iOS下面的"Application",右邊選中"Single View Application",然后點擊“next”。
接下來如圖中所示,在"Product Name"這一欄鍵入 "TextViewARC",并在Company Identifier中填入一個值,例如"com.companyName." 。在“Device Family”列表中選擇“iPhone”。不要勾 選 "Use Storyboards" 和 "Include Unit Tests" ,勾選 上"UseAutomatic Reference Counting" 。在點擊下一步之前,核 對"Use Automatic Reference Counting",然后點擊next,并選擇一個位置來存儲工程,然后點擊“create”.
第二步:創建UITextView
UITextView的創建可以通過純代碼或者使用 Interface Builder工具來完成,接下來我們主要介紹如何通過這兩種方法來創建一個UITextView。
通過代碼創建
點擊“ViewController.m”文件,然后輸入以下代碼:
- CGRect textViewFrame = CGRectMake(20.0f, 20.0f, 280.0f, 124.0f);
- UITextView *textView = [[UITextView alloc] initWithFrame:textViewFrame];
- textView.returnKeyType = UIReturnKeyDone;
- [self.view addSubview:textView];
這樣創建了一個UITextView對象,并且添加到ViewController視圖中。
使用Interface Builder
你可以在.xib文件中創建UITextView。在Xcode的"Navigator"面板中點 擊 .xib文件,在左側文檔大綱"Document Outline"中點擊"View"。在菜單中點擊 View > Utilities > 展示Object Library。移至Object library的底部左下角,找 到"Text View",點擊選中,拖放至text view,調整text view位置至頂端, 高度修改為125像素。
第三步:隱藏鍵盤
隱藏鍵盤的方法很多,下面我們給出的代碼僅是其中的一種方法。點擊“ViewController.m”文件,添加以下方法來實現:
- - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
- NSLog(@"touchesBegan:withEvent:");
- [self.view endEditing:YES];
- [super touchesBegan:touches withEvent:event];
- }
第四步:Delegate Protocol Methods
簡單說,一個委托協實現兩個對象之間的相互通信,在UITextViewDelegate方法中,當特定事件發生時,UITextView就可以傳遞協議, 比如text view開始編輯時。當方法被傳遞時,你就可以在協議中做自己的一些處理。以下例子演示下如何實現UITextView委托協議方法。
在實現delegate方法之前,為了將viewcontroller對象設置為uitextview的delegate,我們把textview的 delegate屬性設置為self。點擊“ViewController.m”文件,在viewDidLoad方法中,在 [self.view addSubview:textView];上面添加以下代碼:
- textView.delegate = self;
使用Interface Builder,點擊"ViewController.xib"文件,選擇text view,點擊 View > Utilities > Show Connections Inspector。 在 "Connections Inspector"中點擊"Outlets"來打開它。點擊頁面上"delegate"向對面的圓圈,然后單擊該圓圈并 將其拖至“File‘s Owner”,以在text view和viewcontroller之間建立好連接。然后點擊 “ViewController.h”,輸入以下代碼以遵循UITextViewDelegate protocol。
- @interface ViewController : UIViewController <UITextViewDelegate>
UITextView委托協議方法是可選的,也就是說使用UITextViewDelegate協議,但是不一定非得實現相關的協議方法。下邊是在它們上邊添加的方法。
- textViewShouldBeginEditing: and textViewDidBeginEditing:
點擊“ViewController.m”文件,添加以下代碼:
- - (BOOL)textViewShouldBeginEditing:(UITextView *)textView{
- NSLog(@"textViewShouldBeginEditing:");
- return YES;
- }
- - (void)textViewDidBeginEditing:(UITextView *)textView {
- NSLog(@"textViewDidBeginEditing:");
- textView.backgroundColor = [UIColor greenColor];
- }
在text view獲得焦點之前會調用textViewShouldBeginEditing: 方法。當text view獲得焦點之后,并且已經是第 一響應者(first responder),那么會調用textViewDidBeginEditing: 方法。當text view獲得焦點時要想 做一些自己的處理,那么就在這里進行。在
我們的示例中,當text view獲得焦點時,是把text view的背景色設置為綠色.
- textViewShouldEndEditing: and textViewDidEndEditing:
在之前的方法中加入以下代碼
- - (BOOL)textViewShouldEndEditing:(UITextView *)textView{
- NSLog(@"textViewShouldEndEditing:");
- textView.backgroundColor = [UIColor whiteColor];
- return YES;
- }
- - (void)textViewDidEndEditing:(UITextView *)textView{
- NSLog(@"textViewDidEndEditing:");
- }
當text view失去焦點之前會調用textViewShouldEndEditing。在示例中,我們使用textViewShouldEndEditing:讓背景色返回最初的顏色。
- textView:shouldChangeCharactersInRange:replacementString
在之前的方法中加入以下代碼:
- - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
- NSCharacterSet *doneButtonCharacterSet = [NSCharacterSet newlineCharacterSet];
- NSRange replacementTextRange = [text rangeOfCharacterFromSet:doneButtonCharacterSet];
- NSUInteger location = replacementTextRange.location;
- if (textView.text.length + text.length > 140){
- if (location != NSNotFound){
- [textView resignFirstResponder];
- }
- return NO;
- }
- else if (location != NSNotFound){
- [textView resignFirstResponder];
- return NO;
- }
- return YES;
- }
每次用戶通過鍵盤輸入字符時,在字符顯示在text view之 前,textView:shouldChangeCharactersInRange:replacementString方法會被調用。這個方法中可以 方便的定位測試用戶輸入的字符,并且限制用戶輸入特定的字符。在上面的代碼中,我使用done鍵來隱藏鍵盤:通過檢測看replacement文本中是否包含newLineCharacterSet任意的字符。
如果有一個字符是來自newLineCharacterSet的,那么說明done按鈕被按過了,因此應該將鍵盤隱藏起來。另外,在用戶每次輸入內容時,還 檢測text view當前文本內容的長度,如果大于140個字符,則返回NO,這樣text view就可以限制輸入140個字符了。
- textViewDidChangeSelection:
在之前的方法中加入以下代碼:
- - (void)textViewDidChangeSelection:(UITextView *)textView{
- NSLog(@"textViewDidChangeSelection:");
- }
只有當用戶修改了text view中的內容時,textViewDidChange:方法才會被調用。在該方法中,可以對用戶修改了text view中 的內容進行驗證,以滿足自己的一些實際需求。例如,這里有一個應用場景:當text view限制最多可以輸入140個字符時,此時,在用戶修改文本內容 時,你希望顯示出還可以輸入多少個字符。那么每次文本內容被用戶修改的時候,更新并顯示一下剩余可輸入的字符個數即可。
- textViewDidChangeSelection:
在之前的方法中加入以下代碼:
- - (void)textViewDidChangeSelection:(UITextView *)textView{
- NSLog(@"textViewDidChangeSelection:");
- }
當用戶選擇text view中的部分內容,或者更改文本選擇的范圍,或者在text view中粘貼入文本時,函數textViewDidChangeSelection:將會被調用。該方法一般不使用,不過在某些情況下,非常有用。
第五步:測試Text Views
點擊Product>Run,或者點擊左上角的"Run",然后打開console窗口,并在text view中做一些字符輸入,刪除操作。當delegate方法被調用時,NSLog會打印出相應的字符串。
在模擬器上展示text view