我正在尝试使用UITextView处理委托方法,但由于某种原因它无法正常工作。
我在viewController.h中声明它是一个UITextViewDelegate
当我点击textView时,我试图让以下代码擦除默认代码“TEXT”。
- (void)textViewDidBeginEditing:(UITextView *)textView {
if (myTextView.text == @"TEXT") {
[myTextView setText:@""];
}
NSLog(@"did begin editing");
}
当我点击textView并出现键盘时,我希望清除文本并查看NSLog打印。什么都没发生
顺便使用文本视图,因为我需要根据内容大小缩放视图,似乎textView有一个contentSize属性,whit标签和textField没有。
更新:
我应该使用:
if ([myTextView.text isEqualToString:@"TEXT"]) {
[myTextView setText:@""]; }
答案 0 :(得分:7)
Test2ViewController.m 文件中缺少此方法:
- (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;
}
答案 1 :(得分:2)
将Interface Builder中TextView的委托连接到父类。我喜欢在IB中使用连接而不是编码。对我来说代码越少越好:)。另外 - 不要那样比较字符串。使用isEqualToString进行字符串比较:
if ([myTextView.text isEqualToString:@"TEXT"]) {
[myTextView setText:@""];
}
Here是固定项目:
答案 2 :(得分:2)
我认为原则上我有一个很好的解决方案:
将UITextView的委托设置为self,然后创建自己的委托 - 重新使用相同的名称。这允许您拦截代表,而不会有任何与外部不同的内容
@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;
}
有些方法可以正常射击,其他方法根本不会为我射击,但会立即出现在&#34;真实&#34;代表。但这是一个起点。我想一个更加坚实和通用的方法是制作某种多路复用器 - 使它成为一个UITableViewDelegate,它包含一组代表来触发。
答案 3 :(得分:1)
您的UITextview需要告知其委托方法的位置......
如果您通过界面构建器添加它,则只需连接代理
或通过代码
[yourTextViewOutlet setDelegate:self];
答案 4 :(得分:1)
对视图有所了解。 如果你使用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!";
}
}