Описание ячейки табличного представления

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

Я следую онлайн-курсу по изучению iOS. Я использую Swift 4.2.

Мой вопрос касается этого метода:

 // This function is defining each cell and adding contenet to it.
    internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")

        cell.textLabel?.text = cellContent[indexPath.row]

        return cell

    }
  

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

Что именно означает indexpath.row? Я запутался с этим.

Пожалуйста, помогите мне. Спасибо.

 import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var cellContent:Array<String> = ["Amir", "Akbar", "Anthony"]


    // This function is setting the total number of cells in the table view
    internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return cellContent.count

    }

    // This function is defining each cell and adding contenet to it.
    internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")

        cell.textLabel?.text = cellContent[indexPath.row]

        return cell

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }


}
  

Ответ №1:

В документации Apple по indexPath говорится: Каждый индекс в пути к индексу представляет индекс в виде массива дочерних элементов от одного узла в дереве к другому, более глубокому, узлу.

На простом английском языке это в основном означает, что IndexPath s — это способ доступа к двумерному массиву, что и является dataSource представлением таблицы. TableView должен знать, сколько в нем разделов и сколько строк в каждом разделе.

В вашем случае есть только один раздел, поэтому вам не нужно беспокоиться о indexPath.section потому что раздел всегда равен 0. В многомерном источнике данных cellContent есть только один массив (ваш tableView array), поэтому вы можете получить доступ к элементам с помощью indexPath.row . Если бы у вас было более одного массива cellsContent, вам пришлось бы использовать indexPath.section для доступа к нужному, прежде чем вы смогли бы использовать indexPath.row

Вы опустили numberOfSections метод, UITableViewDatasource который возвращает 1 значение по умолчанию.

Ответ №2:

В дополнение к ответу Тома Пирсона на indexPath,

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

Да, этот метод вызывается для каждой видимой ячейки в TableView.

Если вы используете приведенный ниже метод в методе cellForRowAt , ячейки будут использоваться повторно без создания дополнительных объектов cell.

 let cell = tableView.dequeueReusableCell(withIdentifier: action,
                                                   for: indexPath as IndexPath)
  

Как только ячейка выходит из видимости (допустим, она прокручивается), объект cell повторно используется для новой видимой строки, и он не создается заново для каждой ячейки. В этом и заключается мощь этого метода.

Обычно код будет выглядеть следующим образом.

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

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "someIdentifier",
                                                   for: indexPath as IndexPath) as? SomeCell else {
        fatalError("Cell is not of type SomeCell")
    }

    cell.title.font = somefont
    cell.title?.textColor = somecolor
    cell.backgroundColor = UIColor.clear

    return cell
}
  

Комментарии:

1. @Lara senchina, это было полезно? ваша проблема решена?