1. 程式人生 > >【iOS開發】設定textView的預設提示文字

【iOS開發】設定textView的預設提示文字

最近專案中需要用到textView,但是在用的時候才發現原來textView沒有類似於textField的那種placeholder功能。

所謂placeholder就比如使用者看到一個輸入框,然後輸入框裡面一般會有幾個淺灰色的文字,告訴使用者這個地方是用來寫什麼內容的,當用戶開始輸入的時候,這幾個文字就自然而然地消失了。這幾個文字就是'Placeholder'。
網上搜了一下,有一種方式是使用代理;在.m檔案中實現textview delegate的兩個方法:

(BOOL) textViewShouldBeginEditing:(UITextView *)textView
{
    if(textView.tag == 0) {
        textView.text = @"";
        textView.textColor = [UIColor blackColor];
        textView.tag = 1;
    }
    return YES;
}
- (void)textViewDidChange:(UITextView *)textView
{
   if([textView.text length] == 0)
   {
       textView.text = @"Foobar placeholder";
       textView.textColor = [UIColor lightGrayColor];
       textView.tag = 0;
   }
}

Tip:使用textView的代理需要在標頭檔案中加入: <UITextViewDelegate>

這種方法確實可以實現我們想要的功能,但是有一個很明顯的bug:如果使用者輸入了幾個字以後,想全部刪除了重新輸入內容,那就會發現你永遠都沒法刪除乾淨,因為當你把最後一個字後,textViewDidChange方法就監測到textView.text的 length = 0了 於是就會自動幫你不上你想要顯示的placeholder。。。可以腦補下那個畫面,瘋狂地刪除,卻怎麼也刪不乾淨。

然後就採用了另外的方法,就是新增一個label,這個label裡面寫入你想要顯示的placeholder,然後還是在textViewDidChange方法裡面,如果當前的text長度為0,就把label顯示出來,否則的話,就把Label隱藏了。

把我的程式裡面和這部分內容相關的摘出來吧:

.h檔案

@interface FeedbackViewController : UIViewController<UITextViewDelegate,UIAlertViewDelegate>

@propert(strong,nonatomic) IBOutlet UITextView *textView;

@end
.m檔案

viewDidLoad函式:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
   
    label = [[UILabel alloc]initWithFrame:CGRectMake(3, 3, 200, 20)];
    label.enabled = NO;
    label.text = @"在此輸入反饋意見";
    label.font =  [UIFont systemFontOfSize:15];
    label.textColor = [UIColor lightGrayColor];
    [self.textView addSubview:label];
}
初始化的時候把label的內容設定一下。注意這個label是新增在textView裡面的,我除錯了一下 起始位置(3,3)是個還算不錯的位置。注意要把label設定成不可點選。

textView的代理:

//TextView Delegate
- (void) textViewDidChange:(UITextView *)textView{
    if ([textView.text length] == 0) {
        [label setHidden:NO];
    }else{
        [label setHidden:YES];
    }
}