2015-05-24 112 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

相關問題