at bygge en indkøbsliste anvendelse fra bunden: del 1

, opbygge en indkøbsliste anvendelse fra bunden: del 1,,,,, 2,,,,,,,,, 14,,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie kaldet lære programmerbare sdk udvikling fra bunden. data, persistens og sandboxing på iosbuilding en indkøbsliste anvendelse fra bunden: 2, i de næste to timer, vil vi sætte den viden, der opnås i denne serie i praksis ved at skabe en grundlæggende indkøbsliste anvendelse.på den måde, vil du også lære en række nye koncepter og mønstre, som f.eks. oprettelsen af en specialbygget model klasse og gennemførelse af en sædvane, uddelegere mønster.vi har en masse til at dække, så lad os komme i gang.,,, udkast, indkøbslisten ansøgning, som vi er ved at skabe, er to centrale elementer, forvaltning af en liste over vareposter, og skabe en indkøbsliste ved at vælge en eller flere artikler fra listen over poster, og vi vil bygge den. ansøgning om et teknisk vurderingsorgan bar registeransvarlige at gøre overgangen mellem de to synspunkter, hurtig og enkel.i denne lektie, vi skal fokusere på den første centrale element, listen over poster,.,, i næste lektion, vil vi lægge sidste hånd på den liste over poster, og vi vil zoome ind på listen, ansøgningen er andet centrale element.,, selv om den indkøbsliste anvendelse er ikke kompliceret ud fra brugernes synsvinkel er der flere beslutninger, at vi er nødt til at gøre i sin udvikling.hvad slags forretning, vil vi bruge opbevarer den liste over punkter?kan brugeren tilføje, redigere og slette punkter på listen?det er spørgsmål, som vi skal løse i de næste to timer. og i denne lektie, jeg vil også vise dig, hvordan frø indkøbslisten anvendelse med falske oplysninger for at give nye brugere noget at starte med.såning en ansøgning med data, ofte er en god idé at hjælpe nye brugere op til hastighed hurtigt.,,, 1.oprettelse af projektet, at iværksætte xcode og skabe en ny programmerbare projekt, som er baseret på, tom anvendelse, projekt model.,,,,, navn projektet indkøbsliste, og ind i en organisation navn, virksomhed identifikator, og klasse præfiks.sæt, anordninger til iphone, og sørge for, at de afkrydsningsfelt mærket, brug core data, er ikke sikret.   fortælle xcode, hvor at redde projektet og klik  , skabe,.,,,,,, 2.at skabe den skitse, skabe en ny tegning af udvælgelsen af  , nye > fil fra  , fil   menuen.vælg  , tegning, fra listen over  , programmerbare brugergrænseflade, skabeloner.,,,,, fastsat  , anordning, familie,  , iphone, og navnet på tegning  , vigtigste,.,,,,,, udvælger projekt i  , projekt, navigatør, vælge den  , indkøbsliste, målet fra listen over mål, og der  , vigtigste grænseflade  ,  , main.storyboard, eller  , main.,,,,, 3.oprettelse af listen for registeransvarlige, som man kunne have forventet, at listen for registeransvarlige, bliver en underklasse af, uitableviewcontroller,.skabe en ny objective-c klasse ved udvælgelsen af nye > fil fra  , fil   menuen.,,,,, navn klasse  , tsplistviewcontroller, og gøre det til en underklasse af, uitableviewcontroller,.fortæl xcode, hvis du vil redde filer i nye klasse og klik  , skabe,.,,,,, åben skitse, trække en  ,,,,,,, uitabbarcontroller, f.eks. den  , objekt bibliotek, og fjerne de to opfattelse kontrollører, som er knyttet til det tekniske vurderingsorgan bar registeransvarlige.trække en uitableviewcontroller fra  , objekt bibliotek, der   sin klasse, tsplistviewcontroller, i  , identitet, inspektør, til højre, og skabe et forhold overgang fra regningen bar styreenhed til listen på registeransvarlige.du må have lyst til at læse den sætning igen.,,,,, listen på registeransvarlige skal være de grundlæggende opfattelse styreenhed til navigation registeransvarlige.vælg den liste på registeransvarlige og vælge  , omfatter i > navigation registeransvarlige, fra  , redaktør, menu.,,,,, udvælge bordet på listen for registeransvarlige, og antallet af   prototype celler i  , attributter inspektør til 0,.,, før der anvendelse i den programmerbare simulator, åben  , tspappdelegate. h, og ajourføring af gennemførelsen af  , anvendelse: didfinishlaunchingwithoptions:,   som vist nedenfor.der er ingen grund til at skabe en, uiwindow, f.eks. da storyboard tager sig af det her for os. - (bool) anvendelse: uiapplication *) anvendelse didfinishlaunchingwithoptions: (nsdictionary *) launchoptions {tilbage - ja.}, løb anvendelse i six simulator for at se, om det fungerer som forventet.du skulle se et tomt bord ser med navigation bar øverst og en regning på bar i bunden.,,,,,,, 4.oprettelsen af posten model klasse, hvordan vil vi arbejde med poster i shopping ansøgning?med andre ord, hvad objekttype, vil vi kunne bruge til at opbevare de egenskaber ved et punkt, som f.eks. navn, pris og en snor, som entydigt identificerer hvert punkt på dagsordenen?den mest indlysende valg, til at opbevare de punkt egenskaber i en ordbog (, nsdictionary,).selv om det er fint, det ville begrænse og sinke os, som ansøgningen stigninger i kompleksitet., for indkøbslisten anvendelse, vil vi skabe en specialbygget model klasse.det kræver lidt mere arbejde på at oprette, men det gør udvikling meget lettere vej.,, skabe en ny objective-c klasse med et navn, tspitem, og gøre det til en underklasse af, nsobject,.fortæl xcode, hvor redde klasse og klik, skabe,.,, egenskaber, tilføje fire egenskaber headerfilen af den nye model klasse:,,, uuid, type, nsstring, til entydigt at identificere hver enkelt post, navn, også af typen, nsstring, pris, type, flyde,, inshoppinglist, type, bool, angive, om punkt på dagsordenen er til stede i listen, er det af afgørende betydning, at den, tspitem, klasse i overensstemmelse med det, nscoding, protokol.årsagen til dette vil være klar om et øjeblik.se på den fuldstændige headerfilen (bemærkninger er udeladt) for at sikre, at vi er på samme side.,,&#import < institut /institut. h > @ grænseflade tspitem: nsobject < nscoding > @ ejendom nsstring * uuid; @ ejendom nsstring * navn @ ejendom flyde pris; @ ejendom bool inshoppinglist; @ ende, arkivering, en strategi, der skal redde skik genstande, f.eks. tilfælde af, tspitem, klasse, diskette, er gennem en proces, der kaldes arkivering.vi bruger, nskeyedarchiver, og nskeyedunarchiver, arkiv og unarchive eksempler på, tspitem, klasse, både klasser er defineret i instituttets ramme som deres klasse præfiks (ns) angiver.det, nskeyedarchiver, klasse tager en række genstande og lagrer dem til disk som binære data.en yderligere fordel ved denne metode er, at binære filer er generelt mindre end almindelig tekst filer, der indeholder de samme oplysninger.,, hvis vi ønsker at anvende, nskeyedarchiver, og nskeyedunarchiver, arkiv og unarchive eksempler på, tspitem, klasse, som denne har brug for til at vedtage, nscoding, protokol, som vi, der er specificeret i hovedet dokumentation for den klasse, husker fra den lektie om instituttet ramme, nscoding, protokol erklærer to metoder, at en klasse skal gennemføre, at tilfælde af klasse skal kodes og dechifreret.lad os se, hvordan det fungerer, hvis de skaber skik klasser, så er du ansvarlig for, med angivelse af, hvordan tilfælde af klasse skal kodes (omregnet til binære data), kodning,,,,, encodewithcoder: klasse svarende til den, nscoding, protokol angiver, hvordan tilfælde af klasse skal være indkodet.tag et kig på gennemførelsen nedenfor.nøglerne, vi bruger, er ikke så vigtigt, men du ønsker generelt at bruge ejendommen navne for klarhed.,, - (indhold) encodewithcoder: (nscoder *) kaffe ([kaffe encodeobject: self.uuid forkey: @ "uuid"]; [kaffe encodeobject: self.name forkey: @ "navn"]; [kaffe encodefloat: self.price forkey: @ "pris"]; [kaffe encodebool: self.inshoppinglist forkey: @ "inshoppinglist"]},, at afkode, når en kodet objekt skal omdannes til et tilfælde af den respektive klasse, det er sendt et budskab om, initwithcoder:,.samme nøgler som vi plejede, encodewithcoder: anvendes i initwithcoder:,.dette er meget vigtigt. - (id) initwithcoder: (nscoder *) dekoder (self = [super lokalitet]; hvis (selvstændige) ([selv setuuid: [dekoder decodeobjectforkey: @ "uuid"]]; [selv setname: [dekoder decodeobjectforkey: @ "navn"]]; [selv setprice [dekoder decodefloatforkey: @ "pris"]]; [selv setinshoppinglist: [dekoder decodeboolforkey: @ "inshoppinglist"]]} tilbage selv.}, du aldrig bliver nødt til at ringe til nogen af disse metoder, direkte.de er kun indkaldt af det operationelle system.ved at tilpasse den, tspitem, klasse i, nscoding, protokol, vi kun fortælle operativsystemet, hvordan til at lagre og afkode tilfælde af klassen.,, at skabe situationer, at skabelsen af nye tilfælde af, tspitem, klasse lettere, skaber vi en skik klasse metode.det er helt valgfrit, men det vil gøre udvikling lettere, som du vil se senere i denne lektion.,, åbne headerfilen af, tspitem, klasse og tilføje følgende metode erklæring.det, + tegn forud for metoden erklæring angiver, at dette er en klasse metode, i modsætning til et tilfælde metode.,, + (tspitem *) createitemwithname: (nsstring *) navn andprice: (flydende) pris, vil gennemførelsen af klasse metode indeholder et nyt element, nsuuid, klasse.i  , createitemwithname: andprice:, begynder vi med oprettelsen af et nyt tilfælde af klassen, efterfulgt af konfigurationen af den nye instans ved fastsættelsen af sine egenskaber.ved misligholdelse af et nyt punkt på dagsordenen er ikke til stede i listen, så vi satte, inshoppinglist, ejendom, nej,.,, om, uuid, ejendom, er gjort ved at spørge, nsuuid, klasse i et tilfælde af klassen og bede den tilbage, f.eks. uuid snor.som jeg sagde, er det vigtigt, at vi kan entydigt at identificere hver enkelt instans af den, tspitem, klasse.den uuid vil se noget, 90a0cc77-35ba-4c09-ac28-d196d991b50d,.,, + (tspitem *) createitemwithname: (nsstring *) navn andprice: (flydende) pris (//påbegynd punkt tspitem * punkt = [[tspitem forpl] lokalitet]; //konfigurere post [punkt setname: navn]; [punkt setprice: pris.; [punkt setinshoppinglist: nr.]; [punkt setuuid: [[nsuuid uuid] uuidstring]] vende punkt;}, 5.- og redde produkter, data vedholdenhed vil være nøglen til vores indkøbsliste anvendelse, så lad os se på, hvordan dette skal gennemføres i praksis.åben gennemførelsen fil, tsplistviewcontroller, tilføje en privat ejendom, type, nsmutablearray, og navnet på det,,.,,&#import "tsplistviewcontroller. h" @ grænseflade tsplistviewcontroller () @ ejendom nsmutablearray * poster @ ende de genstande, som vises i betragtning registeransvarliges tabel holdning vil blive opbevaret i  , produkter.det er vigtigt, at  , produkter,   er et ustadigt system, fordi vi vil give mulighed for at tilføje nye punkter lidt senere i denne lektion.,,, i klasse er initialization metode, vi læsser den liste over emner fra disk og opbevarer det i den private konti, ejendomme, som vi erklærede for et par for et øjeblik siden.vi er også af den opfattelse, at finansinspektøren titel, punkter, som vist nedenfor.,, - (id) initwithcoder: (nscoder *) adecoder (self - = [super initwithcoder: adecoder]; hvis (selvstændige) (//fastsat afsnit self.title = @ "produkter": //lastelementer [selv loaditems];} tilbage selv.}, af den opfattelse,   registeransvarlige er, loaditems,   metode er intet mere end en metode til at holde klasse er hjælper  , initwithcoder:,   metode, kortfattet og letlæselig.lad os se på gennemførelsen af  , loaditems,.,,, - produkter, loaditems, metode begynder med at genfinde vejen til den fil, hvor listen over produkter er oplagret.vi gør dette ved at kalde, pathforitems,, en anden hjælper metode, som vi vil se på, om et øjeblik. - (indhold) loaditems {nsstring * filepath = [selv pathforitems]; hvis ([[nsfilemanager defaultmanager] fileexistsatpath: filepath]) (self.items = [nskeyedunarchiver unarchiveobjectwithfile: filepath]} andre {self.items = [nsmutablearray array]}},,  , nsfilemanager,   klasse i næste linje kode, er en gruppe, som vi har ikke arbejdet med endnu.den  , nsfilemanager,   klasse giver en brugervenlig api til objective-c arbejder med sagen.vi får en henvisning til et tilfælde af klassen ved at stille det for misligholdelse manager.,, default manager har sendt en besked til  , fileexistsatpath:,   og gik fil sti, vi opnåede i første linje.hvis en sag på det sted, der er angivet i filen vej, så vi lader indholdet af sagsakterne i  , produkter,   ejendom.hvis ikke det eksisterer på dette sted, så vi instantiate tom ustadigt array.,,, - sagen i lyset af tilsynsførendes, post, ejendom sker ved, nskeyedunarchiver, klasse, som vi tidligere har drøftet.den er i stand til at læse den binære data, der er indeholdt i filen og omdanne det til et objekt figur, en række, tspitem tilfælde i denne sag.denne proces vil blive tydeligere, når vi ser på, saveitems, metode i et minut.,,, hvis vi lader indholdet af et dossier, der ikke eksisterer, så den, produkter, ejendom ville blive sat til nul, i stedet for en tom ustadigt system.det er en fin, men vigtig forskel, som vi kan se lidt senere i denne forelæsning. lad os nu tage et kig på det, pathforitems, hjælper metode.metoden starter med at genfinde vejen til de dokumenter, fortegnelse i ansøgningen er sandkasse.dette skridt bør være bekendt. - (nsstring *) pathforitems {nsarray * veje = nssearchpathfordirectoriesindomains (nsdocumentdirectory, nsuserdomainmask, ja) nsstring * dokumenter = [veje lastobject] afkast [dokumenter stringbyappendingpathcomponent: @ "ting. plist"]), og den metode, der vender tilbage den vej til ansøgning liste over poster, som tilføjer en snor i retning af de dokumenter, fortegnelse.du må have lyst til at læse det foregående punktum, et par gange, lad det synke.,, skønheden ved hjælp af  , stringbyappendingpathcomponent:,   er, at indsættelsen af vej - separatorer er gjort for os, hvor det er nødvendigt.med andre ord, systemet er sikker på, at vi får en gyldig dokumentation vej.,,, at redde produkter, selv om vi ikke redde poster til senere i denne time, det er en god idé at gennemføre den, mens vi er ved det.gennemførelsen af saveitems,   er meget kortfattet, takket være den, pathforitems, hjælper metode.,, vi først finde vej til de sagsakter, der indeholder ansøgningen er liste over emner og så skrive indholdet af, produkter, ejendomsret til det sted.let.ikke?,, - (indhold) saveitems {nsstring * filepath = [selv pathforitems]; [nskeyedarchiver archiverootobject: self.items tofile: filepath]}, som vi tidligere har set, udarbejdelsen af en genstand, diagram til disk er kendt som arkivering.vi bruger den, nskeyedarchiver, klasse, til at opnå dette ved at kræve, archiverootobject: tofile: om, nskeyedarchiver, klasse, i denne proces, for hver genstand, formål figur er sendt et budskab om, encodewithcoder: at omdanne det til binære data.som jeg sagde før, du plejer ikke at ringe, encodewithcoder: direkte, at kontrollere, at laste den liste over emner fra disk fungerer, en log - meddelelse i, viewdidload, metode for, tsplistviewcontroller, klasse, som vist nedenfor.løb, anvendelse i six simulator, og undersøge, om det går. - (indhold) viewdidload {[super viewdidload] nslog (@ "post >% @" self. genstande)}, hvis du tager et kig på produktionen i konsol vindue, vil i se, at de poster, ejendom, er lig med en tom system, som vi forventer på dette punkt.det er vigtigt, at produkter ikke er lig med nul.i løbet af de næste skridt, vi giver brugeren et par punkter at arbejde med, en proces, der kaldes, såning,.,,, 6.såning data opbevares, såning en ansøgning med data ofte kan betyde forskellen mellem en, der bruger og en bruger, at ansøgningen efter anvendelse i mindre end et minut.såning en ansøgning med falske data ikke kun hjælper brugerne at få fart, det viser også nye brugere, hvordan ansøgningen ser ud og føles med data i.,, såning indkøbslisten anvendelse med en foreløbig liste over poster er ikke svært.når ansøgningen lancerer, vi først kontrollere, om de oplysninger, opbevares, er allerede blevet befrugtet med data, fordi vi ikke ønsker at skabe to punkter.det vil blot forvirre eller forhindre bruger.hvis dataene opbevares har ikke været sat endnu, vi lader en liste med frø data og anvender denne liste for at skabe data opbevares ansøgningen.,, logik for såning data opbevares kan kaldes en række steder i en ansøgning, men det er vigtigt at tænke fremad.vi kunne sætte logik for såning data opbevares i, tsplistviewcontroller, klasse, men hvad hvis, i en fremtidig udgave af stævningen, andre for flyveledere, også har adgang til den liste over poster.et godt sted at frø data opbevares i, tspappdelegate, klasse.lad os se, hvordan det her fungerer.,,, tspappdelegate. m, og ændre gennemførelsen af ansøgningen: didfinishlaunchingwithoptions:, ligner et vist nedenfor. - (bool) anvendelse: uiapplication *) anvendelse didfinishlaunchingwithoptions: (nsdictionary *) launchoptions (//frø poster [selv seeditems]; tilbage, ja.}, er den eneste forskel med de tidligere gennemførelse er, at vi først ringer  , seeditems,   om anvendelse delegerede.det er vigtigt, at såning data opbevares finder sted inden initialization af betragtning kontrollører, fordi data opbevares skal sås inden for de belastninger, listen over poster,.,,, gennemførelsen af seeditems, er ikke kompliceret.vi begynder ved lagring af en henvisning til den fælles bruger misligholdelser objekt, og vi så se, om brugeren misligholdelser database har adgang til en central med navn, tspuserdefaultsseeditems, og om denne adgang er en boolean - til en værdi af, ja,.,, - (indhold) seeditems {nsuserdefaults * ud = [nsuserdefaults standarduserdefaults]; hvis (![ud boolforkey: @ "tspuserdefaultsseeditems"]) (//belastning frø, der nsstring * filepath = [[nsbundle mainbundle] pathforresource: @ "frø" spp: @ "plist"] nsarray * seeditems = [nsarray arraywithcontentsoffile: filepath]; //positioner nsmutablearray * poster = [nsmutablearray array]; ////////skabe en liste over punkter til int (i = 0. jeg < [seeditems tæller] jeg + +) (nsdictionary * seeditem = [seeditems objectatindex: jeg]; //skabe punkt tspitem * punkt = [tspitem createitemwithname: [seeditem objectforkey: @ "navn"] andprice: [[seeditem objectforkey: @ "pris". floatvalue]]; //add punkt poster [detems addobject: punkt]} //positioner vej nsstring * itemspath = [[selv documentsdirectory] stringbyappendingpathcomponent: @ "ting. plist"]; //skrive til fil, hvis ([nskeyedarchiver archiverootobject: post tofile: itemspath]) ([ud setbool: ja forkey: @ "tspuserdefaultsseeditems"]}}} det vigtigste er, hvad du ønsker, så længe de er konsekvent i udnævnelsen af de nøgler, som de bruger.det centrale i den pågældende misligholdelse database fortæller os, hvis ansøgningen er blevet befrugtet med data eller ej.dette er vigtigt, da vi kun ønsker at frø indkøbslisten anvendelse.,, hvis anvendelse ikke er blevet befrugtet endnu, vi lader en ejendom liste fra anvendelsen bundt ved navn  , frø. plist,.dette dokument indeholder en række ordbøger med hver ordbog, der repræsenterer et punkt med et navn og en pris.,, før iterating gennem  , seeditems,   system, skaber vi en afvekslende system til lagring  , tspitem,   tilfælde, at vi er med til at skabe.for hver ordbog i  , seeditems,   system, skaber vi en  , tspitem,   instans, ved hjælp af klasse metode, erklærede vi tidligere i denne lektie, og vi tilføjer den instans til  , produkter,   system. og endelig, skaber vi vejen til det dokument, som vi vil lagre liste over punkter, og vi skriver indholdet af  , produkter,   antennegruppe til diskette, som vi så i  , saveitems,   metode i  , tsplistviewcontroller,   klasse.,, at den metode,  , archiverootobject: tofile:,   vender tilbage  , ja,  , hvis operationen endte med succes, og det er kun da, at vi ajourfører brugeren misligholdelser opbevares ved at fastsætte boolean - værdi for de vigtigste  , tspuserdefaultsseeditems,   til  , ja.næste gang anvendelse starter de data, der opbevares ikke sås igen. du har sikkert bemærket, at vi har brug for en hjælper metode for at hente anvendelse er dokumenter, fortegnelse.du kan finde dens gennemførelse nedenfor.det er meget lig den gennemførelse af det, pathforitems, metode i, tsplistviewcontroller, klasse. - (nsstring *) documentsdirectory {nsarray * veje = nssearchpathfordirectoriesindomains (nsdocumentdirectory, nsuserdomainmask, ja) afkast [veje lastobject]}, før du kører anvendelse, import headerfilen af, tspitem, klasse og sikre, at kopiere den ejendom liste, frø. plist, til dit projekt.det betyder ikke noget, hvor du opbevarer det så længe, som det er anført i ansøgningen er bundt.,,&#import "tspitem. h", løb anvendelse igen og kontrollere produktionen i panelet for at se, om de data, der var vellykket befrugtet med indholdet af  , frø. plist,., bemærke, at såning en data - butik med data eller ajourføring af en database tager tid.hvis operationen tager for lang tid, systemet kan dræbe din ansøgning, før den har haft mulighed for at afslutte iværksættelse.   æble kalder dette fænomen, vagthund, dræbe din ansøgning. deres anvendelse på en begrænset tid til affyring.hvis det ikke lykkes at iværksætte inden for denne tidsramme, operativsystemet dræber din ansøgning.det betyder, at du nødt til omhyggeligt at overveje, hvornår og hvor du udfører visse aktiviteter som f.eks. podning din ansøgning er data opbevares.,,, 7.   med listen over punkter, har vi nu en liste over elementer, der skal arbejde med.visning af poster i tabel på listen på registeransvarlige er ikke svært.tag et kig på gennemførelsen af de tre metoder i, uitableviewdatasource, protokol er vist nedenfor.deres gennemførelse bør være bekendt med dig nu.glem ikke at importere headerfilen af, tspitem, klasse.,,&#import "tspitem. h", - - nsinteger) numberofsectionsintableview: (uitableview *) tableview {tilbage 1), - (nsinteger) tableview: (uitableview *) tableview numberofrowsinsection: (nsinteger) afsnit (afkast [self.items tæller]), - (uitableviewcell *) tableview: (uitableview *) tableview cellforrowatindexpath: (nsindexpath *) indexpath (//dequeue genanvendelige celle uitableviewcell * celle = [tableview dequeuereusablecellwithidentifier: cellidentifier forindexpath: indexpath]; //hente post tspitem * punkt = [self.items objectatindex: [indexpath række]]. //konfigurere celle [cell.textlabel settext: [punkt navn]] tilbage celle.}, b.efore løbende anvendelse, erklærer den celle genbrug identifikator umiddelbart efter, @ gennemførelse, de forslag, som vi tidligere har set i denne serie.,, @ gennemførelse tsplistviewcontroller statisk nsstring * cellidentifier = @ "celle - id", og endelig at registrere, uitableviewcell, klasse for celle genbrug identifikator du erklærer i for registeransvarlige, viewdidload metode.,, - (indhold) viewdidload {[super viewdidload]; //nslog (@ "post >% @" self. produkter); //register klasse for celle genbrug [self.tableview registerclass: [uitableviewcell klasse] forcellreuseidentifier: cellidentifier]}, opbygge projektet og anvendelse i six simulator at se listen over produkter, der frembydesi listen for registeransvarlige er tabel synspunkt.,,,,,, 8.at tilføje punkter - del 1, uanset hvor godt vi craft - listen af frø, vil brugeren ønsker at tilføje yderligere punkter på listen.den mest almindelige tilgang om at tilføje nye punkter til 105 en liste med brugeren en modal synspunkt, i hvilke nye data kan registreres, betyder det, at vi bliver nødt til at:,, tilføje en knap til at tilføje nye punkter, skabe en betragtning registeransvarlige, der forvalter af den opfattelse, at accepterer brugerinput, skabe et nyt punkt baseret på brugerens input, tilføje nye post i tabellen opfattelse, at tilføje en knap, at tilføje en knap til navigation bar kræver en linje kode.se, viewdidload, metode for, tsplistviewcontroller, klasse og ajourføre den for at afspejle gennemførelsen under. - (indhold) viewdidload {[super viewdidload]; //nslog (@ "post >% @" self. produkter); //register klasse for celle genbrug [self.tableview registerclass: [uitableviewcell klasse] forcellreuseidentifier: cellidentifier]; //skabe endnu knap self.navigationitem.leftbarbuttonitem = [[uibarbuttonitem forpl] initwithbarbuttonsystemitem: uibarbuttonsystemitemadd mål: self handling: @ vælgeren (additem:)]}, i den lektie om regning bar kontrollører, så vi, at ethvert synspunkt registeransvarlige har en  , tabbaritem,   ejendom.på samme måde, hver på registeransvarlige har en  , navigationitem,   ejendom, et enestående tilfælde af  , uinavigationitem,   repræsenterer holdningen kontrollør i navigation bar af modervirksomheden opfattelse registeransvarlige sejlads registeransvarlige.,,  , navigationitem,   ejendom er en  , leftbarbuttonitem,   ejendomsret, som er et tilfælde af  , uibarbuttonitem, og referencer bar knap punkt vises på venstre side af navigations - bar.den  , navigationitem,   ejendom har også en  , titleview,   og en  , rightbarbuttonitem,   ejendom.,,,, viewdidload, metode, vi fastsætter, leftbarbuttonitem, ejendom for registeransvarlige, navigationitem, et eksempel på, uibarbuttonitem, under påberåbelse af, initwithbarbuttonsystemitem: mål::, og at uibarbuttonsystemitemadd, som det første argument.   denne metode skaber et system, der er tilfælde af, uibarbuttonitem,.,, selv om vi allerede har oplevet målet aktion mønster, anden og tredje del af, initwithbarbuttonsystemitem: mål: aktioner, der har brug for en forklaring.når knappen i sejlads bar er aflyttet, et budskab om, additem:, er sendt til mål, selv - eller  , tsplistviewcontroller,   f.eks.,, som jeg sagde, har vi allerede haft forhandlingsmekanismer mønster, når vi sammen en knap røre begivenhed til en aktion i tegning a par timer siden.det er meget ens, og at den eneste forskel er, at forbindelsen er programmatically.,, målrettet indsats - er meget almindeligt i kakao.den idé er simpel.en genstand ved en henvisning til den besked eller aktion vælgeren, som skal sendes til et bestemt formål og mål, en genstand, som det budskab, der skal sendes, vent et øjeblik.hvad er vigtigt?komitéen er navn eller den entydige identifikationskode, der er anvendt til at udvælge en metode, som et objekt, forventes at udføre.komitéen er af typen, sel, og der kan skabes ved hjælp af, @ vælgeren, compiler direktiv.du kan læse mere om selektorer i apples  , kakao kernekompetencer,   guide.,, før der anvendelse i six simulator, er vi nødt til at skabe tilsvarende, additem: metode i betragtning - controller.hvis vi ikke gør dette, for registeransvarlige, ikke vil være i stand til at reagere på den meddelelse, den modtager, når dosisknappen er aflyttet, og en undtagelse vil blive kastet.,, se på den form for metode definition i kode snippet nedenfor.som vi tidligere har set i denne serie, aktion accepterer et argument, den genstand, der sender det budskab til betragtning controller (target), som er den knap i navigation bar i vores eksempel. - (indhold) additem: (id) afsender (nslog (@ "knap blev aflyttet.") den, jeg har tilføjet en log - meddelelse til den metode, at prøve, hvis det her fungerer korrekt.bygge projektet og anvendelse for at teste knap i navigation bar.,,, at skabe en betragtning registeransvarlige, skabe en ny, uiviewcontroller, underklasse (ikke en, uitableviewcontroller, anvendes) og   navn det  , tspadditemviewcontroller,.,, er det nødvendigt først at erklære to afdelinger i klasse er headerfilen for de to tekst, områder, som vi vil skabe et øjeblik.denne proces bør være bekendt med nu.tag et kig på headerfilen vist nedenfor (bemærkninger er udeladt).,,,&#import < uikit /uikit. h > @ grænseflade tspadditemviewcontroller: uiviewcontroller @ ejendom iboutlet uitextfield * nametextfield; @ ejendom iboutlet uitextfield * pricetextfield; @ ende, er vi også nødt til at erklære to aktioner i klasse gennemførelse fil (, mtadditemviewcontroller. m).den første aktion, annullere:,, vil ophæve oprettelsen af et nyt punkt på dagsordenen, mens den anden aktion, undtagen:,, vil redde den nyoprettede post. - (ibaction) annullere: (id) afsender (}), - (ibaction) bortset fra: (id) afsender {}, åben den tegning, trække en, uiviewcontroller, f.eks. de protesterer bibliotek,,,, og fastlægge sin klasse, tspadditemviewcontroller, i  , identitet, inspektør.,,,,, skabe en manuel segue ved presning, kontrol,   og ud fra   liste for registeransvarlige, gøre indsigelse mod  , tilføjes punkt opfattelse registeransvarlige  , objekt.vælg  , modal, fra menuen, der dukker op.,,,,,,,, udvælge de spørgsmål, du skabte, åben den  , attributter inspektør, og dets  , id,  , additemviewcontroller,.,,,,,,, før vi tilføje teksten områder, udvælge tilføje punkt opfattelse registeransvarlige og sætte det i en sejlads registeransvarlige ved udvælgelsen af  , omfatter i > navigation registeransvarlige, fra  , redaktør, menu.,, tidligere i denne lektie, vi programmatically tilføjede, uibarbuttonitem, at listen på registeransvarlige er navigations - punkt på dagsordenen.lad os undersøge, hvordan dette fungerer i en skitse.zoom ind på tilføje punkt opfattelse registeransvarlige, tilføje to, uibarbuttonitem tilfælde til navigation bar, placering på hver side.vælg den venstre bar knap post, åbne, attributter inspektør, og sæt, id, aflys.gør det samme for den rigtige bar knap punkt på dagsordenen, men i stedet sætte, id, save,.,,,,, udvælge, tilføje punkt opfattelse registeransvarlige  , genstand, åbne  , forbindelser, inspektør, til højre, og forbinde, annullere: aktion med venstre bar knap punkt og, undtagen: aktion med den rigtige bar knap punkt på dagsordenen.,,,,, trække to, uitextfield tilfælde fra genstanden bibliotek, at tilføje punkt opfattelse registeransvarlige opfattelse.position teksten områder som vist i skærmbillede nedenfor.,,,,, udvælge den øverste tekstfelt, åbne, attributter inspektør, ind, navn, i, indikation af en art, mark.vælg bundtekst område, og i, attributter inspektør, der er en indikation af en art tekst, pris og tastatur,  , nummer, sted.dette sikrer, at brugerne kan kun indgå numre i bunden tekstfelt.vælg, tilføjes punkt for registeransvarlige, genstand, åben  , forbindelser, inspektør, og forbinde, nametextfield, og pricetextfield afsætningsmuligheder for de tilsvarende områder i betragtning registeransvarlige tekst,.,,,,,, at der var en del arbejde.alt det, vi har gjort i den skitse, kan også opnås programmatically.nogle entreprenører bruger ikke engang storyboards og skabe hele anvendelse brugergrænseflade programmatically.det er præcis, hvad der sker under motorhjelmen.,, gennemførelse, additem:, med det, tspadditemviewcontroller, klasse klar til brug, lad os vende tilbage til det, additem: aktion i, tsplistviewcontroller, klasse.før vi gør det, men importerer headerfilen af, tspadditemviewcontroller, klasse på toppen.,,&#import "tspadditemviewcontroller. h", gennemførelsen af den, additem: aktion er kort, som du kan se nedenfor.vi påberåber os  , performseguewithidentifier: afsender:, og ræk mig  , additemviewcontroller, id, vi satte i tegning, og selv den opfattelse registeransvarlige, som det andet argument,.,,  , skaber vi en ny instans, mtadditemviewcontroller, klasse, og at det med hensyn til transportform ved at kræve, presentviewcontroller: animeret: gennemførelse: på listen på registeransvarlige selv, f.eks.når presentviewcontroller: animeret: gennemførelse:, kaldes, af den opfattelse, additemviewcontroller, f.eks. vil glide op fra bunden af en























Previous:
Next Page: