代码之家  ›  专栏  ›  技术社区  ›  John Ballinger

当用户单击uitextview中的粘贴按钮时检测

  •  6
  • John Ballinger  · 技术社区  · 15 年前

    我在尝试更改 UITextView . 我要实现的是:检测用户何时将某些文本粘贴到 UITExtVIEW . 当我检测到这一点时,我会检查数据并做我的事情。

    根据文件,我发现 UIResponder .

    所以我创建了一个简单的类来继承 UITExtVIEW . 在.m文件中,我创建了一个调用的函数。

    -(void) paste:(id)sender{
      NSLog(@"paste button was pressed do something");
    }
    

    但出于某种原因,它似乎永远不会着火。我可以得到select语句工作和跟踪数据。

    -(void) select:(id)sender
    

    1。这是在UITextView中检测粘贴的正确方法吗? 2。现在我正在跟踪Buy更改了多少个字符,如果它大于一个字符,那么我怀疑它可能是粘贴操作。但由于iPhone可以自动完成wedn(周三)等单词,因此它可能不是粘贴操作。

    在Interface Builder中,我在NIB文件中选择了我的textView,并选择了它的“类标识”来访问我之前几乎创建的类,我知道这个文件是作为一个子类工作的,但它不会响应粘贴事件。

    谢谢。

    4 回复  |  直到 9 年前
        1
  •  2
  •   Aouiaiauo Eyjaajeyio    12 年前

    如果有人仍然需要简单而简短的解决方案,我会分享我的。我使用的是来自 REKit project . 解决方案就这么简单:

    - (void)hookMessageTextFieldPasteAction
    {
        void (^textFieldDidPasteBlock)(id receiver, id sender) = ^(id receiver, id sender)
        {
            NSLog(@"paste hook");
        };
        [self.messageTextField respondsToSelector:@selector(paste:) withKey:nil usingBlock:textFieldDidPasteBlock];
    }
    
        2
  •  3
  •   lillian    15 年前

    UITextView有一个处理剪切、复制、粘贴的视图。这是uiwebdocumentview。因此,如果uitextview是第一个响应者,uiwebdocumentview将首先获取它,而不是您的实现。我想覆盖这些函数,所以这非常令人沮丧。

        3
  •  3
  •   Alin    15 年前

    同样的事情也发生在我身上。选择(有时复制)会被调用,但从不粘贴。

    我使用textviewdidchange模拟了行为,在这里我总是验证当前文本和前一个文本之间的差异。如果有更多不同的字母,并且text.length大于必须粘贴的字母。

    希望苹果能解决这个问题。

        4
  •  1
  •   Brock Woolf    15 年前

    是的,根据苹果的文档,你上面的粘贴代码是正确的。 here .

    - (void)paste:(id)sender
    

    我怀疑你在错误的文件中实现了它。您应该在第一个响应程序链的一个文件中实现它。您是否对uitextView进行了子类化,或者在视图控制器中使用的是普通视图?

    嗯,我认为问题是为了让委托方法工作,你可能需要让你的uitextview子类成为委托,因为它不是由事物的外观决定的。我会尽力找出我以前是怎么做到的。

    好吧,我想我找到了。我认为您需要在子类UItextfield类上执行此操作:

    @interface mySpecialTextFieldClass : NSObject <UITextFieldDelegate>
    {
    
    }
    

    最后再加上这个应该可以,试试看! 它的作用是使子类成为委托可以向其发送通知的类型的对象……这是多态性,除非有人想在此处更正我的错误:)

    最后一件要尝试john的事情是,在包含到uitextview的iboutlet的viewController中,尝试在uitextview的实例上调用此方法:

    [myUITextView setDelegate:self];
    

    只是把一些完全随机的东西扔进去,试着把它设置成第一反应者。

    [myUITextView becomeFirstResponder];
    

    这叫做暗中编程,孩子们!这是一个非常糟糕的编程方法,但我承认我这样做,有时它会有回报:P lol。