2017-01-19 2 views
0

Я пытаюсь добавить цвет к 2 словам в строке. Это код, я использую:Добавление цвета к слову в строке с использованием NSMutableAttributedString

 var HighScore:Int = 0 
     var CurrentScore:Int = 0 

     let stringOne = "You have managed to score \(CurrentScore). Current record is \(self.HighScore). Play again and give it another try!" 
     let stringTwo = "\(CurrentScore)" 
     let stringThree = "\(HighScore)" 

     let range1 = (stringOne as NSString).range(of: stringTwo) 
     let range2 = (stringOne as NSString).range(of: stringThree) 

     let attributedText = NSMutableAttributedString.init(string: stringOne) 

     attributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(netHex: 0x00b4ff) , range: range1) 
     attributedText.addAttribute(NSForegroundColorAttributeName, value: UIColor.init(netHex: 0x00b4ff) , range: range2) 

     gameOverDescriptionLabel.attributedText = attributedText 

У меня есть проблема в том, что если CurrentScore и HighScore одно и то же (например: 2 & 2) цвет на range2 все еще остается белым, но если они не равны (2 & 1 или 1 & 2) оба цвета, которые я выбрал.

Любые предложения?

ответ

1

Добавить это в верхней или нижней части .swift файла:

extension NSMutableAttributedString { 
    func bold(_ text:String) -> NSMutableAttributedString { 
     let attrs:[String:AnyObject] = [NSForegroundColorAttributeName: UIColor.init(netHex: 0x00b4ff)] 
     let boldString = NSMutableAttributedString(string:"\(text)", attributes:attrs) 
     self.append(boldString) 
     return self 
    } 

    func normal(_ text:String)->NSMutableAttributedString { 
     let normal = NSAttributedString(string: text) 
     self.append(normal) 
     return self 
    } 
} 

Чтобы закодировать ниже является использование, вы можете изменить его, как вы хотите, но я сделал это так, вы можно легко просто скопировать & вставить его в свой проект:

  let formattedString = NSMutableAttributedString() 
      formattedString 
       .normal("You have managed to score ") 
       .bold("\(CurrentScore)") 
       .normal(". Current record is ") 
       .bold("\(HighScore)") 
       .normal(". Play again and give it another try!") 

      gameOverDescriptionLabel.attributedText = formattedString 
+0

Работает как шарм. Благодаря!:))) –

1

Если текущий балл и высокий балл являются одной и той же строкой, поиск последнего находит первый (потому что поиск начинается в начале).

Есть много других, лучших способов сделать это.

  • Выполните второй поиск в диапазоне начиная после результата первого поиска (range(of:) имеет range: parameter, но вы не его использование)

  • Вместо того, чтобы искать для диапазона из высокий балл, поиск окружающего шаблона («Вы успели забить» и т. д.) и выяснить, где должны быть цифры.

  • Используйте NSScanner или регулярные выражения, чтобы найти числовые выражения, встроенные в строку.

  • Мой любимый: отметьте каждое из чисел «невидимым» атрибутом и найдите этот атрибут, чтобы вы могли надежно найти номера (пример here).

+0

Я не понимаю, как я мог бы реализовать «невидимый» атрибут в моем коде. Я все еще не исправил свою проблему. –

+0

Ну, я дал вам выбор из четырех отличных идей, и с последним я дал вам реальный код, демонстрирующий технику. Моя работа здесь закончена. Теперь проблема заключается в том, что вы не знаете ответа, когда слышите. – matt

+0

Не нужно быть дерзким, мама. Я не много работал с 'NSMutableAttributedString', поэтому я не совсем уверен, что именно делать. Пожалуйста, будьте более дружелюбны с вашими комментариями. –

0

Раствор без поиска диапазона было бы создать 2 отдельные NSMutableAttributedString для текущего счета и высокого балла, а затем добавить все вместе.

let currentScoreString = NSMutableAttributedString(...) 
let highscoreString = NSMutableAttributedString(...) 

let finalString = NSMutableAttributedString(string: "You have managed to score ").append(currentScoreString).... 
+0

Я попытался сделать 'currentScoreString.append ((CurrentScore as Int) как NSAttributedString), но это сработало. Также сбой, если я использую 'CurrentScore как AnyObject'. –

+0

Вы не можете просто преобразовать int в NSAttributedString! Вы должны инициализировать новый объект NSAttributedString. Я сделал некоторые изменения в первых двух строках, чтобы показать это. – TheAmateurProgrammer

+0

Это еще одна попытка, которую я сделал: http://pastebin.com/dB9bk0sy - Не дает ошибки, но цвет все равно не меняется, если они равны ... –

0
//MARK: forgroundColor 

open var foregroundColor: UIColor? { 
    didSet { 
     textAttributes[NSForegroundColorAttributeName] = foregroundColor 
     self.attributedText = NSAttributedString(string: self.text, attributes: textAttributes) 
    } 
} 

//MARK: backgroundColor 
open var textBackgroundColor: UIColor? { 
    didSet { 
     textAttributes[NSBackgroundColorAttributeName] = textBackgroundColor 
     self.attributedText = NSAttributedString(string: self.text, attributes: textAttributes) 
    } 
}