Как использовать пары «ключ-значение» из словаря для подачи в ячейки табличного представления их заголовка? - PullRequest
1 голос
/ 14 февраля 2020

В настоящее время я пытаюсь завершить последние штрихи в своем первом приложении. Написанный на swift через Xcode как часть курса, который я прохожу, у меня есть список изображений, которые появляются в табличном представлении, и я хочу программно изменить имена файлов, чтобы он не отображал IMG_xxxxx.jpg , Я создал словарь, чтобы связать каждую фотографию с нужным именем, но я не могу понять, как заставить табличное представление отображать заголовок ячейки, который является значением ключа в указанном словаре, в зависимости от того, какой файл загружается в любую данную ячейку.

//This is the dictionary 
let imageTitles = ["IMG_1085.JPG" : "Num Num Num",
                   "IMG_1251.JPG" : "Star of the Show",
                   "IMG_1643.JPG" : "Ante Up",
                   "IMG_1630.jpg" : "Someone called my name?",
                   "IMG_1340.JPG" : "Ahhhhhhhhh",
                   "IMG_1595.jpg" : "Focus",
                   "IMG_1689.JPG" : "He Likes Me",
                   "IMG_1676.jpg" : "Warm and Cozy",
                   "IMG_1688.JPG" : "It's Like Looking Into a Mirror...",
                   ]

Это биты, которые загружают имя ячейки. Один закомментирован (это «официальный» код, который преподает инструктор, я пытаюсь сделать его еще на шаг впереди ради обучения), а другой - мои собственные попытки выполнить эту задачу (я не спас всех и каждого попробуйте - я просто переписываю что-то новое, когда неудачно.) Другой комментарий был скорее примечанием к себе, когда я решил добавить эту функцию. Я предполагаю, что возможно я пытаюсь сделать это не в том месте, но я не думаю, что это так. Выдается сообщение о том, что у меня не может быть строки: ссылка на строку, когда ожидается int, и это имеет смысл (логично, я бы предположил, что .row будет значением int, но я не знаю, как сделать оператор который запрашивает значение string: string, которое, я считаю, решило бы мою проблему) Есть ли способ понять, что обременен неопытностью? Я пытался искать существующие темы на подобных сайтах, но безуспешно.

Заранее благодарен за любую помощь!

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Вам нужен массив в качестве источника данных, простой пример - массив имен файлов

var pictures = ["IMG_1085.JPG", "IMG_1251.JPG", "IMG_1643.JPG", "IMG_1630.jpg", "IMG_1340.JPG", "IMG_1595.jpg", "IMG_1689.JPG", "IMG_1676.jpg", "IMG_1688.JPG"]

В cellForRow получите имя файла для пути индекса и сопоставьте его с заголовком

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Picture", for: indexPath)
    let fileName = pictures[indexPath.row]
    cell.textLabel?.text = imageTitles[fileName] ?? "N/A"
    return cell
}

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

0 голосов
/ 14 февраля 2020

Вы можете рассматривать их как массив кортежей как быстрый:

let imageTitles: [(imageName: String, imageTitle: String)] = [
    ("IMG_1085.JPG", "Num Num Num"),
    ("IMG_1251.JPG", "Star of the Show"),
    ("IMG_1643.JPG", "Ante Up"),
    ("IMG_1630.jpg", "Someone called my name?"),
    ("IMG_1340.JPG", "Ahhhhhhhhh"),
    ("IMG_1595.jpg", "Focus"),
    ("IMG_1689.JPG", "He Likes Me"),
    ("IMG_1676.jpg", "Warm and Cozy"),
    ("IMG_1688.JPG", "It's Like Looking Into a Mirror..."),
]


 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Picture", for: indexPath)
    cell.textLabel?.text = imageTitles[indexPath.row].imageTitle
    return cell
}

В будущем, чтобы лучше управлять ими, если вы можете изменить его, просто измените его как массив специфицированного c типа что-то вроде:

struct Image {
    var imageName: String
    var imageTitle: String
}

let imageTitles: [Image] = [
    Image(imageName: "IMG_1085.JPG", imageTitle: "Num Num Num"),
    ...
]

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Picture", for: indexPath)
    cell.textLabel?.text = imageTitles[indexPath.row].imageTitle
    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...