2016-11-13 49 views
0

我改变表格视图节标题的最后一个字符的颜色和我得到的iOS 9+一个奇怪的结果,迅速3.可变的字符串的颜色变化改变字符显示为方形

的最后一个字符是复选标记✔︎,颜色是绿色。结果是绿色正方形而不是绿色复选标记。如果我打印控制台复选标记显示正确。如果我删除颜色变化,它会显示复选标记(黑色)。如果我使用另一个符号,如双重感叹号,它工作得很好。

简化的代码

struct PersonConstants{ 
    static let DEFAULT_STATUS_INDEX : Int = 1 
    static let validStatus : NSArray = ["✔︎","?","‼"] 
} 

let colorsArray = [ 
    UIColor(red: 29/255.0, green:166/255.0, blue:47/255.0, alpha:1.0), 
    UIColor(red: 0/255.0, green: 0/255.0, blue: 255/255.0, alpha: 1.0), 
    UIColor(red: 225/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0), 
] 

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?{ 
    var title = String(Safe.count) + " " 
    title += NSLocalizedString("Accounted", comment: "") 
    title += ": " + String(PersonConstants.validStatus[0] as! NSString) 
    return title 
} 

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { 
    if let view = view as? UITableViewHeaderFooterView { 
     view.textLabel!.textColor = UIColor.black 
     view.textLabel!.font = UIFont.italicSystemFont(ofSize: 17.0) 

     myMutableString = NSMutableAttributedString(string: view.textLabel!.text! as String) 

     if sectionTwo.count > 0{ 
      myMutableString.addAttribute(NSForegroundColorAttributeName, value: colorsArray[0], range: NSRange(location: (view.textLabel!.text!).characters.count-1,length:1)) 
      view.textLabel!.attributedText = myMutableString 
      //print(myMutableString.string) 
     }else{ 
      view.textLabel!.text = "" 
     } 
    } 
} 

坏的结果

enter image description here

+2

'String(PersonConstants.val idStatus [0] as! NSString)''拿一个'String',把它变成一个'NSString',然后用它来创建一个'String'.Wut。 – Alexander

回答

1

钍因为NSMutableAttributedString与基于UTF-16的偏移量和计数一起工作,所以您需要通过基于UTF-16的NSRange来获取NSMutableAttributedString的属性。

这不是一个简单的任务,在斯威夫特3做...

let text = view.textLabel!.text ?? "" 
let lastCharIndex = text.index(before: text.endIndex) 
let lastCharUTF16Index = lastCharIndex.samePosition(in: text.utf16) 
let location = text.utf16.startIndex.distance(to: lastCharUTF16Index) 
let length = lastCharUTF16Index.distance(to: text.utf16.endIndex) 
myMutableString.addAttribute(NSForegroundColorAttributeName, value: colorsArray[0], 
          range: NSRange(location: location, length: length)) 

顺便说一句,如果你声明你的validStatus为:

static let validStatus: [String] = ["✔︎","?","‼"] 

你可以让其他部位您的代码更简单:

title += ": " + PersonConstants.validStatus[0] 
+0

谢谢!你的解释和例子有很多帮助。数组调用以及干杯 –