Práce s Tabulkou View Controllers v rychlém
Napsal Reinder de Vries 3. srpna 2020, Vývoj Aplikací, iOS
V tomto tutoriálu vám ukážu, krok-za-krokem, jak zobrazení tabulky regulátory pracují a jak je můžete použít. Půjdeme do celé škály UITableViewController
tím, že se ponoříme do objektově orientovaného programování, delegování a zákulisních mechanismů zobrazení tabulky.
řadič zobrazení tabulky zobrazuje strukturované, opakovatelné informace ve vertikálním seznamu. Třídu UITableViewController
používáte v aplikaci pro iOS k vytvoření řadiče zobrazení tabulky.
práce s řadičem zobrazení tabulky také znamená práci s několika důležitými koncepty vývoje iOS, jako je podtřída, návrhový vzor delegování a opětovné použití pohledů.
je to důležité pro profesionální a praktické vývojáře iOS (vy!) zvládnout práci s řadiči zobrazení tabulky. Jakmile si zvyknete pracovat na takové mnohostranné komponentě uživatelského rozhraní, jako je UITableViewController
, začnou mít smysl i další složitější aspekty vývoje iOS.
připraven? Pojďme se ponořit!
- Jak Tabulka Pohled Řadič Funguje
- vytvoření Jednoduché Tabulky, View Controller
- Kódování Tabulky View Controller Zdroj Dat
- Poskytování Buněk do Tabulky View Controller
- v Reakci na Interakci Uživatele
- Další Čtení
Jak Tabulka Pohled Řadič Funguje
Pokud jste použili nějaké iOS aplikace předtím, než jste použili zobrazení tabulky řadiče předtím. Používají se tak často v aplikacích pro iOS!
zde je příklad řadiče zobrazení tabulky:
tabulka pohled řadič má obvykle tyto viditelné součásti:
- zobrazení tabulky, což je uživatelské rozhraní, komponenty, nebo zobrazení, které je zobrazeno na obrazovce. Zobrazení tabulky je instance třídy
UITableView
, což je podtřídaUIScrollView
. - buňky zobrazení tabulky, což jsou opakovatelné řádky nebo pohledy zobrazené v zobrazení tabulky. Buňka zobrazení tabulky je instancí třídy
UITableViewCell
a tato třída je často podtříděna pro vytvoření vlastních buněk zobrazení tabulky.
tabulka pohled řadič také spoléhá na použití těchto komponent, za-scény:
- zobrazení tabulky delegát, který je zodpovědný za správu rozvržení tabulky, zobrazení a reagovat na interakci s uživatelem události. Delegát zobrazení tabulky je instancí třídy
UITableViewDelegate
. - zdroj dat zobrazení tabulky, který je zodpovědný za správu dat v zobrazení tabulky, včetně buněk a sekcí zobrazení tabulky. Zdroj dat je instance třídy
UITableViewDataSource
.
navigační ovladač je často používán ve spojení s tabulkou view controller umožní navigaci mezi zobrazení tabulky a následné zobrazení správců, a ukázat navigační liště nad tabulkou pohledu.
nejzajímavější částí práce s řadiči zobrazení tabulky je samotný řadič zobrazení tabulky! Jak to?
jste obeznámeni s architekturou Model-View-Controller? Podle architektury Model-View-Controller jsou zobrazení tabulky a buňka zobrazení tabulky pohledy a řadič zobrazení tabulky je řadič.
pohledy jsou zodpovědné za zobrazení informací viditelně uživateli, s uživatelským rozhraním (UI). Správci jsou odpovědní za implementaci logiky, správu dat a přijímání rozhodnutí. Řekl jinak: nemůžete vidět řadič, ale je to tam, řízení toho, co vidíte prostřednictvím zobrazení.
Používáte-li v aplikaci řadič zobrazení tabulky, podtřídíte třídu UITableViewController
. Samotná třída UITableViewController
je podtřídou UIViewController.
zde je hierarchie tříd ukázkového řadiče zobrazení tabulky, který zobrazuje kontaktní informace:
- instance
ContactsTableViewController
- podtřídy
UITableViewController
- podtřídy
UIViewController
- podtřídy
- podtřídy
podle zásad Objektově Orientovaného Programování (OOP), kdy třída RaceCar
podtřídy třídy Vehicle
, že zdědí vlastnosti a funkce, které nadtřídy, např. maxSpeed
a drive()
.
třída Vehicle
se pak nazývá supertřída RaceCar
. Tento princip se nazývá dědičnost.
matoucí? Může být! Přemýšlejte o tom takto: aby váš řadič zobrazení tabulky fungoval dobře, budete muset zdědit spoustu kódu, takže nemusíte psát celý tento kód sami. Hierarchie tříd, a OOP, je tam strukturovat toto dědictví.
můžete pracovat s tabulkovými pohledy bez použití řadiče zobrazení tabulky. Jednoduše přidejte UITableView
do řadiče zobrazení, poskytněte mu implementace funkcí delegáta zobrazení tabulky a zdroje dat a máte hotovo.
třída UITableViewController
poskytuje výchozí implementace těchto funkcí delegáta zobrazení tabulky a zdroje dat zobrazení tabulky. To je zásadní aspekt práce s řadičem zobrazení tabulky!
jak uvidíte v následujících kapitolách tohoto tutoriálu, tyto funkce přepíšeme vlastními implementacemi. Můžeme přizpůsobit řadič zobrazení tabulky tím, že to uděláme.
Naučte se, jak vytvořit iOS aplikace
začínáme s iOS 14 a Swift 5
Přihlásit se na můj iOS vývoj kurzu a naučte se, jak vytvořit skvělé iOS 14 aplikace s rychlým Xcode 5 a 12.
nastavení jednoduchého regulátoru zobrazení tabulky
Dobře, pojďme to vše uvést do praxe. V této části vytvoříme jednoduchý řadič zobrazení tabulky. Budete implementovat funkce potřebné k tomu, aby to fungovalo, a já vám vysvětlím, jak fungují. Pojďme na to!
můžete použít 3 různé přístupy práce s UIs v Xcode:
- Vytváření pohledů programově, tj. kódování je ručně
- Nastavení UIs v Interface Builder a spojovat je s Swift kód prostřednictvím XIBs
- Nastavení UIs a jejich přechody v Interface Builder pomocí Storyboardů
- (Technicky, můžete použít SwiftUI taky, ale jak pro zobrazení tabulky řadiče, to je nad rámec tohoto tutoriálu.)
je to únavné a neproduktivní kódovat UIs ručně. Pokud si nejste opatrní se storyboardy, nakonec skrývají složitost od vývojáře. Budeme pracovat se storyboardy, a zároveň přijít na to, jak přesně fungují v zákulisí.
zde je to, co budete dělat:
nejprve vytvořte nový projekt Xcode pomocí souboru → Nový → projekt…. Nezapomeňte si vybrat šablonu aplikace a vybrat Storyboard pro rozhraní a delegáta aplikace UIKit pro životní cyklus.
poté proveďte tyto kroky:
- klepněte Pravým tlačítkem myši projektu v Navigátoru Projektu a vybrat Nový Soubor…
- Vyberte Cocoa Touch šablony Třídy (iOS)
- Vybrat
UITableViewController
pro Podtřídu - Název třídy
ContactsTableViewController
- netikají Také vytvořit soubor s příponou XIB
- Konečně, klepněte na tlačítko Další a soubor uložit vedle jiných Swift soubory
a Konečně, tento:
- Přejděte do
Main.storyboard
a odstranit stávající View Controller Scéna - Přidat novou Tabulku View Controller na storyboard pomocí Knihovny
- S table view controller vybrána, Atributy, Inspektor a zaškrtněte Je Počáteční View Controller políčko
- a Konečně, jděte na Totožnost Inspektora a nastavit Třídy
ContactsTableViewController
to je ono! Nyní máte řadič zobrazení tabulky uvnitř scénáře projektu a připojili jste jej ke třídě Swift ContactsTableViewController
.
jak jste uhodli, vaše ContactsTableViewController
třída je podtřída UITableViewController
. Můžete to vidět v souboru Swift, nahoře, v deklaraci třídy.
class ContactsTableViewController: UITableViewController { ···
tato syntaxe znamená: třída ContactsTableViewController
je podtřída UITableViewController
.
když kliknete pravým tlačítkem myši na“ UITableViewController “ a podržíte klávesu Option, můžete v deklaraci třídy vidět, že UITableViewController
je podtřída UIViewController
a odpovídá protokolům UITableViewDelegate
a UITableViewDataSource
.
to je síla řadiče zobrazení tabulky! Neposkytuje nám pouze jednotlivé komponenty k vytvoření zobrazení tabulky, řadič také poskytuje výchozí implementaci. Proto jsme podtřídu UITableViewController
namísto vytvoření prázdného řadiče zobrazení s tabulkovým pohledem.
v tomto okamžiku můžete aplikaci spustit pomocí Command-R
nebo tlačítka Přehrát a na obrazovce se zobrazí prázdný ovladač zobrazení tabulky.
proč je to mimochodem? Ještě jsme nic nezakódovali! Je to proto, že řadič zobrazení tabulky má výchozí implementaci, která na obrazovce zobrazuje pouze prázdné buňky. Paráda!
v Závislosti na vaší verzi Xcode, jsme použili scénu přenést nastavit počáteční zobrazení správce aplikace project. Více se dozvíte zde: delegát scény v Xcode
XIB a hrot jsou v podstatě totéž-obsahují informace o rozvržení. XIB má formát XML, zatímco hrot má binární formát. XML je kompilován na binární při vytváření aplikace, takže to je důvod, proč funkce UIKit vždy mluví o „hrotu“, zatímco Xcode vždy nazývá „xib“.
kódování zdroje dat řadiče zobrazení tabulky
Nyní, když byl váš řadič zobrazení tabulky nastaven, přivedeme jej k životu! V této kapitole se zaměříme na různé funkce, které budete muset implementovat, aby váš řadič zobrazení tabulky fungoval.
jak bylo vysvětleno dříve, tyto funkce patří buď do delegáta řadiče zobrazení tabulky, nebo ke zdroji dat řadiče zobrazení tabulky. Oba tyto protokoly používají delegování k přizpůsobení zobrazení tabulky.
nejdůležitější funkce pro UITableViewDataSource
:
numberOfSections(in:)
tableView(_:numberOfRowsInSection:)
tableView(_:cellForRowAt:)
Další důležité funkce pro UITableViewDelegate
:
tableView(_:didSelectRowAt:)
tableView(_:willDisplay:for:)
Můžete si najít více funkcí v Apple Developer Dokumentace pro UITableViewDelegate a UITableViewDataSource.
Přidání dat kontaktů
začnete přidáním dat kontaktních informací pro řadič zobrazení tabulky. Do třídy ContactsTableViewController
přidejte následující vlastnost:
let contacts:] = , , , , , , , , , , , , , , , , ]
to je rolodex, který bychom všichni rádi měli, že? Zde je návod, jak to funguje:
-
let contacts
deklaruje konstantu s názvemcontacts
. Přidali jste ji jako vlastnost do třídy, takže každá instance třídy má přístup k této konstantě v celém kódu třídy. - Typ
contacts
je]
, což je pole polí řetězců. V podstatě vytváříte pole, jehož položky jsou pole řetězců. (Název proměnné a její typ, jsou odděleny dvojtečkou:
) -
=
kód přiřadí pole literálucontacts
, vyplněné se jmény a telefonními čísly několika miliardářů.
v pozdějším okamžiku můžeme použít počet položek v poli s contacts.count
. A můžeme získat jednotlivá jména a telefonní čísla s contacts
a contacts
pomocí syntaxe indexů.
registrace třídy buněk zobrazení tabulky
než budete moci použít buňky v řadiči zobrazení tabulky, musíte je zaregistrovat pomocí zobrazení tabulky. Můžete tak učinit dvěma způsoby:
- poskytnutím třídy buňky zobrazení tabulky a identifikátoru
- poskytnutím buňky zobrazení tabulky XIB a identifikátoru
pokud používáte vlastní buňku zobrazení tabulky, pravděpodobně chcete zaregistrovat XIB. Když používáte výchozí buňky zobrazení tabulky nebo jinou programovou buňku, zaregistrujete třídu. Prozatím použijeme třídu!
přidejte do funkce viewDidLoad()
následující kód:
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellIdentifier")
nezapomeňte jej přidat pod řádek super.viewDidLoad()
. Jak asi víte, funkce viewDidLoad()
je součástí životního cyklu regulátoru zobrazení a patří do třídy UIViewController
.
přepisujete funkci viewDidLoad()
, abyste reagovali na tuto událost v životním cyklu ovladače zobrazení, takže můžete nastavit svůj pohled po jeho načtení. V našem případě používáme funkci k registraci buňky zobrazení tabulky.
když zaregistrujete buňku zobrazení tabulky, musíte také zadat identifikátor. To je jednoduše spojovat třídy buňky s názvem, můžete použít později, když dequeuing buňky v tableView(_:cellForRowAt:)
.
jste stále se mnou? Pojďme dál!
Prováděcí „numberOfSections(v:)“
první funkce delegáta budeme realizovat, je to, numberOfSections(in:)
.
zobrazení tabulky může mít více sekcí nebo skupin. Každá skupina má záhlaví, které se vznáší nad svislou řadou buněk. V aplikaci Kontakty můžete seskupit kontakty abecedně. To se ve skutečnosti provádí v aplikaci Kontakty na iPhone, kde jsou kontakty seskupeny A-Z.
aplikace, kterou vytváříme, má pouze jednu sekci. Přidejte do třídy následující funkci:
override func numberOfSections(in tableView: UITableView) -> Int{ return 1}
jednoduché, že? Funkce vrátí 1
při volání.
Prováděcí „tableView(_:numberOfRowsInSection:)“
podobná funkce je tableView(_:numberOfRowsInSection:)
. Místo toho, aby poskytoval počet sekcí, poskytuje počet řádků v sekci. Protože zobrazení tabulky zobrazuje buňky ve svislém seznamu, každá buňka odpovídá řádku v zobrazení tabulky.
aplikace, kterou vytváříme, má pouze jednu sekci a tato část obsahuje počet položek rovnající se počtu položek v poli contacts
. Takže to je contacts.count
!
přidejte do třídy následující funkci:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ return contacts.count}
vidíš, jak to funguje? Jednoduše se vrátíme contacts.count
. Pokud byste měli přidat další jméno a telefonní číslo do contacts
, ukázalo by se to pěkně také v zobrazení tabulky.
pochopení řádků a sekcí
naše aplikace Kontakty je jednorozměrná, zobrazuje pouze jeden seznam jmen a telefonních čísel a nepoužívá skupiny. Ale co když máte seskupené zobrazení tabulky?
ve většině případů by váš zdroj dat, jako pole contacts
, byl také vícerozměrný. Organizovali byste skupiny na první úrovni a jednotlivé položky na druhé úrovni“ pod “ skupinami.
- Countries - A - Afghanistan - Albania - ... - B - Bahamas - Bahrain - ... - C - Cambodia - Cameroon - ...
počet skupin je roven countries.count
, a počet zemí, v jedné skupině se rovná countries.count
, kde x
je v sekci index. Tento index sekce je uveden jako parametr v tableView(_:numberOfRowsInSection:)
.
všimli jste si, jak tyto dvě funkce mají parametr nazvaný tableView
? To je součást objektově orientovaného programovacího principu. Technicky můžete použít zdroj dat zobrazení tabulky a delegovat přizpůsobení více pohledů tabulky. Pomocí tableView
určíte, se kterým zobrazením tabulky pracujete.
Představte si, že máte aplikaci Kontakty, která dokáže zobrazit telefonní čísla podle jména nebo telefonních čísel organizovaných společností. Můžete to implementovat několika způsoby, například opětovným použitím řadičů zobrazení tabulky. Nebo co když chcete znovu použít rozvržení aplikace Kontakty Pro zobrazení podobných informací,jako jsou restaurace, místa nebo uživatelská jména Skype? To je místo, kde kód re-použití s OOP přichází!
poskytování buněk regulátoru zobrazení tabulky
dostáváme se tam! Pojďme k nejdůležitější funkci řadiče zobrazení tabulky: tableView(_:cellForRowAt:)
.
Budeme implementovat funkci, než se ponoříme do detailů, ale je tam pár věcí, které musíte pochopit, o tom:
- Když se to jmenuje
- Co index cesta je
- Jak to re-použití buněk
Nejprve přidat následující funkce na ContactsTableViewController
třídy:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{}
Zde je návod, jak to funguje:
- funkce přepíše její nadtřídy provedení z
UITableViewController
. Už víte, jak to funguje, že? Přepisujeme výchozí implementaci a nahrazujeme vlastní. Je to proto, žeUITableViewController
již pro nás implementoval delegáta zobrazení tabulky a zdroj dat. - stejně jako dříve má funkce jeden parametr
tableView
, který můžeme použít k identifikaci zobrazení tabulky, na které je tato funkce vyvolána. - dalším parametrem je
indexPath
s označením argumentucellForRowAt
. Cesta indexu identifikuje indexyrow
asection
buňky. Více o tom později. - typ návratu funkce je
UITableViewCell
. Hej, to je zajímavé. Tato funkce je volána regulátorem zobrazení tabulky, pokaždé, když potřebujeme poskytnout buňku zobrazení tabulky!
když procházíte kontakty v této aplikaci, pokaždé, když je třeba zobrazit buňku na obrazovce, je volána funkce tableView(_:cellForRowAt:)
. Pokaždé! Za chvíli ti to dokážu.
dále zapíšeme tělo funkce. Do funkce přidejte následující kód:
let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)print("\(#function) --- section = \(indexPath.section), row = \(indexPath.row)")cell.textLabel?.text = contactsreturn cell
tady je to, co se stane:
- nejprve dequeue buňku s identifikátorem. Je to přesně stejný identifikátor, jaký jsme použili dříve, při registraci buňky. Tímto způsobem zobrazení tabulky ví, jaký typ buňky chceme. Dequeued buňka je přiřazena ke konstantě
cell
. Nyní máme buňku zobrazení tabulky, se kterou můžeme pracovat. Více o dequeuingu později. - poté vytiskneme některé informace do konzoly. To je, takže můžeme vidět, kdy je tato funkce volána, když aplikace běží.
- poté přiřadíme název kontaktu textovému štítku této buňky zobrazení tabulky.
contacts
obsahuje hodnotu jména kontaktu, ke kterému se dostaneme pomocíindexPath.row
. Každá instanceUITableViewCell
má vlastnosttextLabel
UILabel
a každý štítek tohoto typu má vlastnosttext
. Můžete jej použít k nastavení textu na štítku.
nebojte se, projdeme každou z těchto věcí podrobněji. Nejprve zjistěte, zda můžete aplikaci spustit. Vidíte jména kontaktů? Vidíte výstup ladění v konzole? Zkuste posouvat aplikaci!
kdy se nazývá“ tableView(_:cellForRowAt:)“?
pokud jste spustili aplikaci Kontakty a hráli jste si s posouváním nahoru a dolů, nemůžete si nevšimnout, že při každém posouvání se v konzole zobrazí výstup ladění.
pokaždé, když se objeví buňka, která předtím nebyla na obrazovce, je volána funkce tableView(_:cellForRowAt:)
a v konzole se objeví nový řádek.
kdy se tedy volá tableView(_:cellForRowAt:)
? Pokaždé, když je třeba zobrazit buňku tabulky na obrazovce!
řadič zobrazení tabulky určil, že je potřeba buňka, takže volá tableView(_:cellForRowAt:)
. Naše implementace této funkce dequeues buňku, změní ji, a poskytuje ji zpět do řadiče zobrazení tabulky. Řadič zobrazení tabulky a rámec UIKit jej poté vykreslí graficky na obrazovce.
co je indexová cesta?
pokaždé, když řadič zobrazení tabulky potřebuje buňku z tableView(_:cellForRowAt:)
, poskytuje jako argument pro funkci cestu indexu. V těle funkce můžete pomocí parametru indexPath
přesně zjistit, kterou buňku regulátor zobrazení tabulky potřebuje.
cesta indexu je jako adresa nebo souřadnice v mřížce. Typický graf má osu X a osu Y, takže můžete vyjádřit souřadnici v tomto grafu jako x, y
jako 0, 1
a 42, 3
. Podobně tabulka obsahuje řádky a sloupce s indexy.
zobrazení tabulky používá sekce a řádky. Jak již bylo uvedeno výše, můžete pomocí sekcí seskupit buňky dohromady. Naše aplikace má pouze jednu sekci a má řádky contacts.count
. Řádky zobrazení tabulky běží shora dolů.
řekl jinak: sekce a řádky zobrazení tabulky jsou sloupce a řádky tabulky. Cesta indexu definuje umístění v zobrazení tabulky pomocí řádku a sekce.
řádky a sekce jsou reprezentovány čísly nazývanými indexy. Tyto indexy začínají na nule, takže první řádek a sekce budou mít Indexové číslo 0
.
když se podíváte zpět na předchozí snímek obrazovky, dává to mnohem větší smysl. První buňka má indexovou cestu 0, 0
, druhá buňka 0, 1
a pokračuje až k poslední viditelné buňce s indexovou cestou 0, 11
.
mechanismus opětovného použití zobrazení tabulky
nejpozoruhodnější na zobrazení tabulky je jeho mechanismus opětovného použití buněk. Je to vlastně docela jednoduché.
- pokaždé, když regulátor zobrazení tabulky potřebuje zobrazit buňku na obrazovce, je volána funkce
tableView(_:cellForRowAt:)
, jak jsme diskutovali dříve. - namísto vytvoření nové buňky zobrazení tabulky při každém vyvolání této funkce vybere dříve vytvořenou buňku z fronty.
- buňka se resetuje do prázdného stavu, vymaže svůj vzhled a buňka se znovu přizpůsobí v
tableView(_:cellForRowAt:)
. - kdykoli je buňka posunuta mimo obrazovku, není zničena. Je přidán do fronty a čeká na opětovné použití.
je to docela chytré, že? Místo vytváření a mazání buněk je jednoduše znovu použijete. Ale … proč?
je mnohem méně náročné na paměť pro opětovné použití buněk. Řadič zobrazení tabulky by při vytváření a mazání buněk neustále zapisoval do paměti. Správa paměti by byla také intenzivnější. Při opětovném použití buněk se paměť používá efektivněji a je zapotřebí méně paměťových operací.
itt je také o něco méně náročné na CPU, aby znovu použil buňky místo jejich vytváření a mazání, protože ve srovnání s vytvářením a mazáním buněk je jednoduše méně operací.
když rychle procházíte pohledem tabulky, nevidíte nové buňky – vidíte stejné buňky znovu a znovu, s novými informacemi.
kód zapojeni s mobilní použití je to:
let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)
funkce dequeueReusableCell(withIdentifier:)
pokusy dequeue buňky. Pokud nejsou ve frontě žádné buňky, vytvoří pro nás buňku. Identifikátor se používá k udržení každého typu buňky ve vlastní frontě a k zajištění toho, aby byla správná třída použita k vytvoření nových buněk.
Naučte se, jak vytvořit iOS aplikace
začínáme s iOS 14 a Swift 5
Přihlásit se na můj iOS vývoj kurzu a naučte se, jak vytvořit skvělé iOS 14 aplikace s rychlým Xcode 5 a 12.
reakce na interakci uživatele
jedna věc chybí z našeho řadiče zobrazení tabulky: schopnost volat lidi v našem seznamu kontaktů! Ale než to uděláme, ujistěte se, že v ovladači zobrazení tabulky můžete také vidět telefonní číslo kontaktu.
výchozí třída UITableViewCell
má 4 různé typy, jak je vyjádřeno ve výčtu UITableViewCellStyle
. Můžete si vybrat mezi:
-
.default
– jednoduché zobrazení s jedním řádkem černý text -
.value1
– jednoduché zobrazení s jedním řádkem černý text na levé straně, a malý modrý štítek na pravé straně (používá se v Nastavení aplikace) -
.value2
– jednoduché zobrazení s jedním řádkem černý text na pravé straně, a malý modrý štítek na levé straně (používá se v aplikaci Kontakty) -
.subtitle
– jednoduché zobrazení s jedním řádkem černý text, a menší linie šedý text pod
Většina vývojářů použít vlastní zobrazení tabulky, buňky v těchto dnech, takže nebudete vidět tyto buněčné typy, které se často. Ale jsou tam!
musíme mírně upravit kód v tableView(_:cellForRowAt:)
. Nahraďte první řádek funkce následujícím kódem:
var cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier")if cell == nil{ cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cellIdentifier")}
pokud se podíváte pozorně, uvidíte, že jsme odstranili for: indexPath
část hovoru dequeueReusableCell(...)
. Místo toho tato funkce nyní vrací volitelné. Když nemůže dequeue buňku, funkce vrátí nil
.
pak skočíme do sebe a vytvoříme buňku, pokud je nil
. Vidíte to v druhé části kodexu. Pomocí podmíněného příkazu if
zkontrolujete, zda se cell
rovná nil
, a pokud je to pravda, vytvoříte buňku pomocí inicializátoru UITableViewCell(style:reuseIdentifier:)
.
tento inicializátor získá dva argumenty, styl buňky .subtitle
a identifikátor, který jsme použili dříve.
v tomto okamžiku máme problém, protože cell
je nyní volitelný! Jeho typ je UITableViewCell?
, ale typ návratu funkce vyžaduje, abychom vrátili instanci s nepovinným typem UITableViewCell
.
naštěstí je to jeden z těch případů, kdy můžeme bezpečně použít rozbalení síly k rozbalení volitelné hodnoty. Vzhledem k tomu, jak je náš kód napsán, je nemožné, aby cell
byl nil
nad rámec podmíněného. Můžete zaručit, že cell
není nil
po příkazu if
.
ujistěte se, že aktualizovat funkci použít sílu rozbalení cell
. Přidejte také následující řádek kódu níže cell!.textLabel ...
a nastavte titulky buňky zobrazit telefonní číslo kontaktu.
cell!.detailTextLabel?.text = contacts
celá funkce nyní vypadá takto:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ var cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier") if cell == nil { cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cellIdentifier") } print("\(#function) --- section = \(indexPath.section), row = \(indexPath.row)") cell!.textLabel?.text = contacts cell!.detailTextLabel?.text = contacts return cell!}
nakonec nezapomeňte odstranit následující řádek z viewDidLoad()
. Zabrání tomu, aby zobrazení tabulky inicializovalo buňky s nesprávným typem.
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellIdentifier")
mocná pokuta! Spusťte aplikaci pomocí Command + R nebo tlačítka Play a zkontrolujte, zda funguje. Vidíte jména a telefonní čísla? Dobře!
pak pro pièce-de-résistance přidáme tuto funkci interakce uživatele. Nyní, když jste se naučili složitosti řadiče zobrazení tabulky, myslím, že už víte, jak tato další funkce funguje.
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ if let url = URL(string: "tel://" + contacts) { UIApplication.shared.open(url) }}
opět přepisujeme výchozí implementaci funkce tableView(_:didSelectRowAt:)
. Tato funkce se nazývá, když uživatel klepne na buňku zobrazení tabulky a patří do protokolu UITableViewDelegate
. Stejně jako ostatní funkce poskytuje indexovou cestu buňky, která je poklepána.
v těle funkce jednoduše vytváříme tel://
URL z telefonního čísla. Poté řekneme aplikaci, aby tuto adresu URL otevřela, což účinně řekne iOS, aby zahájil volání na toto číslo. Tento kód je zde pouze pro ilustrativní účely. Všimněte si, že to nefunguje na simulátoru iPhone a že čísla v naší aplikaci jsou falešná. (Přesto byste tento kód použili, pokud vytváříte aplikaci pro skutečné kontakty!)
do funkce můžete přidat následující kód, pokud chcete zkontrolovat, zda funguje v pořádku.
print("\(#function) --- Calling: \(contacts)")
tím se vytiskne ladicí zpráva, když klepnete na buňku zobrazení tabulky.
další čtení
a to je vše, co je k tomu! Byl to docela výlet, ale teď víte, jak funguje řadič zobrazení tabulky.