ios – 如何让UITextView检测主题标签?

我知道UITextView默认可以检测到URL,但是如何让它检测到hashtags(#)?

它不需要在键入时检测主题标签,但是然后viewDidLoad文本在UITextView中设置,所以我想将主题标签检测为颜色或其他东西.

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

解决方法

这应该适合你

>使用任何名称创建一个新的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,range: matchRange)
                }

            }
        }

        // we're used to textView.text
        // but here we use textView.attributedText
        // again,// so remember to re-add them in the attrs dictionary above
        self.attributedText = attrString
    }
}

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...