Swift: как создать новый indexPath для дополнительных ключей словаря - PullRequest
0 голосов
/ 17 марта 2019

Я хочу, чтобы итерация словаря происходила для всех ключей в нем, а не только для одного в indexPath.row

struct Whatever {
   var title: String
   var tag: [String:String?]?
}

var cases = [
     Whatever(title: "Name1", tag: ["key1": "value1", "key2":"value2"]),
     Whatever(title: "Name2", tag: ["key3": "value3"]
]

Позже в ViewController:

let arrayCases = cases[indexPath.row]
let caseTag = arrayCases.tag!

for key in caseTag.keys {
    cell.titleLabel?.text = key
    //the magic stops somewhere here

}

for value in caseTag.values {
    if value != nil {
        cell.txt.text = value
    } else {
        cell.txt.text = arrayCases.title
    }
}

Не могли бы вы сказать мне, как сделать новый indexPath.row для второго тега? Как будто это отдельная страховка «Безотносительно»? Второй вопрос - почему он показывает после каждой сборки разные теги - иногда это «tag1», а иногда - «tag2»? Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

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

var allTagKeys: String {
    if let keys = tag?.keys {
        return keys.sorted().joined(separator: ", ")
    }
    return ""
}

var allTagValues: String {
    if let values = tag?.compactMap({ $0.value }) {
        return values.joined(separator: ", ")
    }       
    return ""
}

}

Обратите внимание, что ядобавлена ​​сортировка по ключам, не уверен, что вы этого хотите.

0 голосов
/ 17 марта 2019

Если вы используете стандартное табличное представление (без разделов), каждый элемент в источнике данных представляет одну строку.Вы не можете просто создать новый indexPath.row .

У вас есть два варианта:

  1. Использовать разделы: Один Whatever - один раздел , title - заголовок, каждый tag - это одна строка (см. Код ниже)

  2. Объединить ключи и значения тегов

    cell.titleLabel?.text = caseTag.keys.joined(separator: ", ") 
    
    cell.txt.text = caseTag.values.joined(separator: ", ") 
    

Относительно второй вопрос : Словари не упорядочены, порядок отсутствует.Если вам нужен конкретный порядок, используйте другую структуру Tag и сделайте tags массивом, например

struct Whatever {
    let title: String
    let tags: [Tag]
}

struct Tag {
    let key, value : String
}

let cases = [
    Whatever(title: "Name1", tags: [Tag(key: "key1", value: "value1"), Tag(key: "key2", value: "value2")]),
    Whatever(title: "Name2", tags: [Tag(key: "key3", value: "value3"), Tag(key: "key4", value: "value4")])
]

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    let case = cases[section]
    return case.title
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

...

    let section = cases[indexPath.section]
    let case = section.tags[indexPath.row]
    cell.titleLabel?.text = case.key
    cell.txt.text = case.value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...