286
Вывод
списка с данными
Взглянув на табличное представление внутри сцены, можно заметить, что
сейчас оно пустое. Если бы мы попытались использовать табличное представ
-
ление прямо сейчас, у нас ничего не получилось бы, потому что в настоящее
время отсутствуют прототипы ячеек. Прототипы ячеек – это шаблоны, опреде
-
ляемые в раскадровке, экземпляры которых автоматически создаются таблич
-
ным представлением для отображения содержимого элемента списка. Каждый
элемент может включать различные типы ячеек. Прототипы определяются
и используются всеми ячейками.
Чтобы добавить прототип ячейки, выберите табличное представление в сце
-
не, откройте инспектор атрибутов и увеличьте значение в поле
Prototype Cells
.
Эта операция добавит новый элемент в таблицу, отображаемую в редакторе
раскадровки. Однако, чтобы использовать ячейки этого типа, нам нужна воз
-
можность ссылаться на этот тип в коде. Для этого выберите ячейку в таблич
-
ном представлении в редакторе и присвойте ей уникальный идентификатор
в поле
Identifier
. Пока присвоим идентификатор
CatalogTableViewCell
.
Выше мы решили, что в этой главе будут использоваться статические дан
-
ные. Давайте используем те же книги, что были перечислены в разделе «An
-
droid». Дополнительно расширим структуру
Book
и добавим расширение с удоб
-
ным вспомогательным методом:
struct Book {
let title:
String
let authors: [String]
let isbn: String
let pageCount: Int
let fiction: Bool
}
extension Book {
static let sampleData: [Book] = [
Book(title: "Fight Club", authors: ["Chuck Palahniuk"],
isbn: "978-0393039764", pageCount: 208, fiction: true),
Book(title: "2001: A Space Odyssey", authors: ["Arthur C. Clarke"],
isbn: "978-0451457998", pageCount: 296, fiction: true),
Book(title: "Ulysses", authors: ["James Joyce"],
isbn: "978-1420953961", pageCount: 682, fiction: true),
Book(title: "Catch-22", authors: ["Joseph Heller"],
isbn: "978-1451626650", pageCount: 544, fiction: true),
Book(title: "The Stand", authors: ["Stephen King"],
isbn: "978-0307947307", pageCount: 1200, fiction: true),
Book(title: "On The Road", authors: ["Jack Kerouac"],
isbn: "978-0143105466", pageCount: 416, fiction: true),
Book(title: "Heart of Darkness", authors: ["Joseph Conrad"],
isbn: "978-1503275928", pageCount: 78, fiction: true),
Book(title: "A Brief History of Time", authors: ["Stephen Hawking"],
isbn: "978-0553380163", pageCount: 212, fiction: false),
Book(title: "Dispatches", authors: ["Michael Herr"],
isbn: "978-0679735250", pageCount: 272, fiction: false),
Book(title: "Harry Potter and Prisoner of Azkaban",
authors: ["J.K. Rowling"],
isbn: "978-0439136365", pageCount: 448, fiction: true),
Заполнение представления списка
287
Book(title: "Dragons Love Tacos",
authors: ["Adam Rubin", "Daniel Salmieri"],
isbn: "978-0803736801", pageCount: 40, fiction: true),
]
}
Хотя
пока это не очевидно, но мы не будем передавать сразу все данные
в табличное представление. Одной из удивительных особенностей
UITableView
и
UICollectionView
является их способность обслуживать огромные объемы дан
-
ных, потому что они используют только часть данных, почти так же, как
Recy
clerView
в Android.
Чтобы заполнить табличное представление,
нам нужно создать источник
данных. Обычно для этого создается объект, реализующий протокол
UITab le
ViewDataSource
, и связывается с объектом табличного представления. Однако
в этом примере мы не будем усложнять и реализуем протокол непосредствен
-
но в
CatalogViewController
.
Обычно контроллеры
UIViewController
сами реализуют
протоколы источников
данных для табличных представлений. Это нормально для простых приложений,
но такой подход нарушает принцип разделения ответственности, проповедуемый
более строгой архитектурой MVC. Кроме того, это приводит к раздуванию кода
контроллера, что является распространенной проблемой. Разработчик, будь осто
-
рожен!
Добавим расширение для
CatalogViewController
, реализующее
UITableViewDa
taSource
:
class CatalogViewController: UIViewController {
...
}
extension CatalogViewController: UITableViewDataSource {
}
Протокол определяет ряд необязательных методов, но кроме них есть два
обязательных метода, которые вы обязаны реализовать для заполнения таб-
личного представления:
tableView(_:numberOfRowsInSection:)
и
tableView
(_:cell
ForRowAt:)
. Рассмотрим первый из них.
Табличное представление будет вызывать
tableView(_:numberOfRowsInSection:)
,
чтобы определить количество элементов в каждом разделе данных. В нашем
табличном представлении будет только один раздел, поэтому можно просто
вернуть количество элементов в статических данных, которые мы определили
ранее:
func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) > Int {
return Book.sampleData.count
}
По умолчанию табличное представление содержит только один раздел.
Чтобы
определить несколько разделов (с их заголовками), нужно реализовать метод
numberOfSections(in:)
.
288
Вывод списка с данными
В этом методе мы сообщаем табличному
представлению количество эле
-
ментов. Теперь реализуем следующий метод,
tableView(_:cellForRowAt:)
, опре
-
деляющий логику заполнения ячеек.
Этот метод должен: создать экземпляр ячейки табличного представления
и заполнить эту ячейку соответствующими данными. Вот, собственно, сам ме
-
тод:
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) > UITableViewCell {
// Получить ячейку из
пула свободных ячеек
let cell =
tableView.dequeueReusableCell(withIdentifier: "CatalogTableViewCell",
for: indexPath)
// Найти книгу, соответствующую заполняемой ячейке
let book = Book.sampleData[indexPath.row]
// Заполнить метку с заголовком
ячейки названием книги
cell.textLabel?.text = book.title
return cell
}
Первым делом мы получаем экземпляр ячейки для табличного представ
-
ления из пула незанятых ячеек, используя при этом идентификатор (
Catalog
TableViewCell
), присвоенный при создании прототипа ячейки. Затем получаем
книгу из источника данных, используя свойство
indexPath.row
. Этот метод вы
-
зывается для каждой отображаемой ячейки, поэтому при извлечении третьего
элемента это свойство будет иметь значение
2
и мы сможем извлечь третий
элемент из массива (т. е. это порядковый номер элемента, если считать с нуля).
Затем мы заполняем текстовую метку в ячейке, записывая в нее название кни
-
ги, и возвращаем ячейку, чтобы табличное представление могло отобразить ее.
Наконец, нам осталось сделать еще один шаг: сообщить табличному пред
-
ставлению, что оно может использовать этот контроллер представления в роли
источника данных.
Вернитесь к файлу
Main.storyboard
в редакторе раскадровки.
Нажмите
и удерживайте клавишу
Control
, наведите указатель мыши на таблицу в сцене
каталога, нажмите левую кнопку мыши и перетащите объект
Catalog
в струк
-
туру документа слева от холста. В появившемся диалоге выберите
dataSource
в разделе
Do'stlaringiz bilan baham: