当前位置:  开发笔记 > 编程语言 > 正文

如何让UITextView检测主题标签?

如何解决《如何让UITextView检测主题标签?》经验,为你挑选了2个好方法。

我知道UITextView默认可以检测到URL,但是我怎样才能检测到#tatata(#)?

它不需要在键入时检测主题标签,但随后viewDidLoad文本设置在UITextView,所以我想检测主题标签作为颜色或什么.

我一直在使用ActiveLabel,但这只是用于UILabel,我需要具有的滚动功能UITextView.



1> Erik Auranau..:

这应该适合你

    使用任何名称创建一个新的swift文件(UITextViewHashtagExtension.swift)

    在下面插入以下代码:

    import UIKit
    
    extension UITextView {
    
    func resolveHashTags(){
    
        // turn string in to NSString
        let nsText:NSString = self.text
    
        // this needs to be an array of NSString.  String does not work.
        let words:[NSString] = nsText.componentsSeparatedByString(" ")
    
        // you can't set the font size in the storyboard anymore, since it gets overridden here.
        let attrs = [
            NSFontAttributeName : UIFont.systemFontOfSize(17.0)
        ]
    
        // you can staple URLs onto attributed strings
        let attrString = NSMutableAttributedString(string: nsText as String, attributes:attrs)
    
        // tag each word if it has a hashtag
        for word in words {
    
            // found a word that is prepended by a hashtag!
            // homework for you: implement @mentions here too.
            if word.hasPrefix("#") {
    
                // a range is the character position, followed by how many characters are in the word.
                // we need this because we staple the "href" to this range.
                let matchRange:NSRange = nsText.rangeOfString(word as String)
    
                // convert the word from NSString to String
                // this allows us to call "dropFirst" to remove the hashtag
                var stringifiedWord:String = word as String
    
                // drop the hashtag
                stringifiedWord = String(stringifiedWord.characters.dropFirst())
    
                // check to see if the hashtag has numbers.
                // ribl is "#1" shouldn't be considered a hashtag.
                let digits = NSCharacterSet.decimalDigitCharacterSet()
    
                if let numbersExist = stringifiedWord.rangeOfCharacterFromSet(digits) {
                    // hashtag contains a number, like "#1"
                    // so don't make it clickable
                } else {
                    // set a link for when the user clicks on this word.
                    // it's not enough to use the word "hash", but you need the url scheme syntax "hash://"
                    // note:  since it's a URL now, the color is set to the project's tint color
                    attrString.addAttribute(NSLinkAttributeName, value: "hash:\(stringifiedWord)", range: matchRange)
                }
    
            }
        }
    
        // we're used to textView.text
        // but here we use textView.attributedText
        // again, this will also wipe out any fonts and colors from the storyboard,
        // so remember to re-add them in the attrs dictionary above
        self.attributedText = attrString
    }
    
    }
    


要使用它,您可以执行以下操作:

self.textView.text = "This is an #example test"
self.textView.resolveHashTags()

针对Swift 4.0进行了更新:

extension UITextView {

    func resolveHashTags() {

        // turn string in to NSString
        let nsText = NSString(string: self.text)

        // this needs to be an array of NSString.  String does not work.
        let words = nsText.components(separatedBy: CharacterSet(charactersIn: "#ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_").inverted)

        // you can staple URLs onto attributed strings
        let attrString = NSMutableAttributedString()
        attrString.setAttributedString(self.attributedText)

        // tag each word if it has a hashtag
        for word in words {
            if word.count < 3 {
                continue
            }

            // found a word that is prepended by a hashtag!
            // homework for you: implement @mentions here too.
            if word.hasPrefix("#") {

                // a range is the character position, followed by how many characters are in the word.
                // we need this because we staple the "href" to this range.
                let matchRange:NSRange = nsText.range(of: word as String)

                // drop the hashtag
                let stringifiedWord = word.dropFirst()
                if let firstChar = stringifiedWord.unicodeScalars.first, NSCharacterSet.decimalDigits.contains(firstChar) {
                    // hashtag contains a number, like "#1"
                    // so don't make it clickable
                } else {
                    // set a link for when the user clicks on this word.
                    // it's not enough to use the word "hash", but you need the url scheme syntax "hash://"
                    // note:  since it's a URL now, the color is set to the project's tint color
                    attrString.addAttribute(NSAttributedStringKey.link, value: "hash:\(stringifiedWord)", range: matchRange)
                }

            }
        }

        // we're used to textView.text
        // but here we use textView.attributedText
        // again, this will also wipe out any fonts and colors from the storyboard,
        // so remember to re-add them in the attrs dictionary above
        self.attributedText = attrString
    }
}


阿拉伯主题标签使该应用崩溃:((

2> Wez..:

一种选择是使用这样的NSAttributedString东西......

func convertHashtags(text:String) -> NSAttributedString {
    let attrString = NSMutableAttributedString(string: text)
    attrString.beginEditing()
    // match all hashtags
    do {
        // Find all the hashtags in our string
        let regex = try NSRegularExpression(pattern: "(?:\\s|^)(#(?:[a-zA-Z].*?|\\d+[a-zA-Z]+.*?))\\b", options: NSRegularExpressionOptions.AnchorsMatchLines)
        let results = regex.matchesInString(text,
            options: NSMatchingOptions.WithoutAnchoringBounds, range: NSMakeRange(0, text.characters.count))
        let array = results.map { (text as NSString).substringWithRange($0.range) }
        for hashtag in array {
            // get range of the hashtag in the main string
            let range = (attrString.string as NSString).rangeOfString(hashtag)
            // add a colour to the hashtag
            attrString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)
        }
        attrString.endEditing()
    }
    catch {
        attrString.endEditing()
    }
    return attrString
}

然后分配你attributedText喜欢这个......

let myText = "some text with a #hashtag in side of it #itsnoteasy"
self.textView.attributedText = convertHashtags(myText)


hashtag已经可以点击,因为我们将它添加到链接hash:hashtag.我们只需要添加textView.delegate = self并监听func textView(textView:UITextView,shouldInteractWithURL URL:NSURL,inRange characterRange:NSRange) - > Bool(我该如何格式化这段代码?)
我完全不知道.
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有