6

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

根据文件,我发现了关于UIResponder.

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

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

但由于某种原因,它似乎永远不会开火。我可以让 select 语句正常工作并跟踪数据。

-(void) select:(id)sender

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

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

谢谢。

4

4 回答 4

3

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

于 2009-07-15T13:54:51.257 回答
3

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

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

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

于 2009-07-26T11:48:06.107 回答
2

如果有人仍然需要简短而简单的解决方案,我会分享我的。我使用来自REKit 项目的精彩 NSObject+REResponder 类别。解决方案就这么简单:

- (void)hookMessageTextFieldPasteAction
{
    void (^textFieldDidPasteBlock)(id receiver, id sender) = ^(id receiver, id sender)
    {
        NSLog(@"paste hook");
    };
    [self.messageTextField respondsToSelector:@selector(paste:) withKey:nil usingBlock:textFieldDidPasteBlock];
}
于 2013-04-10T18:42:19.163 回答
1

是的,根据此处引用的 Apple 文档,您的上述粘贴代码是正确的。

- (void)paste:(id)sender

我怀疑你在错误的文件中实现它。您应该在属于 1st Responder 链的文件中实现它。您是否将 UITextView 子类化了,或者您是否在 ViewController 中使用了普通的 UITextView?

嗯,我认为问题在于您可能需要让您的 UITextView 子类成为委托,以便委托方法能够工作,因为从外观上看它不是。我会试着找出我以前是怎么做到的。

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

@interface mySpecialTextFieldClass : NSObject <UITextFieldDelegate>
{

}

将其添加到末尾应该可以,试一试!它的作用是使您的子类成为委托可以向其发送通知的类型的对象……这是多态性,除非有人想在这里纠正我:)

最后一件事要尝试 John,在包含 IBOutlet 到 UITextView 的 ViewController 中,尝试在 UITextView 的实例上调用此方法:

[myUITextView setDelegate:self];

只是为了在那里扔一些完全随机的东西,尝试将其设置为第一响应者。

[myUITextView becomeFirstResponder];

这就是所谓的黑暗小子编程!并且是一种非常糟糕的编程方式,但我承认我这样做了,有时它会得到回报:P 大声笑。

于 2009-07-14T06:04:06.907 回答