10

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

我在 viewController.h 中声明它是 UITextViewDelegate

当我点击 textView 时,我试图让以下代码工作以擦除默认代码“TEXT”。

- (void)textViewDidBeginEditing:(UITextView *)textView {

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

    NSLog(@"did begin editing");
}

当我点击 textView 并出现键盘时,我希望文本被清除并看到 NSLog 打印。什么都没有发生


顺便使用文本视图,因为我需要根据其内容大小缩放视图,并且似乎 textView 具有 contentSize 属性,而白色标签和 textField 则没有。

更新:

我应该使用:

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

如果您想看一下,这里是项目。

4

6 回答 6

8

您的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;
}
于 2012-08-06T08:52:52.943 回答
2

将 Interface Builder 中的 TextView 的委托连接到父类。我喜欢在 IB 中使用连接而不是对其进行编码。对我来说,代码越少越好:)。另外 - 不要那样比较字符串。使用 isEqualToString 进行字符串比较:

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

连接图片

是固定项目:

于 2012-08-06T08:50:18.957 回答
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;
}

一些方法正确触发,其他方法根本不为我触发,而是立即为“真正的”委托出现。但这是一个起点。我想一种更可靠和更通用的方法是制作某种多路复用器 - 使其成为 UITableViewDelegate ,其中包含要触发的委托数组。

于 2014-08-14T22:54:55.030 回答
1

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

如果您通过界面生成器添加它,那么只需连接代表

或者如果通过代码

[yourTextViewOutlet setDelegate:self];
于 2012-08-06T08:57:05.333 回答
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!";
    }
}
于 2016-10-28T08:14:41.840 回答
0

斯威夫特 4,5

将此扩展名写在控制器的底部。它可用于在 textView 中显示和隐藏占位符。

extension ViewController: UITextViewDelegate {
    func textViewDidBeginEditing(_ textView: UITextView) {
        if textView == yourTxtView {
            txtNote.text = ""
            txtNote.textColor = .black
        }
    }

    func textViewDidEndEditing(_ textView: UITextView) {
        if textView == yourTxtView {
            txtNote.text = "Note:"
            txtNote.textColor = .gray
        }
    }
}
于 2020-01-07T10:43:22.313 回答