UITextView委托方法

时间:2012-08-06 08:48:10

标签: iphone ios xcode uitextview

我正在尝试使用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:@""]; }

here is the project if you want to take a look.

5 个答案:

答案 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:@""];
}

Connection Pic

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!";
    }
}