Как сохранить и получить доступ к «массиву» значений NSAttributedString.Key.foregroundColor - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть сетка UICollectionView, показывающая одну текстовую метку в каждой ячейке. Хотя на рисунке показаны разные атрибуты в каждой ячейке, я не могу понять, как хранить и получать доступ к конкретным значениям NSAttributedString.Key.foregroundColor в indexPath.item.

grid

Для текста у меня есть массив строковых значений, которые я вызываю через indexPath.item в cellForItemAt indexPath. Но я не могу понять, как создать эквивалентный массив значений атрибутов.

Модель: let myText = ["Pos.1", "Основной глагол", "Pos.2" .... и т. Д.

Источник данных "Представление коллекции":

func colletionView(_ collectionView.UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CVCell", for: indexPath as! CVCell

    let text = myModel.myText[indexPath.item]
    let myAttribute = [NSAttributedString.Key.foregroundColor: UIColor.blue]
    let myAttributedText = NSAttributedString(string: text, attributes: myAttributes as [NSAttributedString.Key : Any])

    cell.label.attributedText = myAttributedText
    return cell
}

Я пытался создать массивы NSAttributedString или NSAttribtuedString.Key, но он никогда не компилируется. Как мне сделать это, чтобы я мог получить правильное значение в indexPath.item? или это совершенно неправильный подход?

let cellColor = [
     NSAttributedString.Key.foregroundColor: UIColor.blue
     NSAttributedString.Key.foregroundColor: UIColor.red
      ...

В конечном счете, я хотел бы иметь данные в файле plist или json или данные ядра, но (я полагаю) все равно нужно будет загрузить данные в массив (я полагаю) для доступа через indexPath.item.

Я не очень опытный, поэтому я мог бы упустить что-то довольно простое.

1 Ответ

1 голос
/ 30 апреля 2019

Вы должны создать массив для хранения цветов в вашей модели, как тот, который у вас есть для текстов

Модель:

let myText = ["Pos.1", "Main Verb", "Pos.2".... etc
let myColors = [UIColor.blue, UIColor.red, UIColor.green.... etc

, а затем получить к нему доступ таким образом

...
let text = myModel.myText[indexPath.item]
let color = myModel.myColors[indexPath.item]
let myAttributes: [NSAttributedString.Key : Any] = [.foregroundColor: color]
let myAttributedText = NSAttributedString(string: text, attributes: myAttributes)
...

Обратите внимание, что вы разместили не массив, а словарь .Кроме того, если вы изменяете только цвет текста, вам не нужно использовать NSAttributedString, вы можете изменить метку textColor свойство

Редактировать:

Согласно предложению @Larme вы также можете создать структуру для хранения данных в вашей модели, чтобы у вас был только один массив:

struct TextSettings {
    let text: String
    let color: UIColor
}
let myTextSettings = [TextSettings(text: "Pos.1", color: UIColor.blue),
                      TextSettings(text: "Main Verb", color: UIColor.red),
                      TextSettings(text: "Pos.2", color: UIColor.green), ...]

и использовать его при настройке ячейки

...
let settings = myModel.myTextSettings[indexPath.item]
let myAttributes: [NSAttributedString.Key : Any] = [.foregroundColor: settings.color]
let myAttributedText = NSAttributedString(string: settings.text, attributes: myAttributes)
...
...