2015-05-24 108 views
1

我试图更改以@开头的特定单词的颜色,但是我在下面的代码中收到错误。更改字符串中特定单词的颜色

从我可以看到它似乎是范围变量的东西。

我得到以下错误:

cannot invoke 'addAttribute' with an argument list of type (String, value: UIColor, range Range?)

代码:

var messageMutableString = NSMutableAttributedString(string: message, attributes: [NSFontAttributeName:UIFont(name: "PT Sans", size: 13.0)!]) 

var words = message.componentsSeparatedByString(" ") 

for word in words { 
    if word.hasPrefix("@") { 
     var range = message.rangeOfString(word) 
     messageMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor(rgba: "#B52519"), range: range) 
    } 
} 

回答

2

与其将字符串拆分为组件,我会使用正则表达式搜索来查找以@开头的字符串的范围,然后应用该颜色。以下是一个工作示例:

extension String { 

    public func getMatches(regex: String, options: NSStringCompareOptions?) -> [Range<String.Index>] { 
     var arr = [Range<String.Index>]() 
     var rang = Range(start: self.startIndex, end: self.endIndex) 
     var foundRange:Range<String.Index>? 

     do 
     { 
      foundRange = self.rangeOfString(regex, options: options ?? nil, range: rang, locale: nil) 

      if let a = foundRange { 
       arr.append(a) 
       rang.startIndex = foundRange!.endIndex 
      } 
     } 
      while foundRange != nil 
     return arr 
    } 

} 


let message = "hello @you how are @you today?" 
let matches = message.getMatches("@[^ ]{1,}", options: NSStringCompareOptions.RegularExpressionSearch) 
let messageMutableString = NSMutableAttributedString(string: message, attributes: [NSFontAttributeName:UIFont(name: "Helvetica", size: 13.0)!]) 
for m in matches { 
      messageMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange(location:distance(message.startIndex,m.startIndex),length:distance(m.startIndex,m.endIndex))) 

} 
messageMutableString // string with added attributes 

范围问题在下面解决:NSRange(location:distance(message.startIndex,m.startIndex),length:distance(m.startIndex,m.endIndex))。范围和NSRange不可互换,您必须满足其中一个或另一个的要求。使用distance()可以检索所需的Int值以实例化NSRange。

+0

为什么这比我所做的更好:)? –

+1

有几个原因,虽然它们都不可逾越,但首先假定每个单词在字符串中都是唯一的,因为rangeOfString:“查找并返回给定字符串在接收方中第一次出现的范围。”其次,使用正则表达式提供了灵活性,通过简单地改变匹配所基于的字符串来在发现的词语中不包括逗号,全站等。 – sketchyTech

3

addAttribute需要一个NSRange。尝试使用以下内容:

let range = (message as NSString).rangeOfString(word) 

p.s.如果可能,最好使用let,而不是var