Objective-c 中有三个 UITextView 时如何使用 UITextView 委托
How to use UITextView delegate when there are three UITextViews in Objective-c
创建 UITextView
//Text View 1
textview1.layer.borderWidth = 1.0f;
textview1.layer.borderColor = [[UIColor blackColor] CGColor];
textview1.delegate = self;
UIToolbar* doneToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
doneToolbar.barStyle = UIBarStyleBlackTranslucent;
doneToolbar.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(donedescButtonClickedDismissKeyboard)],
nil];
[doneToolbar sizeToFit];
textview1.inputAccessoryView = doneToolbar;
//Text View 2
textview2.layer.borderWidth = 1.0f;
textview2.layer.borderColor = [[UIColor blackColor] CGColor];
textview2.delegate = self;
UIToolbar* doneToolbarmeasure = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
doneToolbarmeasure.barStyle = UIBarStyleBlackTranslucent;
doneToolbarmeasure.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(donemeasureButtonClickedDismissKeyboard)],
nil];
[doneToolbarmeasure sizeToFit];
textview2.inputAccessoryView = doneToolbarmeasure;
//Text View 3
textview3.layer.borderWidth = 1.0f;
textview3.layer.borderColor = [[UIColor blackColor] CGColor];
textview3.delegate = self;
UIToolbar* doneToolbarreportdesc = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
doneToolbarreportdesc.barStyle = UIBarStyleBlackTranslucent;
doneToolbarreportdesc.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(donereportdescButtonClickedDismissKeyboard)],
nil];
[doneToolbarreportdesc sizeToFit];
textview3.inputAccessoryView = doneToolbarreportdesc;
委托和方法
-(void)donedescButtonClickedDismissKeyboard
{
[textview1 resignFirstResponder];
}
-(void)donemeasureButtonClickedDismissKeyboard
{
[textview2 resignFirstResponder];
}
-(void)donereportdescdamageButtonClickedDismissKeyboard
{
[textview3 resignFirstResponder];
}
- (void)textViewDidBeginEditing:(UITextView *)textView
{
textviewlbl1.hidden = YES;
textviewlbl2.hidden = YES;
textviewlbl3.hidden = YES;
}
- (void)textViewDidEndEditing:(UITextView *)textView
{
if(textview1.text.length == 0)
{
textviewlbl1.hidden = NO;
}
if(textview2.text.length == 0)
{
textviewlbl2.hidden = NO;
}
if(textview3.text.length == 0)
{
textviewlbl3.hidden = NO;
}
}
问题
当我点击一个 UITextView 时,所有三个标签都被隐藏,第二次点击时所有三个标签都被取消隐藏。
我需要将它们分别隐藏和取消隐藏。请帮忙!!
试试下面的代码
- (void)textViewDidEndEditing:(UITextView *)textView
{
if(textView.text.length == 0)
{
textView.hidden=NO;
}
}
这样使用if-condition
,
- (void)textViewDidBeginEditing:(UITextView *)textView
{
if (textView == textView1) {
}
if (textView == textView2) {
}
// and so on
}
您可以对所有三个文本视图使用相同的委托方法,例如
-(void)textViewDidBeginEditing:(UITextView *)textView {
if (textView == textview1) {
// Code for textview1
}
else if (textView == textview2) {
// Code for textview2
}
else if (textView == textview3) {
// Code for textview3
}
}
所以你的方法将是这样的:
- (void)textViewDidEndEditing:(UITextView *)textView
{
if(textView == textview1 && textview1.text.length == 0)
{
textviewlbl1.hidden=NO;
}
if(textView == textview2 && textview2.text.length == 0)
{
textviewlbl2.hidden=NO;
}
if(textView == textview3 && textview3.text.length == 0)
{
textviewlbl3.hidden=NO;
}
}
这样你就可以访问textview的所有delegate方法。只需通过其对象来区分 textview。其他一些委托方法是:
- (void)textViewDidChange:(UITextView *)textView;
- (void)textViewDidChangeSelection:(UITextView *)textView;
- (void)textViewDidEndEditing:(UITextView *)textView;
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange;
- (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)range;
您可以通过将 tag
设置为 UITextView
来实现
在您的 viewDidLoad
方法中设置标签:
textview1.tag=1;
textview2.tag=2;
textview3.tag=3;
现在您可以根据if-else
条件
隐藏和显示占位符标签
- (void)textViewDidBeginEditing:(UITextView *)textView
{
if (textView.tag==1)
{
textviewlbl1.hidden=YES;
}
else if (textView.tag==2)
{
textviewlbl2.hidden=YES;
}
else if (textView.tag==3)
{
textviewlbl3.hidden=YES;
}
}
- (void)textViewDidEndEditing:(UITextView *)textView
{
if (textView.tag==1)
{
if(textview1.text.length == 0)
{
textviewlbl1.hidden=NO;
}
}
else if (textView.tag==2)
{
if(textview2.text.length == 0)
{
textviewlbl2.hidden=NO;
}
}
else if (textView.tag==3)
{
if(textview3.text.length == 0)
{
textviewlbl3.hidden=NO;
}
}
}
委托对象是每个委托调用的参数,textView
在你的例子中:
- (void)textViewDidEndEditing:(UITextView *)textView
{
if (textView == textview1)
{
// work with textview1 here
}
else if (textView == textview2)
{
// work with textview2 here
}
}
textview1.tag=1;
textview2.tag=2;
textview3.tag=3;
给这三个textview一个标识不同textview的标签。
创建 UITextView
//Text View 1
textview1.layer.borderWidth = 1.0f;
textview1.layer.borderColor = [[UIColor blackColor] CGColor];
textview1.delegate = self;
UIToolbar* doneToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
doneToolbar.barStyle = UIBarStyleBlackTranslucent;
doneToolbar.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(donedescButtonClickedDismissKeyboard)],
nil];
[doneToolbar sizeToFit];
textview1.inputAccessoryView = doneToolbar;
//Text View 2
textview2.layer.borderWidth = 1.0f;
textview2.layer.borderColor = [[UIColor blackColor] CGColor];
textview2.delegate = self;
UIToolbar* doneToolbarmeasure = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
doneToolbarmeasure.barStyle = UIBarStyleBlackTranslucent;
doneToolbarmeasure.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(donemeasureButtonClickedDismissKeyboard)],
nil];
[doneToolbarmeasure sizeToFit];
textview2.inputAccessoryView = doneToolbarmeasure;
//Text View 3
textview3.layer.borderWidth = 1.0f;
textview3.layer.borderColor = [[UIColor blackColor] CGColor];
textview3.delegate = self;
UIToolbar* doneToolbarreportdesc = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
doneToolbarreportdesc.barStyle = UIBarStyleBlackTranslucent;
doneToolbarreportdesc.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(donereportdescButtonClickedDismissKeyboard)],
nil];
[doneToolbarreportdesc sizeToFit];
textview3.inputAccessoryView = doneToolbarreportdesc;
委托和方法
-(void)donedescButtonClickedDismissKeyboard
{
[textview1 resignFirstResponder];
}
-(void)donemeasureButtonClickedDismissKeyboard
{
[textview2 resignFirstResponder];
}
-(void)donereportdescdamageButtonClickedDismissKeyboard
{
[textview3 resignFirstResponder];
}
- (void)textViewDidBeginEditing:(UITextView *)textView
{
textviewlbl1.hidden = YES;
textviewlbl2.hidden = YES;
textviewlbl3.hidden = YES;
}
- (void)textViewDidEndEditing:(UITextView *)textView
{
if(textview1.text.length == 0)
{
textviewlbl1.hidden = NO;
}
if(textview2.text.length == 0)
{
textviewlbl2.hidden = NO;
}
if(textview3.text.length == 0)
{
textviewlbl3.hidden = NO;
}
}
问题
当我点击一个 UITextView 时,所有三个标签都被隐藏,第二次点击时所有三个标签都被取消隐藏。 我需要将它们分别隐藏和取消隐藏。请帮忙!!
试试下面的代码
- (void)textViewDidEndEditing:(UITextView *)textView
{
if(textView.text.length == 0)
{
textView.hidden=NO;
}
}
这样使用if-condition
,
- (void)textViewDidBeginEditing:(UITextView *)textView
{
if (textView == textView1) {
}
if (textView == textView2) {
}
// and so on
}
您可以对所有三个文本视图使用相同的委托方法,例如
-(void)textViewDidBeginEditing:(UITextView *)textView {
if (textView == textview1) {
// Code for textview1
}
else if (textView == textview2) {
// Code for textview2
}
else if (textView == textview3) {
// Code for textview3
}
}
所以你的方法将是这样的:
- (void)textViewDidEndEditing:(UITextView *)textView
{
if(textView == textview1 && textview1.text.length == 0)
{
textviewlbl1.hidden=NO;
}
if(textView == textview2 && textview2.text.length == 0)
{
textviewlbl2.hidden=NO;
}
if(textView == textview3 && textview3.text.length == 0)
{
textviewlbl3.hidden=NO;
}
}
这样你就可以访问textview的所有delegate方法。只需通过其对象来区分 textview。其他一些委托方法是:
- (void)textViewDidChange:(UITextView *)textView;
- (void)textViewDidChangeSelection:(UITextView *)textView;
- (void)textViewDidEndEditing:(UITextView *)textView;
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange;
- (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)range;
您可以通过将 tag
设置为 UITextView
在您的 viewDidLoad
方法中设置标签:
textview1.tag=1;
textview2.tag=2;
textview3.tag=3;
现在您可以根据if-else
条件
- (void)textViewDidBeginEditing:(UITextView *)textView
{
if (textView.tag==1)
{
textviewlbl1.hidden=YES;
}
else if (textView.tag==2)
{
textviewlbl2.hidden=YES;
}
else if (textView.tag==3)
{
textviewlbl3.hidden=YES;
}
}
- (void)textViewDidEndEditing:(UITextView *)textView
{
if (textView.tag==1)
{
if(textview1.text.length == 0)
{
textviewlbl1.hidden=NO;
}
}
else if (textView.tag==2)
{
if(textview2.text.length == 0)
{
textviewlbl2.hidden=NO;
}
}
else if (textView.tag==3)
{
if(textview3.text.length == 0)
{
textviewlbl3.hidden=NO;
}
}
}
委托对象是每个委托调用的参数,textView
在你的例子中:
- (void)textViewDidEndEditing:(UITextView *)textView
{
if (textView == textview1)
{
// work with textview1 here
}
else if (textView == textview2)
{
// work with textview2 here
}
}
textview1.tag=1;
textview2.tag=2;
textview3.tag=3;
给这三个textview一个标识不同textview的标签。