【iOS開發】設定textView的預設提示文字
阿新 • • 發佈:2019-02-01
最近專案中需要用到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函式:
初始化的時候把label的內容設定一下。注意這個label是新增在textView裡面的,我除錯了一下 起始位置(3,3)是個還算不錯的位置。注意要把label設定成不可點選。- (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]; }
textView的代理:
//TextView Delegate
- (void) textViewDidChange:(UITextView *)textView{
if ([textView.text length] == 0) {
[label setHidden:NO];
}else{
[label setHidden:YES];
}
}