0

使用 TextView 进行用户消息输入,在用户编辑期间它是可编辑和可选择的。字段下方的按钮之一,在编辑和哈希标记模式之间切换 TextView。当切换到标记时,TextView 禁用了它的可编辑和可选属性,并且我有一个功能来检测点击并返回文本中的字符位置。

我需要确定点击的单词(如果有),并通过在 UITextView.text 中添加前缀来修改该单词 # 除非它已经有两个哈希值,否则它会删除哈希值。我正在为逻辑使用正则表达式。

我还没有找到一种高级方法来确定被点击的字符的单词。我已经搜索了Apple的Dev。库。以及像 raywenderlich 和 Grok Swift 这样的网站,但找不到我确定必须存在的方法。

我可以通过测试当前字符是否是有效的单词分隔符来实现,如果不是,则减少字符索引并测试直到确定单词边界。此时,我返回之前的索引并测试#字符,如果是#,我会测试下一个字符,如果不是#,我会在开头添加#字符这个词的。

UIKit、TextKit 或 UITextView 或 NSTextStorage 的方法中是否有一个函数可以返回被点击字符的单词和该单词的 NSRange?另外,将 # 添加到 TextView 文本的正确方法是什么?[textView:shouldChangeTextInRange:replacementText 或 textView.textStorage:replaceCharactersInRange:withString:]

我曾在 PC、PlayStation 和 GameBoy 上进行过商业工作,但这是第一次开发应用程序并使用 iPhone/Mac 平台,所以我真的可以参考建议。

4

2 回答 2

0

为了检测 # 你需要调用委托中的代码 shouldChangeCharactersInRange

    let stringprocess = stringfordetecting.text
     let tok =  stringprocess!.componentsSeparatedByString(" ")
    for item in tok

    {
        let demo = String(item)

        if demo.hasPrefix("#") 
        {

        let range = (stringfordetecting.text! as NSString).rangeOfString(item)

        //add code

        }

        else
        {
         //add code    
        }

用于检测被点击的字符索引向 textview 添加一个访客

let tapGesture = UITapGestureRecognizer(target: self, action: "textTapped:")
    tapGesture.headline = indexPath
    tapGesture.numberOfTapsRequired = 1
    textview2.addGestureRecognizer(tapGesture)


func textTapped(recognizer: MyTapGestureRecognizer){

    let textView: UITextView = recognizer.view as! UITextView
    var layoutManager: NSLayoutManager = textView.layoutManager
    var location: CGPoint = recognizer.locationInView(textView)
    let position: CGPoint = CGPointMake(location.x, location.y)
    location.x -= textview2.textContainerInset.left
    location.y -= textview2.textContainerInset.top
    var charIndex: Int
    charIndex = layoutManager.characterIndexForPoint(location, inTextContainer: textview2.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    if charIndex < textview2.textStorage.length
            {

        print(charIndex)
            }

}

于 2016-11-10T07:05:27.707 回答
0

用于在 tapguesture 识别器功能内的文本视图中检测被敲击的字符

 func textTapped(recognizer: MyTapGestureRecognizer){

    let textView: UITextView = recognizer.view as! UITextView



    var layoutManager: NSLayoutManager = textView.layoutManager
    var location: CGPoint = recognizer.locationInView(textView)


    let position: CGPoint = CGPointMake(location.x, location.y)

location.x -= cell.messageLabel.textContainerInset.left
    location.y -= cell.messageLabel.textContainerInset.top

    var charIndex: Int
    charIndex = layoutManager.characterIndexForPoint(location, inTextContainer: cell.messageLabel.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    if charIndex < cell.messageLabel.textStorage.length {


        let stringprocess = textview.text


        let tok =  stringprocess.componentsSeparatedByString(" ")

       // let attributedString1 = NSMutableAttributedString(string:stringcheck as String)

        for item in tok

        {
            let demo = String(item)

            if demo.hasPrefix("@") {

                let range = (stringcheck as NSString).rangeOfString(item)



                var i = range.location
                while i <= range.location+range.length

                {
                    if i == charIndex

                    {
                        print(demo)

                }

                    i++

                }




            }



         }
        }
于 2016-11-10T08:57:28.053 回答