2016-07-17 5 views
0

Я пытаюсь сделать слова, разделенные пробелами зелеными в UITextField, вроде как работает, когда вы сочиняете новый iMessage. Я прокомментировал часть моего кода, которая дает мне ошибку времени выполнения. Пожалуйста, дайте мне знать, если у вас есть идеи:Изменение шрифта строк, разделенных пробелами

func textChanged(sender : UITextField) { 

    var myMutableString = NSMutableAttributedString() 

    let arr = sender.text!.componentsSeparatedByString(" ") 

    var c = 0 

    for i in arr { 

     /* 

     myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.greenColor(), range: NSRange(location:c,length:i.characters.count)) 

     sender.attributedText = myMutableString 

     */ 

     print(c,i.characters.count) 

     c += i.characters.count + 1 

    } 

} 
+1

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

ответ

1

Ваш код содержит как минимум две части, которые необходимо исправить.

var myMutableString = NSMutableAttributedString() 

Эта линия создает пустой NSMutableAttributedString. Любой доступ к контенту может привести к ошибке выполнения.

Другое i.characters.count. Вы не должны использовать Character основанные местоположения и подсчеты, когда API-интерфейсы, которые вы хотите использовать, основаны на поведении NSString. Используйте подсчет на основе UTF-16.

И еще один, это не критично, но вы должны использовать вид значимых имен для переменных.

Итак, все включено:

func textChanged(sender: UITextField) { 
    let text = sender.text ?? "" 
    let myMutableString = NSMutableAttributedString(string: text) 
    let components = text.componentsSeparatedByString(" ") 
    var currentPosition = 0 
    for component in components { 
     myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.greenColor(), range: NSRange(location: currentPosition,length: component.utf16.count)) 
     sender.attributedText = myMutableString 

     print(currentPosition, component.utf16.count) 
     currentPosition += component.utf16.count + 1 
    } 
} 

Но работает ли это, как вы ожидаете, или нет, зависит от того, когда вызывается этот метод.

+0

Я сейчас вызываю его из 'textField.addTarget (self, action:" textChanged: ", forControlEvents: UIControlEvents.EditingChanged)'. Это просто делает весь текст зеленым все время ... Что вы предлагаете? – Antoine

+0

Добавлен оператор if, чтобы удалить слово, которое в настоящее время написано, и оно отлично работает, спасибо! – Antoine

+0

Спасибо за отчетность. Рад слышать, что вы решили свою проблему. Удачи вам и вашему приложению. – OOPer

0

Вы создаете пустую атрибутную строку, но никогда не устанавливаете в нее никакого текста.

addAttribute вызов яблок атрибутов для текста в строке. Если вы попытаетесь применить атрибуты к диапазону, который не содержит текста, вы потерпите крах.

Вам необходимо установить содержимое строки без атрибута в атрибутированную строку, а затем применить атрибуты.

Обратите внимание, что вы, вероятно, следует переместить линию

sender.attributedText = myMutableString 

за пределами вашей цикл. Нет никакой веской причины неоднократно устанавливать атрибутированную строку в текстовое поле, добавляя атрибуты цвета к каждому слову.

Примечание Этот бит из Xcode документации на addAttribute:

... Поднимает NSRangeException, если какая-либо часть aRange лежит за пределами конца символов приемника.

Если вы получаете NSRangeException, это было бы ключом к тому, что не так с вашим текущим кодом. Обратите особое внимание на сообщения об ошибках, которые вы получаете. Они обычно предлагают важные подсказки относительно того, что происходит не так.

Смежные вопросы