UITextView粘贴方法覆盖

时间:2010-02-22 11:57:01

标签: iphone uitextview paste

我真的希望能够在UITextView中检测到粘贴事件,但是看起来无法做到这一点。

我最初尝试子类化UITextView并覆盖paste:方法,但它永远不会在粘贴事件上调用。

有没有人能够做到这一点?以前的同类问题在8月没有答案......

4 个答案:

答案 0 :(得分:1)

文本视图不会捕获paste:事件,因为实际的响应者不是文本视图,而是支持文本视图的私有Web视图(UIWebDocumentView)。

但是,在粘贴时,网络视图会调用文本视图(私有)-[UITextView keyboardInput:shouldInsertText:isMarkedText:],反过来调用文本视图的委托-textView:shouldChangeTextInRange:replacementText:

因此,您只需在文本视图的委托中实现-textView:shouldChangeTextInRange:replacementText:

(当然,正常的键盘输入也会触发这种方法。没有完美的方法来区分它们。)

答案 1 :(得分:1)

@KennyTM我为我的一个应用程序所做的是跟上当前文本长度和前一个文本长度。如果(currentTextLength - previousTextLength)大于1,则用户必须粘贴某些内容

答案 2 :(得分:0)

对于iOS 14 ,您必须分两部分执行此操作,以避免向用户显示您正在检查UIPasteboard的通知。就我而言,我不想对用户数据做任何不好的事情,但是当用户确实粘贴到UITextView中时,我确实想做一些特殊的格式化。

步骤1:创建自定义UITextView并覆盖paste()

import UIKit

protocol TouchableTextViewDelegate : class{
    func touchesDidBegin()
    func pasting()
}

class TouchableTextView: UITextView {
    weak var touchableDelegate : TouchableTextViewDelegate?

    
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        if self.isFirstResponder{
            return true
        }
        touchableDelegate?.touchesDidBegin()
        return false
    }
    
    override func paste(_ sender: Any?) {
        touchableDelegate?.pasting()
        super.paste(sender)
    }
    
}

第2步::在处理shouldChangeTextIn的文件位置中,创建一个变量,并确保设置TouchableTextView的委托。就我而言

//top of the view
var isPasting : Bool = false

//also when creating UITextView use both delegates
textView.touchableDelegate = self
//add the normal delegate
textView.delegate = self

extension SliderTextView : TouchableTextViewDelegate{
    func pasting() {
        self.isPaste = true
    }
    
    func touchesDidBegin() {
        sliderEditingDelegate?.touchesDidBegin(sliderTextView: self)
    }
}

第3步:在shouldChangeTextIn内部,我将这样处理操作

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
     let isPaste = self.isPaste
     //be sure to set this to false
     self.isPaste = false
     if isPaste,
        let pt = UIPasteboard.general.string,
        text.contains(pt){ 
        //you will see the paste notification and that is good for the user
        // but only when the user pastes
        // do whatever special thing or formatting you want to do

      }   
      return true
}

好处是,除非用户粘贴在UITextView中,否则您不会触发通知。

答案 3 :(得分:-1)

要检测用户是否在解析textView中的文本,请将shouldChangeTextInRange委托中的replacementText与用户当前在UIPasteboard中保存的文本进行比较。然后根据要求采取行动。

代码,请参阅以下问题中的答案:

how to know when text is pasted into UITextView