UITextView委托方法

我试图让委托方法与UITextView一起工作,但由于某种原因,它不工作。

我已经在我的viewController.h声明它是一个UITextViewDelegate

我试图得到以下代码工作,当我点击textView擦除默认代码“文本”。

- (void)textViewDidBeginEditing:(UITextView *)textView { if (myTextView.text == @"TEXT") { [myTextView setText:@""]; } NSLog(@"did begin editing"); } 

我希望文本被清除,并看到NSLog打印,当我点击textView和键盘出现。 没有任何事情发生


通过这种方式使用文本视图,因为我需要根据其内容大小来缩放视图,似乎textView具有contentSize属性,而whit label和textField则不会。

更新:

我应该使用:

 if ([myTextView.text isEqualToString:@"TEXT"]) { [myTextView setText:@""]; } 

这里是项目,如果你想看看。

您的Test2ViewController.m文件中缺less此方法:

 - (void)viewDidLoad { [myTextView setDelegate:self]; } 

或者你也可以在Interface Builder中连接委托,如果你更喜欢这种方式的话。

更新#1:

添加这个方法给你的类来控制return键。

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([text isEqualToString:@"\n"]) { NSLog(@"Return pressed, do whatever you like here"); return NO; // or true, whetever you's like } return YES; } 

在Interface Builder中将TextView的委托连接到父类。 我喜欢在IB中使用连接而不是编码。 对我来说,更less的代码来看看更好:)。 另外 – 不要用这种方式比较string。 使用isEqualToString进行string比较:

 if ([myTextView.text isEqualToString:@"TEXT"]) { [myTextView setText:@""]; } 

连接图

这是固定的项目:

你的UITextview需要被告知它的委托方法在哪里

如果您通过界面生成器添加它,然后简单地连接代表

或者如果通过代码

 [yourTextViewOutlet setDelegate:self]; 

我想我原则上有一个很好的解决办法:

将UITextView的委托设置为self,然后创build自己的委托 – 重新使用相同的名称。 这允许你拦截代表,没有任何与外部不同的东西

 @interface TTGTextView : UITextView<UITextViewDelegate>// UIPlaceHolderTextView @property(nonatomic, assign) id<UITextViewDelegate> delegate; @synthesize delegate = realDelegate; 

然后继续拦截方法。 请注意,你需要覆盖所有这些,否则他们不会对“真正”的代表作出反应

 -(void)textViewDidBeginEditing:(UITextView *)textView { if ([realDelegate respondsToSelector:@selector(textViewDidBeginEditing:)]) [realDelegate textViewDidBeginEditing:textView]; /*YOUR CODE HERE*/ } -(void)textViewDidChange:(UITextView *)textView { if ([realDelegate respondsToSelector:@selector(textViewDidChange:)]) [realDelegate textViewDidChange:textView]; /*YOUR CODE HERE*/ } -(void)textViewDidChangeSelection:(UITextView *)textView { if ([realDelegate respondsToSelector:@selector(textViewDidChangeSelection:)]) [realDelegate textViewDidChangeSelection:textView]; /*YOUR CODE HERE*/ } -(void)textViewDidEndEditing:(UITextView *)textView { if ([realDelegate respondsToSelector:@selector(textViewDidEndEditing:)]) [realDelegate textViewDidEndEditing:textView]; /*YOUR CODE HERE*/ } - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([realDelegate respondsToSelector:@selector(textView:shouldChangeTextInRange:replacementText:)]) return [realDelegate textView:self shouldChangeTextInRange:range replacementText:text]; return YES; } -(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange { if ([realDelegate respondsToSelector:@selector(textView:shouldInteractWithTextAttachment:inRange:)]) return [realDelegate textView:self shouldInteractWithURL:URL inRange:characterRange]; return YES; } - (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)range { if ([realDelegate respondsToSelector:@selector(textView:shouldInteractWithTextAttachment:inRange:)]) return [realDelegate textView:textView shouldInteractWithTextAttachment:textAttachment inRange:range]; return YES; } 

其中一些方法正确开火,其他一些方法根本不为我开火,但立即出现在“真正的”代表身上。 但这是一个起点。 我想一个更稳固和一般的方法是做一些多路复用器 – 使其成为一个UITableViewDelegate持有一个委托arrays火。

在你的观点上沮丧。 如果您使用TextField,则应将.header文件中的UITextFieldDelegate作为代理使用,如下所示。

 @interface ExamPageViewController : UIViewController <UITextFieldDelegate> 

比我们可以使用UITextFieldDelegate方法。 你可以看到;

 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [self.questionAnswerTextField resignFirstResponder]; return YES; } -(void)textFieldDidBeginEditing:(UITextField *)textField { if ([textField.text isEqualToString:@"Sorunun cevabını buraya yazınız!"]) { textField.text = @""; } } - (void)textFieldDidEndEditing:(UITextField *)textField { if ([textField.text isEqualToString:@""]) { textField.text = @"Sorunun cevabını buraya yazınız!"; } } 

否则,你应该使用UITextViewDelegate作为下面的代码片段的委托。

 @interface ExamPageViewController : UIViewController <UITextViewDelegate> 

而我们可以在.m文件中使用这些委托方法

 - (BOOL)textViewShouldReturn:(UITextView *)textField { [self.questionAnswerTextField resignFirstResponder]; return YES; } -(void)textViewDidBeginEditing:(UITextView *)textField { if ([textField.text isEqualToString:@"Sorunun cevabını buraya yazınız!"]) { textField.text = @""; } } - (void)textViewDidEndEditing:(UITextView *)textField { if ([textField.text isEqualToString:@""]) { textField.text = @"Sorunun cevabını buraya yazınız!"; } }