2017-02-21 8 views
0

Я использую атрибутированную строку для форматирования единственной строки символов для UITextView, которая будет обновляться всякий раз, когда нажимается кнопка или перемещается сборщик. Однако, поскольку я использую attributedStringLine.append(attributedCharString), attributedString продолжает расти, а не запускать новую атрибутивную строку всякий раз, когда обновляется UITextView.Как начать с пустой атрибутной строки при изменении UITextView?

Код ниже демонстрирует упрощенную версию проблемы.

NSMutableAttributedString() действует на строку в myArray. Новые строки обрабатываются при изменении UITextView. Они находятся в array1,array2 и array3.

import UIKit 

var str = "Hello, playground" 

let array1      = ["7.0", "55.55", "1.0", "9.27"] 
let array2      = ["0", "10", "20", "30", "40"] 
let array3      = ["A", "B", "C", "D", "E", "F"] 

var myArray      = [""] 
let attributedStringLine  = NSMutableAttributedString() 
let numberOfRawStringCharacters = myArray.count 


func appendTextString(i: Int){ 
    let rangeOfCharString  = (myArray[i] as NSString).range(of: myArray[i]) 
    let attributedCharString = NSMutableAttributedString.init(string: myArray[i], attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 18.0, weight: UIFontWeightLight)]) 
    attributedCharString.addAttributes([NSForegroundColorAttributeName : UIColor.blue], range: rangeOfCharString) 
    attributedStringLine.append(attributedCharString) 
} 


func makeText() { 
    for i in 0..<myArray.count { 
     appendTextString(i: i) 
    } 
} 

var line = attributedStringLine.length 

myArray.removeAll() 
myArray       = array1 
myArray.count 
makeText() 
print(attributedStringLine) 
line = attributedStringLine.length 

myArray.removeAll() 
myArray       = array2 
myArray.count 
makeText() 
attributedStringLine 
line = attributedStringLine.length 

myArray.removeAll() 
myArray       = array3 
myArray.count 
makeText() 
attributedStringLine 
line = attributedStringLine.length 

Как начать с пустой attributedString всякий раз, когда UITextView изменения?

Для NSMutableString замена или удаление символов из диапазона существующей атрибутной строки, по-видимому, является единственной доступной альтернативой. И я уверен, что это не является дубликатом Value of type 'NSMutableAttributedString' has no member 'removeAll'

ответ

1

Поскольку вы объявили attributedStringLine с let, вы можете удалить все символы из него в начале makeText.

func makeText() { 
    attributedStringLine.deleteCharacters(in: NSMakeRange(0, attributedStringLine.length)) 
    for i in 0..<myArray.count { 
     appendTextString(i: i) 
    } 
} 

Или вы изменить свое заявление от let к var, а затем использовать attributedStringLine = NSMutableAttributedString() в начале makeText.

+0

Ваше первое решение отлично работает в моем проекте Xcode, поэтому, с моей точки зрения, это будет принятый ответ. Стоит отметить, что строки, помеченные в Playground, выглядят правильно отформатированными для 'array2' и' array3', но для 'array1' отображается неформатированная строка, за которой следует приписанный скрипт форматирования, заключенный в фигурные скобки. На симуляторе эти числовые символы с плавающей запятой отображаются правильно. Благодарю. – Greg