Indexpath.row заботится об итерации массива? - PullRequest
0 голосов
/ 30 апреля 2018

Я работаю над учебным пособием UITableView, и мне стало любопытно, как использовать итерацию массива при реализации методов UITableViewDataSource. Когда мы вызываем indexPath.row, это вызывает цикл for для нас за кулисами? Я спрашиваю, потому что месяцы назад, когда я учился использовать данные из веб-службы (я забыл точные шаги, как я это сделал точно), но я считаю, что мне нужно было перебрать массив, чтобы представить информацию в консоль.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Create an instance of UITableViewCell, with default appearance
        let cell = UITableViewCell.init(style: .value1, reuseIdentifier: "UITableViewCell")

        // Set the text on the cell with the description of the item instance that is at the nth index of the allItems array, where n = row this cell will appear in on the tableview
        let item = itemStore.allItems[indexPath.row]

        cell.textLabel?.text = item.name
        cell.detailTextLabel?.text = "$\(item.valueInDollars)"

        return cell
    }

Правильно ли я считаю, что метод indexPath.row выполняет итерацию по массиву для нас за кулисами?

let item = itemStore.allItems[indexPath.row]

Ответы [ 4 ]

0 голосов
/ 30 апреля 2018

Проверьте документацию по функциям UITableView и cellForRowAtIndexpath.

Путь индекса, определяющий местонахождение строки в tableView.

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

cellForRow вернет ячейку для определенного пути индекса (в указанном разделе и строке)

Таким образом, indexPath.section даст номер раздела, для которого ячейка будет изменена и возвращена в источник данных. И внутри раздела, и indexPath.row будет соответствующей строкой внутри этого раздела.

указатель пути к документации

tableView-CellForRowAt: IndexPath

Документация источника данных UITableView

[обновление]

Если вы хотите добавить несколько секций, добавьте еще один источник данных numberOfSections и верните количество отсчетов секций из него.

Я могу сослаться на создать учебник по табличному представлению от Apple, но это длинный документ, вы можете пропустить начало и прочитать Для отображения раздела в табличном представлении .

Если хотите, вы можете использовать 2D-массив для хранения разделов и строк. И в метод numberOfSections возвращает array.count, а в numberOfRows: inSection , возвращает массив [section] .count

Дополнительные примеры,

спасибо, J

0 голосов
/ 30 апреля 2018

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

Однако cellForRowAt на самом деле вызывается каждый раз, когда ячейка будет видна на вашем tableVIew . Представьте, что у вас есть источник данных со 100 элементами, и можно видеть только 10 ячеек одновременно. Когда tableView будет изначально загружен, cellForRowAt будет вызван 10 раз. Затем, если вы прокрутите свой tableView , чтобы показать еще 3 ячейки, cellForRowAt будет вызван еще 3 раза.

0 голосов
/ 30 апреля 2018

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

let cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell", for: indexPath)

Рабочий процесс для отображения ячеек табличного представления:

  • Фреймворк вызывает numberOfRowsInSection (а также numberOfSections)
  • Для каждой пары секций / строк в диапазоне видимых ячеек он вызывает cellForRowAt и передает путь индекса во втором параметре.
0 голосов
/ 30 апреля 2018

Нет. indexPath - это просто структура с section и row. Вы используете их для прямого поиска информации в вашем массиве. Итерации не происходит.

cellForRowAt вызывается только для ячеек, которые находятся на экране, поэтому порядок их вызова зависит от того, в каком направлении вы прокручиваете.

На самом деле, UITableView даже не знает, используете ли вы массив или генерируете информацию на лету. То, что вы делаете с indexPath row и section, зависит от вас.

...