Arbeide Med Tabellvisningskontrollere I Swift

Skrevet Av Reinder De Vries 3. August 2020 i Apputvikling, iOS

Arbeide Med Table View Controllers I Swift

i denne opplæringen vil jeg vise deg trinnvis hvordan table view controllers fungerer, og hvordan du kan bruke dem. Vi går inn i hele spekteret av UITableViewController, ved å dykke inn I Objektorientert Programmering, delegering og bak-kulissene-mekanismene i tabellvisninger.

en tabellvisningskontroller viser strukturert, repeterbar informasjon i en vertikal liste. Du bruker klassen UITableViewController i iOS-appen til å bygge en tabellvisningskontroller.

Arbeid med en tabellvisningskontroller betyr også å jobbe med noen viktige iOS – utviklingskonsepter, for eksempel underklasse, delegeringsdesignmønsteret og gjenbruk av visninger.

Det er viktig for profesjonelle og praktiske iOS-utviklere (dvs!) for å mestre arbeidet med tabellvisning kontrollere. Når du har blitt vant til å jobbe med en så mangesidig UI-komponent, som UITableViewController, vil andre mer komplekse aspekter av iOS-utvikling også begynne å gi mening.

Klar? La oss dykke inn!

  1. Slik Fungerer En Tabellvisningskontroller
  2. Sette Opp En Enkel Tabellvisningskontroller
  3. Koding Av Datakilden For Tabellvisningskontrolleren
  4. Gi Celler Til Tabellvisningskontrolleren
  5. Svare På Brukerinteraksjon
  6. Videre Lesing

Hvordan En Tabell vis controller fungerer

hvis Du Har Brukt En Ios-App Før, Har Du Brukt Tabellvisningskontrollere Før. De brukes som ofte i iOS apps!

her er et eksempel på en tabellvisning-kontroller:

Eksempel På Bordvisningskontroller

en bordvisningskontroller har vanligvis disse synlige komponentene:

  • en tabellvisning, som er brukergrensesnittkomponenten eller visningen, som vises på skjermen. En tabellvisning er en forekomst av klassen UITableView, som er en underklasse av UIScrollView.
  • Tabellvisningsceller, som er de repeterbare radene eller visningene, som vises i tabellvisningen. En tabellvisningscelle er en forekomst av en klasse UITableViewCell, og denne klassen er ofte underklasse for å opprette egendefinerte tabellvisningsceller.

en bordvisning kontrolleren er også avhengig av bruk av disse komponentene, bak kulissene:

  • en representant for tabellvisning, som er ansvarlig for å administrere oppsettet for tabellvisningen og svare på brukerinteraksjonshendelser. En representant for tabellvisning er en forekomst av klassen UITableViewDelegate.
  • en datakilde for tabellvisning, som er ansvarlig for å administrere dataene i en tabellvisning, inkludert celler og inndelinger for tabellvisning. En datakilde er en forekomst av klassen UITableViewDataSource.

en navigasjonskontroller brukes ofte sammen med en tabellvisningskontroller for å aktivere navigering mellom tabellvisningen og påfølgende visningskontrollere, og for å vise et navigasjonsfelt over tabellvisningen.

den mest interessante delen av å jobbe med tabellvisningskontrollere er selve tabellvisningskontrolleren! Hvordan det?

er Du kjent Med Modell-View-Controller arkitektur? I Henhold Til Model-View-Controller-arkitekturen er en tabellvisning og en tabellvisning-celle visninger, og en tabellvisning-kontroller er en kontroller.

Visninger er ansvarlige for å vise informasjon synlig for brukeren, med et brukergrensesnitt (UI). Kontrollører er ansvarlige for å implementere logikk, administrere data og ta beslutninger. Sa annerledes: du kan ikke se en kontroller, men den er der, og styrer det du ser gjennom visninger.

når du bruker en tabellvisningskontroller i appen, underklasserer du UITableViewController – klassen. Klassen UITableViewController er en underklasse Av UIViewController.

