#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, это было полезно? ваша проблема решена?