Práce s Tabulkou View Controllers v rychlém

Napsal Reinder de Vries 3. srpna 2020, Vývoj Aplikací, iOS

Práce s Tabulkou View Controllers v rychlém

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!

  1. Jak Tabulka Pohled Řadič Funguje
  2. vytvoření Jednoduché Tabulky, View Controller
  3. Kódování Tabulky View Controller Zdroj Dat
  4. Poskytování Buněk do Tabulky View Controller
  5. v Reakci na Interakci Uživatele
  6. 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:

Table view controller příklad

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řída UIScrollView.
  • 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

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í.

tabulka view controller Class diagram

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:

  1. Vytváření pohledů programově, tj. kódování je ručně
  2. Nastavení UIs v Interface Builder a spojovat je s Swift kód prostřednictvím XIBs
  3. Nastavení UIs a jejich přechody v Interface Builder pomocí Storyboardů
  4. (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:

  1. klepněte Pravým tlačítkem myši projektu v Navigátoru Projektu a vybrat Nový Soubor…
  2. Vyberte Cocoa Touch šablony Třídy (iOS)
  3. Vybrat UITableViewController pro Podtřídu
  4. Název třídy ContactsTableViewController
  5. netikají Také vytvořit soubor s příponou XIB
  6. Konečně, klepněte na tlačítko Další a soubor uložit vedle jiných Swift soubory

a Konečně, tento:

  1. Přejděte do Main.storyboard a odstranit stávající View Controller Scéna
  2. Přidat novou Tabulku View Controller na storyboard pomocí Knihovny
  3. S table view controller vybrána, Atributy, Inspektor a zaškrtněte Je Počáteční View Controller políčko
  4. 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.

Xcode tabulka zobrazení řadič nastavit

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.

 podívejte se na dokumentaci řadiče zobrazení tabulky v Xcode

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!

Tabulka pohled řadič, například v iPhone Simulator

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ázvem contacts. 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álu contacts, 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:

  1. poskytnutím třídy buňky zobrazení tabulky a identifikátoru
  2. 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, že UITableViewController 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 argumentu cellForRowAt. Cesta indexu identifikuje indexy row a section 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á instance UITableViewCell má vlastnost textLabel UILabel a každý štítek tohoto typu má vlastnost text. 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!

 řádky řadiče zobrazení tabulky

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.