her er klassehierarkiet for en tabellvisningskontroller som viser kontaktinformasjon:

  • en forekomst av ContactsTableViewController
    • underklasser UITableViewController
      • underklasser UIViewController

I henhold til Prinsippene For Objektorientert Programmering (Oop), når klasse RaceCar underklasser klasse Vehicle, arver den egenskapene og funksjonene til den superklassen, for eksempel maxSpeed og drive().

Vehicle – klassen kalles da superklassen til RaceCar. Dette prinsippet kalles arv.

Forvirrende? Det kan være! Tenk på det slik: for at tabellvisningskontrolleren skal fungere OK, må du arve en haug med kode, slik at du ikke trenger å skrive all den koden selv. Klassehierarkiet, OG OOP, er der for å strukturere den arven.

 Klassediagram For Tabellvisningskontroller

du kan arbeide med tabellvisninger uten å bruke en tabellvisningskontroller. Bare legg til en UITableView til en visningskontroller, gi den med implementeringer av tabellvisning representant og datakilde funksjoner, og du er ferdig.

klassen UITableViewController inneholder standard implementeringer av disse funksjonene for tabellvisning representant og tabellvisning datakilde. Det er et viktig aspekt ved å jobbe med en table view-kontroller!

som du vil se i de neste kapitlene i denne opplæringen, vil vi overstyre disse funksjonene med våre egne implementeringer. Vi kan tilpasse table view controller ved å gjøre det.

Finn ut hvordan du bygger iOS-apper

Kom i gang med iOS 14 Og Swift 5

Registrer deg for mitt iOS-utviklingskurs, og lær hvordan du bygger flotte iOS 14-apper Med Swift 5 og Xcode 12.

Sette opp En Enkel Table View Controller

Ok, la oss sette alt det i praksis. I denne delen skal vi bygge en enkel tabellvisning-kontroller. Du skal implementere funksjonene som trengs for å få det til å fungere, og jeg skal forklare hvordan de fungerer mens vi går. La oss komme oss videre!

Du kan bruke 3 forskjellige tilnærminger til å jobbe Med UIs I Xcode:

  1. Opprette visninger programmatisk, dvs. kode dem for hånd
  2. Sette Opp UIs I Interface Builder og koble dem Med Swift-kode via XIBs
  3. Sette Opp UIs og deres overganger i Interface Builder ved Hjelp Av Storyboards
  4. (Teknisk sett kan Du også bruke SwiftUI, men som for table view-kontrollere, er det utenfor omfanget av denne opplæringen.)

det er kjedelig og uproduktivt å kode UIs for hånd. Hvis du ikke er forsiktig Med Storyboards, ender de opp med å skjule kompleksitet fra utvikleren. Vi skal jobbe Med Storyboards, mens vi finner ut nøyaktig hvordan de jobber bak kulissene.

Her er hva du skal gjøre:

opprett Først Et Nytt xcode-prosjekt Via Fil → Nytt → Prosjekt…. Pass på å velge App-malen, og velg Storyboard For Interface og UIKit App Delegate For Life Cycle.

deretter tar du disse trinnene:

  1. Høyreklikk på prosjektet i Prosjektnavigatoren Og velg Ny Fil…
  2. Velg Cocoa Touch-Klassemalen (iOS)
  3. Velg UITableViewController For Underklasse av
  4. Navngi klassen ContactsTableViewController
  5. ikke kryss av for opprett OGSÅ XIB-fil
  6. Til Slutt, klikk neste og lagre filen sammen med de andre swift-filene

Til Slutt Gjør Dette:

  1. Gå inn Main.storyboard og fjern den eksisterende Visningskontrollscenen
  2. Legg til en ny Tabellvisningskontroller i storyboardet via Biblioteket
  3. med tabellvisningskontrolleren valgt, gå Til Attributter Inspektøren og merk Av For Is Initial View Controller
  4. Til Slutt går du Til Identity Inspector Og setter Klasse Til ContactsTableViewController

Det er det! Du har nå en tabellvisningskontroller inne i prosjektets storyboard, og du har koblet den til Swift-klassen ContactsTableViewController.

xcode table view controller sett opp

som du har gjettet, er ContactsTableViewController – klassen en underklasse av UITableViewController. Du kan se Det i Swift-filen, øverst, i klassedeklarasjonen.

class ContactsTableViewController: UITableViewController { ···

denne syntaksen betyr: klassen ContactsTableViewController er en underklasse av UITableViewController.

når du høyreklikker på» UITableViewController » mens Du holder Tilvalg-tasten, kan du se i klassedeklarasjonen at UITableViewController er en underklasse av UIViewController og overholder protokollene UITableViewDelegate og UITableViewDataSource.

 Se dokumentasjonen For Tabellvisning I xcode

det er kraften til tabellvisning-kontrolleren! Det gir oss ikke bare de enkelte komponentene for å lage en tabellvisning, kontrolleren gir også en standardimplementering. Det er derfor vi underklasse UITableViewController, i stedet for å lage en tom visningskontroller med en tabellvisning.

Nå kan du kjøre appen med Command-R eller Avspillingsknappen, og se den tomme tabellvisningskontrolleren vises på skjermen.

Hvorfor er det forresten? Vi har ikke kodet noe ennå! Det er fordi tabellvisningskontrolleren har en standardimplementering, som bare viser tomme celler på skjermen. Ryddig!

 Tabell vis kontrolleren eksempel i iPhone Simulator

avhengig av hvilken Versjon Av Xcode du har, har vi brukt scenerepresentanten til å konfigurere den første visningskontrolleren for appprosjektet ditt. Lær mer her: Scenedirektøren I Xcode

EN XIB og EN NIB er i utgangspunktet det samme – de inneholder layoutinformasjon. EN XIB har ET XML-format, mens EN NIB har et binært format. XML er kompilert til binær når du bygger appen din, så Derfor Snakker uikits funksjoner alltid om en «nib», Mens Xcode alltid kaller det en»xib».

Koding Av Datakilden For Tabellvisningskontrolleren

nå som bordvisningskontrolleren er satt opp, la oss bringe den til liv! I dette kapittelet fokuserer vi på de forskjellige funksjonene du må implementere for å få bordvisningskontrolleren til å fungere.

som forklart tidligere, tilhører disse funksjonene enten representanten for tabellvisningskontrolleren eller datakilden for tabellvisningskontrolleren. Begge disse protokollene bruker delegering til å tilpasse tabellvisningen.

de viktigste funksjonene for UITableViewDataSource er:

  • numberOfSections(in:)
  • tableView(_:numberOfRowsInSection:)
  • tableView(_:cellForRowAt:)

Andre relevante funksjoner for UITableViewDelegate er:

  • tableView(_:didSelectRowAt:)
  • tableView(_:willDisplay:for:)

Du finner flere funksjoner i Apple Developer Documentation for UITableViewDelegate og UITableViewDataSource.

Legge Til Kontaktdataene

du skal begynne med å legge til kontaktinformasjonsdataene for tabellvisningskontrolleren. Legg til følgende egenskap i klassen ContactsTableViewController :

let contacts:] = , , , , , , , , , , , , , , , , ]

det er en rolodex vi alle vil ha, ikke sant? Slik fungerer det:

  • den let contacts erklærer en konstant med navn contacts. Du har lagt den til som en egenskap i klassen, slik at hver klasseforekomst har tilgang til denne konstanten gjennom klassens kode.
  • typen contacts er ], som er en rekke arrays av strenger. Du lager i hovedsak en matrise, hvorav elementene er arrays av strenger. (Et variabelnavn og dets type er adskilt med et kolon :)
  • koden = tilordner en array bokstavelig til contacts, fylt ut med navnene og telefonnumrene til noen få milliardærer.

på et senere tidspunkt kan vi bruke antall elementer i arrayet med contacts.count. Og vi kan få individuelle navn og telefonnumre med contacts og contacts, ved hjelp av senket syntaks.

Registrere En Celleklasse For Tabellvisning

før du kan bruke celler i en kontroller for tabellvisning, må du registrere dem i tabellvisningen. Du kan gjøre det på to måter:

  1. ved å gi en celleklasse for tabellvisning og en identifikator
  2. ved å gi en CELLE for tabellvisning OG EN identifikator

når du bruker en egendefinert celle for tabellvisning, vil du mest sannsynlig registrere EN XIB for dette. Når du bruker standard tabellvisningsceller eller en annen programmatisk celle, registrerer du klassen. Vi vil bruke klassen, for nå!

Legg til følgende kode i viewDidLoad() – funksjonen:

tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellIdentifier")

Pass på at du legger den til under super.viewDidLoad() – linjen. Som du sikkert vet, er funksjonen viewDidLoad() en del av visningskontrollens livssyklus, og tilhører klassen UIViewController.

du overstyrer viewDidLoad() – funksjonen for å svare på denne hendelsen i livssyklusen til en visningskontroller, slik at du kan konfigurere visningen etter at den er lastet inn. I vårt tilfelle bruker vi funksjonen til å registrere tabellvisningscellen.

når du registrerer en celle for tabellvisning, må du også oppgi en identifikator. Dette er bare å knytte klassen av cellen med et navn du kan bruke senere, når dequeuing cellen i tableView(_:cellForRowAt:).

er du fortsatt med meg? La oss gå videre!

Implementering av «numberOfSections (in:)»

den første delegatfunksjonen vi skal implementere er numberOfSections(in:).

en tabellvisning kan ha flere inndelinger eller grupper. Hver gruppe har en topptekst som flyter på toppen av den vertikale raden av celler. I En Kontakter app, du kan gruppere kontakter sammen alfabetisk. Dette gjøres faktisk I Kontakter-appen på iPhone, der kontaktene er gruppert A-Z.

appen vi bygger har bare en seksjon. Legg til følgende funksjon i klassen:

override func numberOfSections(in tableView: UITableView) -> Int{ return 1}

Enkelt, ikke sant? Funksjonen returnerer 1 når den kalles.

Implementering av»tableView(_:numberOfRowsInSection:)»

en lignende funksjon er tableView(_:numberOfRowsInSection:). I stedet for å gi antall seksjoner, gir det antall rader i en seksjon. Fordi en tabellvisning viser celler i en loddrett liste, tilsvarer hver celle en rad i tabellvisningen.

appen vi bygger har bare en seksjon, og den ene delen har et antall elementer som er lik antall elementer i contacts – arrayet. Så, det er contacts.count!

Legg til følgende funksjon i klassen:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ return contacts.count}

Se hvordan det fungerer? Vi returnerer bare contacts.count. Hvis du skulle legge til et annet navn og telefonnummer til contacts, ville det også vises pent i tabellvisningen.

Forstå Rader Og Seksjoner

Vår Kontaktapp er endimensjonal, den viser bare en liste over navn og telefonnumre, og den bruker ikke grupper. Men hva om du har en gruppert tabellvisning?

i de fleste tilfeller vil datakilden din, som contacts – arrayet, også være flerdimensjonal. Du vil organisere grupper på første nivå, og individuelle elementer på andre nivå, «under» gruppene.

- Countries - A - Afghanistan - Albania - ... - B - Bahamas - Bahrain - ... - C - Cambodia - Cameroon - ...

antall grupper er lik countries.count, og antall land i en enkelt gruppe er lik countries.count, hvor x er seksjonsindeksen. Denne seksjonsindeksen er gitt som en parameter i tableView(_:numberOfRowsInSection:).

la du merke til hvordan disse to funksjonene har en parameter kalt tableView? Det er En Del Av Det Objektorienterte Programmeringsprinsippet. Du kan teknisk bruke en datakilde for tabellvisning og representant til å tilpasse flere tabellvisninger. Du vil bruke tableView til å identifisere hvilken tabellvisning du arbeider med.

Tenk Deg at Du har En Kontaktapp som kan vise telefonnumre etter navn eller telefonnumre organisert av selskapet. Du kan implementere det på flere måter, for eksempel ved å gjenbruke tabellvisningskontrollere. Eller hva om du vil gjenbruke oppsettet Av Kontakter-appen for å vise lignende informasjon, som restauranter, arenaer eller Skype-brukernavn? Det er der kode gjenbruk MED OOP kommer inn!

Gir Celler Til Tabellvisningskontrolleren

Vi kommer dit! La oss gå videre til den viktigste funksjonen til en tabellvisningskontroller: tableView(_:cellForRowAt:).

Vi implementerer funksjonen før du dykker inn i detaljene, men det er et par ting du trenger å forstå om det:

  • Når det kalles
  • hva en indeksbane er
  • hvordan den bruker celler

først legger du til følgende funksjon i ContactsTableViewController – klassen:

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

Slik fungerer det:

  • funksjonen overstyrer sin superclass implementering fra UITableViewController. Nå vet du hvordan det fungerer, ikke sant? Vi overstyrer standardimplementeringen, og erstatter vår egen. Det er fordi UITableViewController allerede har implementert tabellvisning representant og datakilde for oss.
  • som før har funksjonen en parameter tableView som vi kan bruke til å identifisere tabellvisningen som denne funksjonen kalles på.
  • En annen parameter er indexPath, med argumentetikett cellForRowAt. Indeksbanen identifiserer cellens row og section indekser. Mer om det senere.
  • funksjonen returtype er UITableViewCell. Det er interessant. Denne funksjonen kalles av table view controller, hver gang vi trenger å gi en tabellvisning celle!

når du blar gjennom kontaktene i dette programmet, hver gang en celle må vises på skjermen, funksjonen tableView(_:cellForRowAt:) kalles. Hver gang! Jeg skal bevise det for deg om et øyeblikk.

Neste opp, la oss skrive funksjonens kropp. Legg til følgende kode inne i funksjonen:

let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)print("\(#function) --- section = \(indexPath.section), row = \(indexPath.row)")cell.textLabel?.text = contactsreturn cell

Her er hva som skjer:

  • Først dequeue vi en celle med en identifikator. Det er nøyaktig den samme identifikatoren vi brukte før, da vi registrerte cellen. På den måten vet tabellvisningen hvilken type celle vi vil ha. Dequeued cellen er tilordnet til konstanten cell. Nå har vi en tabellvisning celle å jobbe med. Mer om dequeuing senere.
  • deretter skriver vi ut litt informasjon til Konsollen. Dette er slik at vi kan se når denne funksjonen kalles, når appen kjører.
  • deretter tilordner vi navnet på kontakten til tekstetiketten til denne tabellvisningscellen. contacts inneholder verdien av navnet på kontakten, som vi får til ved å bruke indexPath.row. Hver forekomst av UITableViewCell har en egenskap textLabel av UILabel, og hver etikett av denne typen har en egenskap text. Du bruker den til å angi teksten på etiketten.

ikke bekymre deg, vi vil gå over hver av disse tingene mer detaljert. Først, se om du kan kjøre appen din. Ser du kontaktnavn? Ser du feilsøkingsutgangen i Konsollen? Prøv å rulle app!

tabell vis controller rader

Når Kalles «tableView(_:cellForRowAt:)»?

hvis Du kjørte Kontakter-appen, og spilte rundt med å rulle opp og ned, kan du ikke unngå å legge merke til at hver gang du ruller, vises feilsøkingsutgang i Konsollen.

Hver gang en celle som ikke var på skjermen før vises, kalles funksjonen tableView(_:cellForRowAt:), og En ny linje vises i Konsollen.

Så når kalles tableView(_:cellForRowAt:)? Hver gang en tabellvisning celle må vises på skjermen!

tabellvisningskontrolleren har bestemt at en celle er nødvendig, så den kaller tableView(_:cellForRowAt:). Vår implementering av den funksjonen dequeues en celle, endrer den, og gir den tilbake til table view controller. Table view controller, Og UIKit framework, gjør det grafisk på skjermen.

Hva Er En Indeksbane?

Hver gang tabellvisningskontrolleren trenger en celle fra tableView(_:cellForRowAt:), gir den en indeksbane som et argument for funksjonen. Innenfor funksjonskroppen kan du bruke parameteren indexPath for å vite nøyaktig hvilken celle tabellvisningskontrolleren trenger.

en indeksbane er som en adresse eller en koordinat i et rutenett. En typisk graf har En x-akse Og En Y-akse, slik at du kan uttrykke en koordinat i den grafen som x, y som 0, 1 og 42, 3. På samme måte har et regneark rader og kolonner med indekser.

en tabellvisning bruker inndelinger og rader. Som nevnt tidligere, kan du bruke inndelinger til å gruppere celler sammen. Vår app har bare en seksjon, og den har contacts.count rader. Radene i tabellvisningen løper fra topp til bunn.

sa annerledes: seksjonene og radene i en tabellvisning er hva kolonner og rader er til et regneark. En indeksbane definerer en plassering i tabellvisningen ved hjelp av en rad og en inndeling.

radene og seksjonene er representert av tall, kalt indekser. Disse indeksene starter på null, så den første raden og delen vil ha indeksnummer 0.

når du ser tilbake på forrige skjermbilde, er det mye mer fornuftig. Den første cellen har indeksbane 0, 0, den andre cellen 0, 1, fortsetter opp til den siste synlige cellen med indeksbane 0, 11.

Mekanismen For Gjenbruk Av Tabellvisning

det som er mest bemerkelsesverdig med tabellvisningen er mekanismen for gjenbruk av celler. Det er ganske enkelt, faktisk.

  • Hver gang en tabellvisningskontroller må vise en celle på skjermen, kalles funksjonen tableView(_:cellForRowAt:), som vi har diskutert før.
  • I Stedet for å opprette en ny tabellvisning celle hver gang funksjonen kalles, plukker den av en tidligere opprettet celle fra en kø.
  • cellen tilbakestilles til en tom tilstand, fjerner utseendet, og cellen tilpasses igjen i tableView(_:cellForRowAt:).
  • Når en celle rulles utenfor skjermen, blir den ikke ødelagt. Det legges til i køen, venter på å bli gjenbrukt.

det er ganske smart, ikke sant? I stedet for å opprette og slette celler, bruker du dem bare på nytt. Men … hvorfor?

det er mye mindre minneintensivt å gjenbruke celler. Tabellvisningskontrolleren vil hele tiden skrive til minnet når du oppretter og sletter celler. Styring av minnet vil også være mer intensivt. Når celler gjenbrukes, brukes minnet mer effektivt, og mindre minneoperasjoner er nødvendig.

itt er også litt mindre CPU-intensiv for å gjenbruke celler i stedet for å opprette og slette dem, fordi det bare er mindre operasjoner involvert i gjenbruk, sammenlignet med å opprette og slette celler.

når du ruller raskt gjennom en tabellvisning, ser du ikke nye celler-du ser de samme cellene om og om igjen, med ny informasjon.

koden involvert med celle gjenbruk er dette:

let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)

funksjonen dequeueReusableCell(withIdentifier:) forsøker å dequeue en celle. Når ingen celler er i køen, vil det skape en celle for oss. Identifikatoren brukes til å holde hver type celle i sin egen kø, og for å sikre at riktig klasse brukes til å opprette nye celler.

Finn ut hvordan du bygger iOS-apper

Kom i gang med iOS 14 Og Swift 5

Registrer deg for mitt iOS-utviklingskurs, og lær hvordan du bygger flotte iOS 14-apper Med Swift 5 og Xcode 12.

Svare På Brukerinteraksjon

En ting mangler fra vår tabell view controller: muligheten til å ringe folk i vår kontaktliste! Men før vi gjør det, la oss sørge for at du også kan se en kontakt telefonnummer i tabellvisning kontrolleren.

