hurtig fra bunden: adgangskontrol og ejendom observatører

, hurtig fra bunden: adgangskontrol og ejendom observatører,,,,, 25,,,,,,,,, 4,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie kaldet hurtigt fra bunden. hurtig fra bunden: delegation og propertiesswift fra bunden. initialization og initializer delegation i det foregående forelæsning,   tilføjede vi evnen til at skabe postyr poster.mens denne tilføjelse har gjort anvendelsen lidt mere nyttige, vil det også være hensigtsmæssigt at tilføje muligheden for at mærke produkter, som er gjort, og slette punkter.det er det, vi skal fokusere på i denne forelæsning.,, forudsætninger, hvis du vil følge med mig, så sørg for, at du har xcode 6.3 eller højere monteret på maskinen.i skrivende stund, xcode 6.3 i beta - og tilgængelige fra apples   programmerbare dev center   registrerede programmerbare udviklere.,, grund til at kræve xcode 6.3 eller højere, skal være i stand til at drage fordel af swift - 1.2, hvori det æble, der blev indført i   februar.hurtig 1.2 indfører en række store tilføjelser, som vi kan drage fordel af i resten af denne serie.,, 1.sletning af punkter, for at slette punkter, er vi nødt til at gennemføre yderligere to metoder i  , uitableviewdatasource, protokol.vi er nødt til at fortælle det til tabel synspunkt, der rækker kan være redigeret af gennemførelsen af, tableview (_: caneditrowatindexpath:), metode.som du kan se i under kode snippet, gennemførelsen er ligetil.vi fortæller det til tabel opfattelse, at hver række ændres ved at vende tilbage,,.,, tableview funktion (tableview: uitableview, caneditrowatindexpath indexpath: nsindexpath) - > bool {tilbage rigtigt}, den anden metode, vi er interesseret i, er, tableview (_: commiteditingstyle: forrowatindexpath:).   gennemførelse det er lidt mere kompliceret, men det er let at forstå, tableview funktion (tableview: uitableview, commiteditingstyle editingstyle: uitableviewcelleditingstyle, forrowatindexpath indexpath: nsindexpath) (hvis editingstyle = =. slette (//hente post - punkt = selvstændig. produkter [indexpath. række] //ajourføring af poster, selv removeatindex (indexpath. punkter.. ro) //ajourføring tabel opfattelse tableview.deleterowsatindexpaths ([indexpath], withrowanimation:.!)}}, starter vi med at kontrollere værdien af, editingstyle, en tælling af typen, uitableviewcelleditingstyle,.   vi kun slette et punkt, hvis værdien af editingstyle, er lig med uitableviewcelleditingstyle. slette,.,, swift er klogere end det.fordi det ved, at editingstyle, er af typen, uitableviewcelleditingstyle, kan vi ikke, uitableviewcelleditingstyle, navnet på den optælling, og skrive. slette, den pågældende værdi af listen, at vi er interesserede i.hvis du er ny i opremsninger i swift, så anbefaler jeg, at du læser dette hurtigt tip om domæneværdilister i swift -.,, vi henter den tilsvarende post fra konti, ejendom og midlertidigt at oplagre sin værdi i en konstant ved navn  , post.vi ajourføre tabel synspunkt er kilde til data, produkter, ved at påberåbe sig, removeatindex (indeks: 2000), om konti, ejendom, går i den rigtige indeks. endelig har vi ajourføre tabel synspunkt ved at påberåbe sig, deleterowsatindexpaths (_: withrowanimation:), om, tableview, passerer i en række med indexpath og. ikke, at angive animation type.som vi tidligere har set, vi kan udelade navnet på listen,  , uitableviewrowanimation, da hurtig ved arten af det andet argument er,  , uitableviewrowanimation,.,, bør brugeren være i stand til at slette punkter på listen.bygge og drive anvendelse for at teste det., 2.kontrol af produkter, til at markere et punkt, som har gjort, at vi er nødt til at tilføje en checkmark til den tilsvarende række.dette indebærer, at vi er nødt til at holde styr på de poster, brugeren har markeret som gjort.til dette formål, vil vi erklære, at en ny ejendom  , der forvalter det for os.erklærer en variabel ejendom, checkeditems,, af typen [-], og sæt det med en tom array.,, var checkeditems: [...] = [], i tableview (_: cellforrowatindexpath:), tjekker vi, om checkeditems, indeholder den pågældende position ved hjælp af  , indeholder funktion, en global funktion som defineret i swift - standard bibliotek.vi går ind, checkeditems, som det første argument, og punkt på dagsordenen, som det andet argument.den funktion, afkast, sandt, hvis checkeditems, indeholder  , post,.,,, tableview funktion (tableview: uitableview, cellforrowatindexpath indexpath: nsindexpath) - > uitableviewcell (//hente post - punkt = selvstændig. produkter [indexpath. række] //dequeue tabel på celle - tableviewcell = tableview. dequeuereusablecellwithidentifier ("tableviewcell", forindexpath: indexpath).uitableviewcell //få bord på celle tableviewcell.textlabel?. (= post, hvis de indeholder (self.checkeditems, punkt på dagsordenen) (tableviewcell.accessorytype =. checkmark} andre (tableviewcell.accessorytype =. ingen} tilbage tableviewcell}, hvis punkt findes i, checkeditems, er, at vi er cellen, accessorytype, ejendom,. checkmark, medlem af værdien af de  , uitableviewcellaccessorytype, tælling.hvis punkt på dagsordenen, ikke fandt,   falder vi tilbage til,. ingen, som den celle er medvirken type.,, det næste skridt er at tilføje et punkt som evnen til at mærke gjort ved at gennemføre en metode for, uitableviewdelegate, protokol, tableview (_: didselectrowatindexpath:).i denne delegerede metode, vi kalder, deselectrowatindexpath (_: animeret:), om, tableview, deseiect det brugeren aflyttet. //- tabel for delegerede metoder funktion tableview (tableview: uitableview, didselectrowatindexpath indexpath: nsindexpath) (tableview. deselectrowatindexpath (indexpath, nemlig: sande) ////////hent post - punkt = selvstændig. produkter [indexpath. ro. //- tab på celle - tableviewcell = tableview. cellforrowatindexpath (indexpath) //finde indeks for post - indeks = finde (self.checkeditems, punkt), hvis vi indeks = indeks (self. checkeditems. removeatindex (indeks) tableviewcell?. accessorytype = uitableviewcellaccessorytype. ingen} andre {selv. checkeditems. både (punkt) tableviewcell?. accessorytype = uitableviewcellaccessorytype. checkmark}}, vi så hent den tilsvarende post fra poster, og en henvisning til den celle, der svarer til den på række.vi bruger den, finder,   funktion, som er defineret i den hurtige standard bibliotek,   at indhente de indeks, punkt i, checkeditems,.de finder, funktion, returnerer en fakultativ, int.hvis checkeditems, indeholder punkt, vi fjerner den fra, checkeditems,   og fastsætte den celle er medvirken type,. ingen.hvis checkeditems, ikke indeholder punkt, vi lægger det til checkeditems, og cellerne er tilbehør, type,. checkmark,.,, med disse tilføjelser, de bruger, er nu i stand til at mærke produkter, som er gjort.bygge og drive anvendelse for at sikre, at det fungerer som forventet., 3.at redde stat, anvendelse i øjeblikket ikke redde stat mellem starter.for at løse dette, kommer vi til at opbevare, produkter og checkeditems, arrays i ansøgningen er bruger misligholdelser database.  , trin 1: last, og starte med at skabe to hjælper metoder, loaditems, og loadcheckeditems,.bemærk, private, nøgleord, ved at tilføje de hjælper metode.de private, nøgleord fortæller swift, at disse metoder kun er tilgængelige fra denne kilde fil. //- private hjælpere private funktioner loaditems() (lad userdefaults = nsuserdefaults. standarduserdefaults(), hvis vi poster = userdefaults. objectforkey ("produkter").[...] {self.items = poster) private funktioner loadcheckeditems() (lad userdefaults = nsuserdefaults. standarduserdefaults(), hvis vi checkeditems = userdefaults. objectforkey ("checkeditems").[...] {self.checkeditems = checkeditems}},,  , private,   nøgleord er en del af swift 's  , adgangskontrol.som navnet antyder, adgangskontrol defineres som kode har adgang til som kode.adgang til niveauer gælder metoder, funktioner, type osv. æble henviser blot til, at enheder.der er tre adgang niveauer, offentlige og private, indre,.,,, offentlige:,   enheder, der er mærket som offentligt tilgængelige, som enheder, der er defineret i den samme modul samt andre moduler.denne adgang er ideel for at afsløre den grænseflade for en ramme.,, interne: her er manglende adgang.med andre ord, hvis ingen adgang - niveau er specificeret, denne adgang plan finder anvendelse.   en enhed med en adgang niveau af interne er   kun tilgængelig for enheder, der er defineret i den samme modul.,, private:, en enhed, angivet som private er kun tilgængelig for enheder, der er defineret i den samme kilde fil.for eksempel, de private hjælper metoder som defineret i, viewcontroller, klasse er kun tilgængelig for, viewcontroller, klasse.,, gennemførelsen af hjælper metoder er enkelt, hvis man er bekendt med, nsuserdefaults, klasse.for at lette brugen vi opbevare en henvisning til standard bruger misligholdelser objekt i en konstant ved navn  , userdefaults,.i tilfælde af, loaditems, anmoder vi  , userdefaults,   til formål, der er forbundet med de vigtigste "produkter", og at et frivilligt system nedslåede tråde.vi sikkert ud af emballagen, frivillige, hvilket betyder, at vi oplagrer værdien i løbende poster, hvis de frivilligt, ikke er nul, og tildele den værdi for, post, ejendom, hvis, hvis erklæring er forvirrende, så se på en forenklet version af, loaditems, metode i nedenstående eksempel.resultatet er identiske, og den eneste forskel er kortfattet.,, private funktioner loaditems() (lad userdefaults = nsuserdefaults. standarduserdefaults() lad storeditems = userdefaults. objectforkey ("produkter").[snor] hvis lad poster = storeditems {self.items = punkter), og gennemførelsen af loadcheckeditems, er identisk bortset fra den nøgle, der er anvendt til at laste genstanden opbevares i bruger misligholdelser database.lad os sætte, loaditems, og loadcheckeditems, til brug ved ajourføring af det, viewdidload metode.,, før arbejdet viewdidload() {super. viewdidload() //fastsat afsnit self.title = "til" //lasttilstand selv. loaditems() selv. loadcheckeditems() //register klasse for celle genbrug selv. tableview. registerclass (uitableviewcell.self, forcellreuseidentifier: "tableviewcell"), trin 2: at redde stat, til at redde stat, vi gennemfører to mere privat hjælper metoder, saveitems, og savecheckeditems,.logikken er den samme, som af loaditems, og loadcheckeditems,.forskellen er, at vi opbevare data i den pågældende misligholdelse database.sørg for, at de nøgler, der anvendes i, setobject (_: forkey:), opfordrer til dem, der anvendes i loaditems, og loadcheckeditems,.,, private funktioner saveitems() (lad userdefaults = nsuserdefaults. standarduserdefaults() //ajourføring bruger misligholdelser userdefaults. setobject (self.items, forkey: "produkter") userdefaults. synchronize()} private arbejdet savecheckeditems() (lad userdefaults = nsuserdefaults. standarduserdefaults() //ajourføring bruger misligholdelser userdefaults. setobject (self.checkeditems, forkey: "checkeditems") userdefaults. synchronize()},,, synkroniser, ring ikke er strengt nødvendigt.styresystemet skal sørge for, at de data, de opbevares i brugeren misligholdelser database er skrevet til disk, på et tidspunkt.ved at påberåbe sig, bliver du imidlertid udtrykkeligt sige styresystemer til at skrive noget i afventning af disk.det er nyttigt i udvikling, fordi de operationelle system ikke vil skrive dine ændringer til disk, hvis du dræber anvendelse.det kan se ud, som om der er noget, der ikke fungerer, er vi nødt til at påberåbe sig, saveitems, og savecheckeditems, på en række områder.til at begynde med, ringe, saveitems, når et nyt punkt føjes til listen.vi gør det i den delegerede metode i  , additemviewcontrollerdelegate, protokol nr. //- tilføje punkt opfattelse registeransvarlige uddelegere metoder funktionsmuligheder controller (controller: additemviewcontroller, didadditem: serie) (//ajourføre data kilde selv. punkter. både (didadditem) //- stat selv. saveitems() //lade tabel opfattelse selv. tableview. reloaddata() //afvise tilføjes punkt opfattelse registeransvarlige selv. dismissviewcontrolleranimated (sand afslutning: nul), når staten på ændringer i  , tableview (_: didselectrowatindexpath:), ajourføre, checkeditems,.det er en god idé at påberåbe sig, savecheckeditems,   på dette punkt. //- tabel for delegerede metoder funktion tableview (tableview: uitableview, didselectrowatindexpath indexpath: nsindexpath) (tableview. deselectrowatindexpath (indexpath, nemlig: sande) //hente post - punkt = selvstændig. produkter [indexpath. ro. ////////- tab på celle - tableviewcell = tableview. cellforrowatindexpath (indexpath) //finde indeks for post - indeks = finde (self.checkeditems, punkt), hvis vi indeks = indeks (self. checkeditems. removeatindex (indeks) tableviewcell?. accessorytype = uitableviewcellaccessorytype. ingen} andre {selv. checkeditems. både (punkt) tableviewcell?. accessorytype = uitableviewcellaccessorytype. checkmark} //redde stat selv. savecheckeditems()},, når et punkt udgår, begge punkter, og checkeditems, ajourføres.for at redde det, vi kalder begge, saveitems, og savecheckeditems,.,, tableview funktion (tableview: uitableview, commiteditingstyle editingstyle: uitableviewcelleditingstyle, forrowatindexpath indexpath: nsindexpath) (hvis editingstyle = =. slette (//hente post - punkt = selvstændig. produkter [indexpath. række] //ajourføring ting selv. poster. removeatindex (indexpath. linje), hvis de indeholder (self.checkeditems, punkt på dagsordenen) (self. checkeditems. removeatindex (indexpath. ro) //- stat selv. saveitems() selv. savecheckeditems() //ajourføring tabel opfattelse tableview. deleterowsatindexpaths ([indexpath], withrowanimation: uitableviewrowanimation.)), det er det.bygge og drive anvendelsen at teste dit arbejde.lege med anvendelsen og kraft, stop det.når du starter den ansøgning, den sidste kendte stat skal være lastet og synlige.,, 4.ejendom observatører, ansøgningen er brugernes erfaring er en smule, der mangler i øjeblikket.når alt er slettet, eller når ansøgningen er iværksat for første gang, skal brugeren ser et tomt bord synspunkt.det er ikke godt.vi kan løse det ved at vise en besked, når der ikke er nogen ting.dette vil også give mig lejlighed til at vise dig et andet element af swift, ejendom, observatører,.,, trin 1: tilføjelse af en etiket, lad os starte med en etiket   til brugergrænseflade for at vise den besked.erklærer en afsætningsmulighed, der hedder, messagelabel, type, uilabel i, viewcontroller, klasse, åben  , main. tegning, og tilføje en etiket for registeransvarlige,.,, @ iboutlet var messagelabel: uilabel!,, tilføje de nødvendige indretning begrænsninger på etiketten   og forbinde den med henblik på kontrol er, messagelabel, udløb i, forbindelser, inspektør.sæt den etiket tekst, behøver du ikke at dos.,   og center etiket tekst i  , attributter, inspektør.,,,,, trin 2: gennemførelse af en ejendom som observatør, er budskabet etiket, skal kun være synlige, hvis produkter ikke indeholder elementer.når det sker, bør vi også skjule tabel synspunkt.vi kunne løse dette problem ved at tilføje flere kontroller i, viewcontroller, klasse, men et mere belejligt og elegant metode er at benytte en ejendom observatør.,, som navnet antyder, ejendom, observatører, overholde en ejendom.en ejendom observatør påberåbes, når en ejendom ændringer, selv når den nye værdi er den samme som den gamle værdi.der er to former for ejendom observatører.,,, willset, påberåbe sig den værdi, har ændret sig, didset: gældende efter værdi, har ændret sig, til vores formål, vi vil gennemføre det, didset, observatør for, post, ejendom.tag et kig på syntaks i følgende kode snippet.,, var poster: [-] = [] {didset (lad hasitems = items.count > 0 self.tableview.hidden =!hasitems self.messagelabel.hidden = hasitems}}, opbygge ser måske lidt mærkeligt i starten, så lad mig forklare, hvad der sker.når de, didset, observatør er gældende efter den, post, ejendom, har ændret sig, vi ser, hvis, post, ejendom indeholder elementer.baseret på værdien af den, hasitems, konstant, vi ajourføre brugergrænseflade.det er så simpelt.,,, didset, observatør er gået konstant parameter, der indeholder værdien af den gamle værdien af ejendommen.det er udeladt i ovenstående eksempel, fordi vi ikke har brug for det i vores gennemførelse.følgende eksempel viser, hvordan det kunne anvendes.,, var poster: [-] = [] {didset (oldvalue) (hvis oldvalue!= punkter (lad hasitems = items.count > 0 self.tableview.hidden =!hasitems self.messagelabel.hidden = hasitems}}},,, oldvalue parameter i eksempel har ikke en eksplicit, for hurtig ved type, post, ejendom.i det tilfælde, vi kun opdatere brugergrænseflade, hvis den gamle værdier afviger fra den nye værdi.,,, willset, observatør fungerer på samme måde.den væsentligste forskel er, at parameteren gik til, willset, observatør er en konstant med den nye værdi af ejendommen.ved brug af ejendom observatører, huske på, at de ikke er gældende, når en sag er igangsat.,, bygge og drive anvendelse til at sørge for, at alt er forbundet korrekt.selv om ansøgningen ikke er perfekt og kunne godt bruge lidt flere elementer, du har skabt din første programmerbare anvendelse ved hjælp af swift.,, indgåelse, i løbet af de sidste tre ting i denne serie, du skabte en funktionel programmerbare anvendelse ved hjælp af swift 's samt træk.  , hvis du har nogen erfaring planlægning og udvikling af applikationer så må du have bemærket, at den aktuelle data model har nogle mangler, for at sige det på.oplagring af produkter som tråde og skabe et særskilt system til opbevaring af et punkt på dagsordenen er stat ikke er en god idé, hvis du bygger en korrekt anvendelse.   en bedre løsning ville være at skabe en separat  , todo,   klasse for modeling poster og opbevarer dem i anvendelse er en sandkasse.det vil være vores mål for de næste trin i denne serie.




Previous:
Next Page: