Vabastage oma sisemine rakendusearendaja. Osa 20: Andmeloendite kuvamine

Kas teil on rakenduse idee, kuid teil pole selle loomise alustamiseks programmeerimisteadmisi? Selles iganädalases ajaveebisarjas tutvustan teid, mitteprogrammeerijat, samm-sammult läbi iPhone'i, iPod touchi ja iPadi jaoks rakenduste loomise protsessi. Liituge minuga igal nädalal sellel seiklusel ja kogete, kui lõbus võib olla oma ideede ellu viimine! See on sarja 20. osa. Kui te alles alustate, vaadake sarja algus siin (Seda postitust on värskendatud versioonidele Swift 1.2, Xcode 6.3 ja iOS 8) .

Siiani olete selles sarjas õppinud tabelivaadete kohta täpselt nii palju, et mõned põhiharjutused läbi teha. Selles postituses käsitlen mõningaid põhitõdesid ülevaatena ja seejärel sukeldume sügavalt tabelivaadetega andmeloendite haldamise maailma.



On väga oluline, et teil oleks selles postituses olevast teabest selge arusaam, sest sama mustrit kasutatakse ka muude kasutajaliidese juhtelementide jaoks, nagu koguvaated ja valijavaated.

Tabelivaadete mõistmine

Tabelivaateid kasutatakse andmete loendite kuvamiseks iOS-i rakendustes. Kui teil on oma iOS-i seade, olete tabelivaateid sageli kasutanud, kuna need on leitud enamikus Apple'i sisseehitatud rakendustes, näiteks seadetes ( Joonis 1 ), iTunes, Photos, Mail, Weather ja Contacts.

  Seadete tabeli vaade
Joonis 1 – tabelivaade Seaded rakendus

iOS-i tabelivaated põhinevad UITableView klass. Need on vaade mudeli-vaate-kontrolleri kujundusmustris. Tabelivaated on loodud suurte andmehulkade kuvamiseks ja neid saab konfigureerida nii, et need näeksid välja mis tahes soovitud viisil, mida tõendab iOS-i sisseehitatud rakendustes kasutatavate tabelivaadete lai valik.

On kolm peamist tabelivaate stiili – tavaline, indekseeritud ja rühmitatud – nagu näidatud Joonis 2 .

  Lihtsad, indekseeritud ja grupeeritud tabelivaated
Joonis 2 – tavalised, indekseeritud ja grupeeritud tabelivaated

Iga üksus tabelivaates on a rida ja tabelivaade sisaldavad piiramatul arvul ridu. Iga rida on ühe veeru laiune ja sisseehitatud stiilide kasutamisel võib see sisaldada pilti, teksti ja tarvikuikooni, näiteks avalikustamise indikaator (hall nool), mis on näidatud lahtrite paremal küljel Tavaline pilt sisse Joonis 2 .

Tabelivaate iga jaotus on a osa . Kui teil pole jaotusi, on teil ainult üks jaotis. Näiteks sisse Joonis 2 , Tavaline tabelivaates on ainult üks jaotis Indekseeritud tabelivaates on kakskümmend kuus jaotist ( A - FROM ) ja Rühmitatud tabelivaates on kaks osa.

iOS-i tabelivaade on käitamisajal ülikiire isegi tuhandete üksuste sirvimisel. Kuidas see seda saavutab? Olenemata loendis olevate üksuste arvust sisaldab tabelivaade ainult piisavalt lahtreid, et kuvada vaates nähtavad üksused, pluss mõned täiendavad lahtrid üksuste jaoks, mis peagi nähtavaks muutuvad. Seega, kuigi teie seadmes võib olla tuhandeid laule, on iTunes'i rakenduse tabelivaates igal ajahetkel vaid kümmekond aktiivset lahtrit, mis sisaldavad lauluteavet. Kui lahtrid keritakse vaateväljast välja, kasutatakse neid koheselt muu sisu kuvamiseks.

Tabelivaate täitmine andmetega

Niisiis, kuidas täita tabelivaade andmetega? Mõned tabelivaated on staatilised, nii et saate kujundamise ajal luua staatilisi lahtreid täpselt nii, nagu me tegime iAppsReview . Siiski on tavalisem, et tabelivaated täidetakse käitamisajal dünaamiliselt, nagu tegime minu viimastes põhiandmete postitustes.

iOS-i rakendustes ei täida dünaamiliselt täidetud tabelivaated end andmetega. Nad saavad oma andmed andmeallika objektilt – täpsemalt objektilt, mis rakendab UITableViewDataSource protokolli . See objekt on tavaliselt eksemplar UITableViewController klass, mis rakendab seda protokolli ja mille Apple töötas välja spetsiaalselt tabelivaadetega töötamiseks (Swift-protokolle käsitleme üksikasjalikumalt tulevases postituses, kuid praegu peate lihtsalt teadma, et protokoll määratleb standardse käitumise komplekti, mis klassifitseerib saab vastu võtta ja rakendada.) Selles kontekstis fraasitabeli vaade kontroller on mõistlik, sest see juhib tabelivaate andmetega täitmist. Tabelivaate kontrollerit võib pidada ka tehaseks, mis toodab tabelivaate nõudmisel lahtriobjekte.

Nagu olete juba õppinud, selle asemel, et panna kood, mis otsib olemeid otse vaatekontrollerisse, paneme koodi hoopis ärikontrollerisse ja kutsume seejärel vaatekontrollerist ärikontrolleri meetodid. Lõppkokkuvõttes peate siiski olema tuttav tavaliste tabelivaate kontrolleri meetoditega, kuna peate teadma meetodeid, mille abil peaksite ärikontrolleritele helistama.

Nagu näidatud Joonis 3 , UITableViewDataSource protokoll sisaldab kolme peamist meetodit, mida kasutatakse tabelivaate andmetega täitmiseks:

  • numberOfSectionsInTableView:
  • tableView:numberOfRowsInSection:
  • tableView:cellForRowAtIndexPath:

Teie ülesanne on luua oma tabelivaate jaoks kohandatud tabelivaate kontroller ja lisada kood nendele kolmele meetodile, mis suhtleb ärikontrolleriga.

  tabelivaate kontroller
Joonis 3 – tabelivaade kutsub tabelivaate kontrolleri meetodeid, mis omakorda kutsuvad meetodeid ärikontrolleris.

Käitusajal edastab see enne tabelivaate kuvamist sõnumikutsed tabelivaate kontrollerile järjekorras näidatud Joonis 4 .

  Helistamise järjekord
Joonis 4 - kutsumisjärjestus UITableViewDataSource meetodid

Siin on ülevaade sellest, mida iga meetod teeb:

  1. numberOfSectionsInTableView : kutsub tabelivaade kõigepealt välja. See meetod tagastab sektsioonide arvu tabelivaates. Näites sisse Joonis 4 , on tabelivaates kolm jaotist, seega naaseb see meetod 3 . Pärast selle meetodi väljakutsumist lisab tabelivaade endale määratud arvu jaotisi.
  1. tableView:numberOfRowsInSection: kutsub tabelivaade iga jaotise jaoks üks kord. See meetod tagastab määratud jaotise ridade arvu. Näites sisse Joonis 4 , kutsutakse seda meetodit kolm korda, kuna tabelivaates on kolm jaotist. Iga kord, kui tabelivaade seda meetodit kutsub, edastab see jaotise numbri, mis algab nullist, ühest ja seejärel kahest. Selles näites tagastab meetod iga jaotise jaoks järgmise ridade arvu:
  • 2 jaotise 0 jaoks
  • 1 jaotise 1 jaoks
  • 3 jaotise 2 jaoks

Tabelivaates sisse Joonis 4 , on iga jaotise ridade arv fikseeritud. Sageli määratakse ridade arv dünaamiliselt käitamise ajal. Näiteks iTunes'i rakenduses määrab loendis olevate lugude arvu iOS-i seadmesse salvestatud lugude arv.

  1. tableView:cellForRowAtIndexPath: kutsub tabelivaade üks kord iga tabelivaate nähtava (või nähtavaks muutuva) lahtri jaoks. See meetod tagastab määratud jaotise ja rea ​​jaoks tabelivaate lahtriobjekti. Aastal näidatud näites Joonis 4 , meetod on vajalik:
  • Jaotis 0, rida 0
  • Jaotis 0, rida 1
  • Jaotis 1, rida 0
  • 2. jaotise rida 0
  • 2. jaotise 1. rida
  • 2. jaotis, 2. rida

Sel viisil täidetakse tabelivaade käitamisajal dünaamiliselt üksustega.

Ärikontrollerite kasutamine

Mitmes viimases postituses kasutasite tabelivaadetes kuvatavate olemite toomiseks ärikontrolleri objekte. Joonis 5 näitab suurt pilti sellest, kuidas tabelivaate kontroller kasutab teenuseid Rakendusekategooria ärikontrolleri objekt rakenduse kategooria tabelivaate täitmiseks.

  Ärikontrolleri koostöö
Joonis 5 – tabelivaate kontrolleri ja ärikontrolleri koostöö

Siin on iga sammu üksikasjad. Soovitan tungivalt neid samme mitu korda läbi vaadata, kuni saate nende toimimise täielikult aru.

  1. Tabelivaate kontrolleris viewDidLoad meetod, näide Rakendusekategooria ärikontrolleri objekt luuakse ja talletatakse appCategory eksemplari muutuja.
  1. Tabelivaate kontroller kutsub seejärel välja getAllEntities: meetod Rakendusekategooria ärikontroller ja salvestab saadud andmed AppCategoryEntity objektid appCategoryList massiivi muutuja.
  1. Selle numberOfSectionsIn TableView: meetodil, tagastab tabelivaate kontroller 1 , kuna tabelivaates on ainult üks jaotis.
  1. Aastal tableView:numberOfRowsInSection: meetodil, tagastab tabelivaate kontroller arvu AppCategoryEntity üksuses salvestatud esemed appCategorytList massiivi muutuja.
  1. Selle tableView:cellForRowAtIndexPath: meetodil, hangib tabelivaate kontroller an AppCategoryEntity objekt alates appCategoryList massiivi, kasutades määratud reanumbrit, ja kasutab olemit tabelivaatesse tagastatava lahtri konfigureerimiseks.

Loodetavasti aitab see diagramm teil selgemalt mõista tabelivaate kontrolleri ja ettevõtte kontrolleri vahelist suhtlust.

Kohandatud tabelivaate kontrollerid

Kui lisate süžeeskeemile tabelivaate kontrolleri, nagu tegite enamiku stseenide puhul iAppsReview , kuigi algselt lõite prototüüprakendust, eksemplari UITableViewController loodi automaatselt, et saaksite tabelivaateid hallata – kuigi tabelivaadete sisu oli staatiline. Kuid nende stseenide tabelivaadete dünaamilise sisu pakkumiseks peate iga stseeni jaoks looma kohandatud tabelivaate kontrolleri.

Siin on põhitoimingud, mida teete kohandatud tabelivaate kontrolleri loomiseks.

  1. Looge uus alamklass UITableViewController (näiteks, AppCategoryViewController ).
  1. Minge süžeeskeemile, klõpsake stseeni ülaosas olekuribal, mille soovite uue vaatekontrolleriga seostada, seejärel minge identiteediinspektorisse ja muutke Klass tabelivaate kontrollerist klassi, mille lõite eelmises etapis.

Näiteks sisse joonis 6, vaikimisi UITableViewController klass on muudetud harjumuspäraseks AppCategoryViewController klass.

  Määra vaatekontrolleri klass
Joonis 6 – kohandatud tabelivaate kontrolleri klassi määramine

Kui leiate end olukorrast, kus olete loonud konkreetse stseeni jaoks kohandatud vaate kontrolleri, kuid tabelivaates ei kuvata andmeid, võib juhtuda, et olete selle teise sammu unustanud!

Tabelivaate lahtrite seadistamine

sisse 17. osa sellest seeriast lisasite koodi tableView:cellForRowAtIndexPath: meetod AppCategoryViewController klass, mis konfigureeris lahtrid tabelivaates. Vaatame seda koodi lähemalt, et veenduda, et mõistate, mis toimub.

Käitusajal, kui tabelivaade täidetakse, läbib see a tableView:cellForRowAtIndexPath: sõnum sellega seotud tabelivaate kontrollerile üks kord iga tabelivaate lahtri kohta. Põhimõtteliselt nõuab tabelivaade, et tabelivaate kontroller tagastaks määratud jaotise ja rea ​​jaoks täielikult konfigureeritud lahtriobjekti.

Joonis 7 annab ülevaate tabelivaate ja tabelivaate kontrolleri interaktsioonist, kui tableView:cellForRowAtIndexPath: meetod käivitatakse käitusajal.

  Seadistage lahter
Joonis 7 – tabelivaate lahtri konfigureerimine käitusajal
  1. Tabelivaade kutsub tabelivaate kontrollerit tableView:cellForRowAtIndexPath: meetod, läbides an indexPath objektiks. See indexPath objektil on osa ja rida atribuudid, mis näitavad lahtri sektsiooni ja rida, mida tabelivaade tabelivaate kontrollerilt taotleb.
  1. Tabelivaate kontroller kutsub tagasi tabelivaate dequeueResusableCellWithIdentifier: meetod, läbides a CellIdentifier väärtus.

Kui kasutaja kerib käitamise ajal tabelivaadet, lisatakse ekraanilt välja kerivad lahtrid lahtrite järjekorda, mida saab uuesti kasutada. Kui tabelivaade on dequeueReusableCellWithIdentifier: meetodit, kontrollib tabelivaade, kas järjekorras on määratud identifikaatoriga korduvkasutatav lahter, ja kui jah, siis tagastab lahtri. Kui järjekorras pole seda tüüpi lahtreid, tagastab see määratud identifikaatoritüübiga uhiuue lahtri.

  1. Järgmisena konfigureerib tabelivaate kontroller tabelivaatest tagastatud lahtri. Tavaliselt hõlmab see koodi, mis määrab lahtris olevate siltide teksti ja mis tahes tarvikuindikaatori.
  1. Tabelivaate kontroller tagastab konfigureeritud lahtri tagasi tabelivaatesse, mis lisab lahtri loendisse.

Nüüd, kui teil on kõrgetasemeline ülevaade, sukeldume sisse ja vaatame lähemalt koodi, mille lisasite tableView:cellForRowAtIndexPath: meetod AppCategoryViewController klassis, nagu näidatud Joonis 8.

  cellForRowAtIndexPath
Joonis 8 – tableView:cellForRowAtIndexPath: kood.
  1. Koodi esimene rida kutsub üles dequeueReusableCellWithIdentifier: meetod tabelivaates, läbides KategooriaCell identifikaator. Pidage meeles, et määrasite Identifikaator rakenduse kategooria lahtrist KategooriaCell kujunduse ajal süžeeskeemis. Seda lahtrit kasutatakse mallina lahtrite jaoks, mille see loob ja edastab tabelivaate kontrollerile, või kui seda tüüpi lahter on järjekorras juba olemas, tagastatakse viide sellele lahtrile.
  1. See kood saab a AppCategoryEntity objekt alates appCategoryList massiivi kasutades indexPath parameetrid rida vara. Sa pead saama an AppCategoryEntity objekti, et saaksite nimi kategooriast.
  1. See kood konfigureerib tegelikult tabelivaate lahtri. See võtab väärtuse AppCategoryEntity 's nimi vara ja hoiab seda tekst raku peamise omadus textLabel .
  1. Viimane koodirida tagastab täielikult konfigureeritud lahtriobjekti tabelivaatesse.

Järeldus

Ma tean, et selles postituses sisalduv teave on väga oluline, kuid kui soovite saada täieõiguslikuks rakenduste arendajaks, on oluline, et mõistaksite neid põhilisi mehaanikaid! Kui teil on küsimusi, kirjutage need kommentaaridesse ja ma vastan teile!

<>