standard UITableViewCell – klassen har 4 forskjellige typer, som uttrykt i UITableViewCellStyle – opplistingen. Du kan velge mellom:

  • .default – en enkel visning med en linje med svart tekst
  • .value1 – en enkel visning med en linje med svart tekst til venstre, og en liten blå etikett til høyre (brukt I Innstillinger-appen)
  • .value2 – en enkel visning med en linje med svart tekst til høyre og en liten blå etikett til venstre (brukt I Kontakter-appen)
  • .subtitle – en enkel visning med en linje med svart tekst og en mindre linje med grå tekst under den

de fleste utviklere bruker egendefinerte tabellvisningsceller i disse dager, slik at du ikke ser disse celletypene så ofte. Men de er der!

vi må justere koden litt i tableView(_:cellForRowAt:). Erstatt den første linjen i funksjonen med følgende kode:

var cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier")if cell == nil{ cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cellIdentifier")}

hvis du ser nøye etter, ser du at vi har fjernet for: indexPath – delen av dequeueReusableCell(...) – anropet. I stedet returnerer den funksjonen nå en valgfri. Når det ikke kan dequeue en celle, returnerer funksjonen nil.

vi hopper i oss selv for å lage cellen, hvis den er nil. Du ser det i den andre delen av koden. Du bruker en betinget if – setning for å kontrollere om cell er lik nil, og hvis det er sant, oppretter du cellen ved hjelp av UITableViewCell(style:reuseIdentifier:) – initialiseringen.

den initialisatoren får to argumenter, cellestilen .subtitle og identifikatoren vi brukte tidligere.

På dette punktet har vi et problem, fordi cell er et valgfritt nå! Dens type er UITableViewCell?, men funksjonen returtype krever at vi returnerer en forekomst med ikke-valgfri type UITableViewCell.

Heldigvis Er Dette En av de tilfellene der vi trygt kan bruke force unwrapping for å pakke ut den valgfrie verdien. På grunn av måten koden vår er skrevet på, er det umulig for cell å være nil utover det betingede. Du kan garantere at cell ikke er nil etter if – setningen.

sørg for å oppdatere funksjonen for å bruke force unprapping for cell. Legg også til følgende kodelinje under cell!.textLabel ... for å angi underteksten til cellen, vis telefonnummeret til kontakten.

cell!.detailTextLabel?.text = contacts

hele funksjonen ser nå slik ut:

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!}

Til slutt, sørg for å fjerne følgende linje fra viewDidLoad(). Det forhindrer tabellvisningen i å initialisere celler med feil type.

tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellIdentifier")

Mektig fint! Kjør appen Din Med Command + R eller Play-knappen, og sjekk om den fungerer. Ser du navn og telefonnummer? Bra!

la oss da legge til denne brukerinteraksjonsfunksjonen for piè-de-réistance. Nå som du har lært intricacies av table view controller, tror jeg du allerede vet hvordan denne neste funksjonen fungerer.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){ if let url = URL(string: "tel://" + contacts) { UIApplication.shared.open(url) }}

Igjen overstyrer vi standardimplementeringen av tableView(_:didSelectRowAt:) – funksjonen. Denne funksjonen kalles når en bruker trykker på cellen i en tabellvisning, og den tilhører protokollen UITableViewDelegate. Som de andre funksjonene, er det gitt indeksen banen til cellen som er tappet.

i funksjonskroppen oppretter vi ganske enkelt en tel:// URL fra telefonnummeret. Vi forteller deretter appen å åpne DEN NETTADRESSEN, som effektivt forteller iOS å starte et anrop til dette nummeret. Den koden er bare der for illustrative formal. Merk at dette ikke fungerer på iPhone Simulator, og at tallene i vår app er falske. (Fortsatt, du vil bruke denne koden hvis du gjør en ekte Kontakter app!)

du kan legge til følgende kode i funksjonen hvis du vil sjekke OM DET fungerer OK.

print("\(#function) --- Calling: \(contacts)")

dette vil skrive ut en feilsøkingsmelding når du trykker på cellen i tabellvisningen.

Videre Lesing

Og det er alt som skal til! Det har vært litt av en tur, men nå vet du hvordan en bordvisning kontrolleren fungerer.