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
    }
}

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...