Building en handleliste Application From Scratch: Del 1
to
Del
14
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Lær iOS SDK Development Fra Scratch.Data Persistens og Sandboxing på iOSBuilding en handleliste Application From Scratch:. Del 2
I de neste to timene, vi ' ll sette kunnskap lært i denne serien i praksis ved å skape en grunnleggende handleliste søknad. Underveis vil du også lære en rekke nye konsepter og mønstre, for eksempel å lage en tilpasset modell klasse og implementere en tilpasset delegat mønster. Vi har fått mye av grunnen til å dekke så la oss komme i gang.
Outline
handleliste program som vi er i ferd med å skape har to kjernefunksjoner, administrere en liste Gjenstander og lage en handleliste ved å velge ett eller flere elementer fra listen over elementer.
Vi vil bygge programmet rundt en fanelinjen kontrolleren til å gjøre bytter mellom de to visningene raske og enkle. I denne leksjonen skal vi fokusere på den første kjernefunksjonen, listen over elementer.
I neste leksjon, vil vi la siste hånd på listen over elementer, og vi vil zoome inn på handleliste, programmets andre kjernefunksjonen.
Selv om handleliste søknaden ikke er komplisert fra en brukers perspektiv, er det flere avgjørelser som vi trenger å gjøre i løpet av sin utvikling. Hva slags butikk vil vi bruke til å lagre en liste over elementer? Kan brukeren legge til, redigere og slette elementer i listen? Dette er spørsmål som vi vil ta opp i løpet av de neste to timene.
I denne leksjonen, vil jeg også vise deg hvordan du frø handleliste søknad med dummy data til å gi nye brukere noe å starte med. Seeding et program med data er ofte en god idé å hjelpe nye brukere få fart raskt.
1. Opprette prosjekt
Launch Xcode og opprette en ny iOS prosjekt basert på Empty Application prosjektmalen.
Navn prosjektet handleliste og skriv en organisasjon navn, firma identifikator, og klasse prefiks. Satt enheter til iPhone og sørge for at avmerkingsboksen Bruk kjernedata
er avmerket. Fortell Xcode hvor du vil lagre prosjektet og klikk på Opprett.
2. Opprette storyboardet
Opprett en ny dreiebok ved å velge New > Fil ...
fra Fil
menyen. Velg Storyboard
fra listen over iOS User Interface
maler.
Set Device Slektstre til iPhone Hotell og navngi storyboard
Hoved
.
Velg prosjektet i Prosjekt Navigator
, velg Shopping List
målet fra liste over mål, og sette Hoved Interface
til Main.storyboard
eller Hoved
.
3. Opprette List View Controller
Som du kanskje har forventet, listevisning kontrolleren kommer til å bli en underklasse av UITableViewController. Opprett en ny Objective-C klasse ved å velge New > Fil ...
fra Fil
menyen.
navn klassen TSPListViewController og gjøre det en underklasse av UITableViewController. Fortell Xcode hvor du vil lagre filene i den nye klassen, og klikk på Opprett.
Åpne dreieboken, dra en
UITabBarController eksempel fra Object Library
, og slette de to view kontrollerne som er knyttet til fanelinjen kontrolleren. Dra en UITableViewController fra Object Library
, setter sin klasse TSPListViewController i Identity Inspektør
på høyre, og skape en relasjon naturlig overgang fra fanelinjen kontrolleren til listevisning kontrolleren. Det kan være lurt å lese den setningen igjen.
listevisning kontrolleren må være roten visning kontrolleren av en navigasjonskontrolleren. Velg listevisning kontrolleren og velg Embed In > Navigation Controller
fra Editor
menyen.
Velg tabellen visning av listevisning kontrolleren og angi antall Prototype Cells
i attributter Inspektør
til 0.
Før du kjører programmet i iOS Simulator, åpen TSPAppDelegate.h Hotell og oppdatere gjennomføringen av programmet: didFinishLaunchingWithOptions: som vist nedenfor. Det er ikke nødvendig å opprette en UIWindow forekomst siden dreieboken tar seg av dette for oss Anmeldelser - (BOOL) program: (UIApplication *) søknad didFinishLaunchingWithOptions:. (NSDictionary *) launchOptions {return JA;}
Kjør programmet i iOS Simulator for å se om alt fungerer som forventet. Du bør se en tom tabellvisning med et navigasjonsfelt på toppen og en fanelinjen nederst.
4. Opprette Sak Modell Klasse
Hvordan skal vi jobbe med varer i handle søknaden? Med andre ord, hva slags objekt vil vi bruke til å lagre egenskapene til et element, for eksempel navn, pris, og en streng som identifiserer hvert element?
Den mest åpenbare valget er å lagre elementets egenskaper i en ordbok (NSDictionary). Selv om dette ville fungere helt fint, ville det sterkt begrense og tregere oss som program øker i kompleksitet.
For handleliste søknad, kommer vi til å lage en tilpasset modell klasse. Det krever litt mer arbeid å sette opp, men det vil gjøre utviklingen enklere nedover veien.
Opprett en ny Objective-C klasse med et navn på TSPItem og gjøre det en underklasse av NSObject. Fortell Xcode hvor du vil lagre klassen og klikk på Opprett
Egenskaper
Legg fire eiendommer til header fil av den nye modellen klassen.
navn også av type NSString
prisen av type float
inShoppingList av type BOOL å vise om objektet er tilstede i handleliste
Det er viktig at TSPItem klassen samsvarer med NSCoding protokollen. Grunnen til dette vil bli klart i en liten stund. Ta en titt på den fullstendige header filen (kommentarer er utelatt) å sørge for at vi er på samme side
#import < Foundation /Foundation.h >interface TSPItem. NSObject < NSCoding >property NSString * UUID;property NSString * navn,property float pris;property BOOL inShoppingList;end
Arkivering
En strategi for å lagre egendefinerte objekter, for eksempel forekomster av TSPItem klassen, til disk er gjennom en prosess som kalles arkivering. Vi vil bruke NSKeyedArchiver og NSKeyedUnarchiver å arkivere og hent forekomster av TSPItem klassen.
Begge klassene er definert i stiftelsen rammeverk som deres klasse prefiks (NS) indikerer. Den NSKeyedArchiver klassen tar et sett av objekter og lagrer dem på disken som binære data. En ekstra fordel med denne tilnærmingen er at binærfiler er generelt mindre enn rene tekstfiler som inneholder den samme informasjonen.
Hvis vi ønsker å bruke NSKeyedArchiver og NSKeyedUnarchiver å arkivere og hent forekomster av TSPItem klassen, sistnevnte behovene til vedta NSCoding protokollen lignende vi angitt i topptekstfilen av klassen.
Husk fra leksjon om stiftelsen rammeverk, sier NSCoding protokollen to metoder som en klasse må iverksette for å tillate forekomster av klassen for å være kodet og dekodet. La oss se hvordan dette fungerer.
Hvis du opprette egendefinerte klasser, så er du ansvarlig for å spesifisere hvordan forekomster av klassen bør være kodet (konvertert til binære data).
Encoding
< p> I encodeWithCoder :, klassen forventninger til den NSCoding protokollen spesifiserer hvordan forekomster av klassen skal kodes. Ta en titt på gjennomføringen nedenfor. Tastene som vi bruker er ikke så viktig, men du generelt ønsker å bruke egenskapsnavnene for klarhet Anmeldelser - (void) encodeWithCoder:. (NSCoder *) koder {[koder encodeObject: self.uuid Forkey: @ "UUID" ]; [koder encodeObject: self.name Forkey: @ "navn"]; [koder encodeFloat: self.price Forkey: @ "pris"]; [koder encodeBool: self.inShoppingList Forkey: @ "inShoppingList"];} dekoding
Når en kodet objekt må konverteres tilbake til en forekomst av den respektive klassen, det er sendt en melding av initWithCoder: . De samme tastene som vi brukte i encodeWithCoder: brukes i initWithCoder :. Dette er meget viktig
- (id) initWithCoder:. (NSCoder *) dekoder {selv = [super init]; if (egen-) {[selv setUuid: [dekoder decodeObjectForKey: @ "UUID"]]; [selvtillit setName: [dekoder decodeObjectForKey: @ "navn"]]; [selvtillit setPrice: [dekoder decodeFloatForKey: @ "pris"]]; [selvtillit setInShoppingList: [dekoder decodeBoolForKey: @ "inShoppingList"]]; } Returnere selv;}
Du trenger aldri å kalle noen av disse metodene direkte. De blir bare kalt av operativsystemet. Tilpasningen den TSPItem klasse til NSCoding protokollen, vi bare forteller operativsystemet hvordan å kode og dekode forekomster av klassen.
Opprette Forekomster
For å gjøre etableringen av nye forekomster av TSPItem klasse enklere, skaper vi en tilpasset klassemetode. Dette er helt valgfritt, men det vil gjøre utviklingen enklere som du vil se senere i denne leksjonen.
Åpne header fil av TSPItem klassen og legge til følgende metode erklæringen. + Tegnet foregående metoden erklæringen viser at dette er en klassemetode i motsetning til en instansmetode
+ (TSPItem *) createItemWithName: (NSString *) navn andPrice:. (Float) pris;
Gjennomføringen av klasse metode inneholder ett nytt element, den NSUUID klasse. I createItemWithName: andPrice :, vi starter med etableringen av en ny forekomst av klassen, fulgt av konfigurasjonen av den nye forekomsten ved å sette sine egenskaper. Som standard er et nytt element ikke er tilstede i handleliste, så vi setter inShoppingList eiendommen til NO.
Stille UUID eiendommen er gjort ved å spørre NSUUID klasse for en forekomst av klassen og ber den returnerte eksempel for en UUID-streng. Som jeg sa, er det viktig at vi entydig kan identifisere hver forekomst av TSPItem klassen. UUID vil se omtrent slik ut 90A0CC77-35BA-4C09-AC28-D196D991B50D
+ (TSPItem *) createItemWithName:. (NSString *) navn andPrice: (float) pris {//Initial Element TSPItem * element = [[TSPItem alloc ] i det]; //Konfigurer element [element setName: name]; [element setPrice: pris]; [element setInShoppingList: NO]; [element setUuid: [[NSUUID UUID] UUIDString]]; returnere varen;}
5. Lasting og lagring elementer
Data utholdenhet kommer til å være sentrale i vår handleliste program så la oss ta en titt på hvordan å implementere dette. Åpne gjennomføringen fil av TSPListViewController, legge til en privat eiendom av type NSMutableArray, og gi den navnet elementer
#import "TSPListViewController.h"@interface TSPListViewController ()property NSMutableArray * varer;.end
Elementene som vises i visningen kontrollerens tabellvisning vil bli lagret i elementer. Det er viktig at elementene er en foranderlig array, fordi vi vil legge muligheten til å legge til nye elementer litt senere i denne leksjonen.
I klassens initialisering metoden, laster vi en liste over elementer fra disk og lagre den i privat elementer eiendom som vi erklært en liten stund siden. Vi har også satt visningen kontrollerens tittel til elementer som vist nedenfor Anmeldelser - (id) initWithCoder: (NSCoder *) aDecoder {selv = [super initWithCoder: aDecoder].; if (egen-) {//Set Tittel self.title = @ "elementer"; //Laste Elementer [selvtillit loadItems]; } Returnere selv;}
Utsikten kontrollerens loadItems metoden er noe mer enn en hjelper metode for å holde klassens initWithCoder: metode konsis og lesbar. La oss ta en titt på gjennomføringen av loadItems.
Laste elementer
loadItems metoden starter med henting av banen til filen der listen over elementer er lagret. Vi gjør dette ved å ringe pathForItems, en annen hjelper metode som vi skal se på i en liten stund Anmeldelser - (åpne) loadItems {NSString * filepath = [selv pathForItems].; if ([[NSFileManagers defaultManager] fileExistsAtPath: filepath]) {self.items = [NSKeyedUnarchiver unarchiveObjectWithFile: filepath]; } Else {self.items = [NSMutableArray matrise]; }}
NSFileManagers klasse, i neste linje med kode, er en klasse som vi ikke har jobbet med ennå. Den NSFileManagers klassen gir en lett-å-bruke Objective-C API for å arbeide med filsystemet. Vi får en referanse til en forekomst av klassen ved å spørre det for standard leder
Standard leder er sendt et budskap om fileExistsAtPath. Og bestått filbanen vi oppnådd i første linje. Hvis det finnes en fil på det stedet som er angitt av filen banen, så vi laster innholdet i filen til elementer eiendom. Hvis det finnes noen fil på det stedet, så vi instansierer en tom foranderlig array.
Legge filen til visningen kontrollerens elementer eiendom gjøres gjennom NSKeyedUnarchiver klassen som vi snakket om tidligere. Klassen er i stand til å lese binære data som finnes i filen og konvertere den til et objekt graf, en rekke TSPItem forekomster i dette tilfellet. Denne prosessen vil bli klarere når vi ser på saveItems metoden i et minutt.
Hvis vi skulle laste inn innholdet i en fil som ikke eksisterer, så varer eiendommen ville bli satt til null i stedet for en tom foranderlig array. Dette er en subtil, men viktig forskjell som vi skal se litt senere i denne opplæringen.
La oss nå ta en titt på pathForItems helper metoden. Metoden starter med å hente banen til Dokumenter-katalogen i programmets sandkasse. Dette trinnet bør være kjent Anmeldelser - (NSString *) pathForItems {NSArray * stier = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES.); NSString * dokumenter = [stier lastObject]; tilbake [dokumenter stringByAppendingPathComponent: @ "items.plist"];}
Metoden returnerer banen til filen som inneholder programmets liste over elementer ved å føye til en streng til banen til dokumenter katalogen. Det kan være lurt å lese den forrige setningen et par ganger for å la det synke inn
Det fine med å bruke stringByAppendingPathComponent. Er at innsetting av stiseparatorer er gjort for oss der det er nødvendig. Med andre ord, gjør at vi får en gyldig filbane systemet.
Lagre Elementer
Selv om vi ikke skal være redde elementer før senere i denne leksjonen, er det en god idé å gjennomføre det mens vi er i gang. Gjennomføringen av saveItems er veldig konsise takket være pathForItems hjelperen metoden.
Vi først hente banen til filen som inneholder programmets liste over elementer og deretter skrive innholdet av elementer eiendom til stedet. Lett. Høyre Anmeldelser - (åpne) saveItems {NSString * filepath = [selv pathForItems]; [NSKeyedArchiver archiveRootObject: self.items toFile: filepath];}
Som vi så tidligere, er prosessen med å skrive et objekt grafen til disk kjent som arkivering. Vi bruker NSKeyedArchiver klasse for å oppnå dette ved å ringe archiveRootObject: toFile:. På NSKeyedArchiver klassen
I løpet av denne prosessen, er hvert objekt i objekt grafen sendte en melding av encodeWithCoder: å konvertere den til binære data. Som jeg sa tidligere, du vanligvis ikke kaller encodeWithCoder. Direkte
For å bekrefte at du legger listen over elementer fra disk fungerer, plassere en logg uttalelse i viewDidLoad metoden i TSPListViewController klassen som vist nedenfor. Kjør programmet i iOS Simulator og sjekke om alt fungerer Anmeldelser - (void) viewDidLoad {[super viewDidLoad].; NSLog (@ "Poster >% @", self.items);}
Hvis du tar en titt på resultatet i konsollen vinduet, vil du legge merke til at elementer eiendommen er lik en tom array som vi forventer På dette punktet. Det er viktig at elementene er ikke lik null. I neste trinn, vil vi gi brukeren et par artikler å jobbe med, en prosess som kalles seeding.
6. Seeding datalageret
seeding et program med data kan ofte bety forskjellen mellom en engasjert bruker og en bruker avslutte programmet etter å ha brukt det for mindre enn et minutt. Seeding et program med dummy data ikke bare hjelper brukerne med å få fart på karrieren, viser det også nye brukere hvordan programmet ser ut og føles med data i den.
seeding handleliste søknad med en innledende liste over elementer isn ' t vanskelig. Når programmet startes, må vi først sjekke om datalageret allerede er sådd med data, fordi vi ikke ønsker å skape like elementer. Dette vil bare forvirre eller frustrere brukeren. Hvis datalageret ikke har blitt sådd ennå, vi laste inn en liste med frø data og bruke listen til å lage datalageret av søknaden.
Logikken for seeding datalageret kan kalles fra et nummer steder i et program, men det er viktig å tenke fremover. Vi kunne sette logikken for seeding datalageret i TSPListViewController klassen, men hva om, i en fremtidig versjon av programmet, andre vise kontrollerne har også tilgang til en liste over elementer. Et godt sted å frø datalageret er i TSPAppDelegate klassen. La oss se hvordan dette fungerer
Åpne TSPAppDelegate.m og endre gjennomføringen av programmet: didFinishLaunchingWithOptions: å se ut som vist nedenfor Z - (BOOL) program:.. (UIApplication *) applikasjons didFinishLaunchingWithOptions :( NSDictionary *) launchOptions {//Seed Items [selvtillit seedItems]; returnere JA;}
Den eneste forskjellen med den forrige implementeringen er at vi først ringe seedItems på programmet delegat. Det er viktig at seeding datalageret skjer før initialisering av noen av de vise kontrollere, fordi datalageret må bli seedet før noen av de vise kontrollerne laster listen over elementer.
Gjennomføringen av seedItems er ikke komplisert. Vi starter ved å lagre en referanse til de delte brukerstandarder protestere og vi sjekker deretter om brukerstandarder database har en oppføring for en nøkkel med navne TSPUserDefaultsSeedItems og om dette innlegget er en boolsk med en verdi på YES.
- (Void) seedItems {NSUserDefaults * ud = [NSUserDefaults standardUserDefaults]; dersom: {//Load Seed Elementer NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "frø" ofType: @ "plist"] ([ud boolForKey @ "TSPUserDefaultsSeedItems"]!); NSArray * seedItems = [NSArray arrayWithContentsOfFile: filepath]; //Elementer NSMutableArray * elementer = [NSMutableArray matrise]; //Opprett Liste over elementer for (int i = 0; i < [seedItems telle]; i ++) {NSDictionary * seedItem = [seedItems objectAtIndex: i]; //Opprett element TSPItem * element = [TSPItem createItemWithName: [seedItem objectForKey: @ "navn"] andPrice: [[seedItem objectForKey: @ "pris"] floatValue]]; //Legg til element av elementer [elementer addObject: element]; } //Elementer Sti NSString * itemsPath = [[selvtillit documentsDirectory] stringByAppendingPathComponent: @ "items.plist"]; //Skriv til fil if ([NSKeyedArchiver archiveRootObject: elementer toFile: itemsPath]) {[ud setBool: JA Forkey: @ "TSPUserDefaultsSeedItems"]; }}}
Nøkkelen kan være hva du vil, så lenge du er konsekvent i å navngi tastene du bruker. Nøkkelen i brukerstandarder database forteller oss om programmet allerede er sådd med data eller ikke. Dette er viktig siden vi bare ønsker å seede handleliste søknaden en gang.
Hvis søknaden ikke har blitt sådd ennå, legger vi en eiendom liste fra programmet bunt heter seed.plist. Denne filen inneholder en rekke ordbøker med hver ordboken representerer et element med et navn og en pris.
Før gjentar gjennom seedItems array, skaper vi en foranderlig array å lagre TSPItem tilfeller at vi er i ferd med å skape . For hver ordboken i seedItems array, skaper vi en TSPItem eksempel, bruker klassen metoden vi erklærte tidligere i denne leksjonen, og vi legger til forekomsten til elementer tabellen.
Til slutt, skaper vi banen til filen hvor vi vil lagre listen over elementer og vi skriver innholdet av elementer array til disk som vi så i saveItems metoden i TSPListViewController klassen
Metoden archiveRootObject. toFile: returnerer JA hvis operasjonen ble avsluttet hell og det er først da at vi oppdaterer brukerstandarder butikken ved å sette boolsk verdi for nøkkel TSPUserDefaultsSeedItems til YES. Neste gang programmet starter, vil datalageret ikke bli seedet igjen.
Du har sikkert lagt merke til at vi har gjort bruk av en annen hjelper metode for å hente programmets dokumenter katalogen. Du kan finne gjennomføringen nedenfor. Det er veldig lik gjennomføring av pathForItems metoden i TSPListViewController klassen Anmeldelser - (NSString *) documentsDirectory {NSArray * stier = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES.); tilbake [stier lastObject];}
Før du kjører programmet, importere header fil av TSPItem klassen og sørge for å kopiere eiendommen listen seed.plist, til prosjektet. Det spiller ingen rolle hvor du lagrer den så lenge det er inkludert i programmets bunten.
#import "TSPItem.h"
Kjør programmet en gang til og inspisere produksjon i konsollen for å se om datalageret ble vellykket seeded med innholdet i seed.plist.
Merk at seeding et datalager med data eller oppdatere en database tar tid. Hvis operasjonen tar for lang tid, kan systemet drepe søknaden før den har hatt sjansen til å fullføre lansering. Apple kaller dette fenomenet vaktbikkje drepe søknaden din.
Din søknad gis en begrenset mengde tid til å lansere. Hvis den ikke klarer å lansere innenfor denne tidsrammen, dreper operativsystemet søknaden din. Dette betyr at du må nøye vurdere når og hvor du utfører visse operasjoner som seeding programmets datalageret.
7. Vise listen over elementer
Vi har nå en liste over elementer å jobbe med. Viser elementene i tabellen visningen av listevisning kontrolleren er ikke vanskelig. Ta en titt på gjennomføringen av de tre metodene i UITableViewDataSource protokollen vist nedenfor. Sine implementeringer bør være kjent for deg nå. . Ikke glem å importere tekstfilen av TSPItem klassen
#import "TSPItem.h" - (NSInteger) numberOfSectionsInTableView: (UITableView *) Tableview {return 1;} - (NSInteger) Tableview: (UITableView *) Tableview numberOfRowsInSection: (NSInteger) seksjon {return [self.items telle];} - (UITableViewCell *) Tableview: (UITableView *) Tableview cellForRowAtIndexPath: (NSIndexPath *) indexPath {//dequeue Gjenbruk Cell UITableViewCell * celle = [Tableview dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath]; //Hente varen TSPItem * element = [self.items objectAtIndex: [indexPath ro]]; //Konfigurer Cell [cell.textLabel setText: [elementnavn]]; returnere celle;}
Før du kjører programmet, erklærer cellen gjenbruk identifikator umiddelbart etterimplementation kompilatoren direktivet som vi så tidligere i denne serien
implementation TSPListViewControllerstatic NSString * CellIdentifier = @ "Cell Identifier";.
Og til slutt, registrere UITableViewCell klassen for cellen gjenbruk identifikator du bare erklære i visningen kontrollerens viewDidLoad metode Anmeldelser - (void) viewDidLoad {[super viewDidLoad].; //NSLog (@ "Poster >% @", self.items); //Register klasse for Cell Gjenbruk [self.tableView Register: [UITableViewCell klasse] forCellReuseIdentifier: CellIdentifier];}
Bygg prosjektet og kjøre programmet i iOS Simulator for å se listen over elementer som vises i listevisning kontrollerens tabellvisning.
8. Legge til elementer - Del 1
Uansett hvor godt vi lage en liste over frø elementer, vil brukeren sikkert ønske å legge til flere elementer i listen. Den vanligste tilnærmingen på iOS for å legge til nye elementer til en liste er ved å presentere brukeren med en modal utsikt der nye data kan legges inn
Dette betyr at vi må.
legge til en knapp for å legge til nye elementer
opprette en visning kontrolleren som styrer visningen som aksepterer brukerundersøkelser
opprette et nytt element basert på brukerens input
legge den nyopprettede elementet til tabellvisning
Legge til en knapp
Legge til en knapp på navigasjonsfeltet krever en linje med kode. Revidere viewDidLoad metoden i TSPListViewController klassen og oppdatere det å reflektere gjennomføring under Anmeldelser - (void) viewDidLoad {[super viewDidLoad].; //NSLog (@ "Poster >% @", self.items); //Register klasse for Cell Gjenbruk [self.tableView Register: [UITableViewCell klasse] forCellReuseIdentifier: CellIdentifier]; //Opprett Legg Button self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemAdd mål: selv handling:selector (AddItem:)];}
I leksjon om fanelinjen kontrollere, vi så at hver visning controller har en tabBarItem eiendom. Tilsvarende har hver visning kontrolleren en navigationItem eiendom, en unik forekomst av UINavigationItem representerer visningen kontrolleren i navigeringslinjen i den overordnede syn controller-navigeringskontrolleren.
navigationItem Eiendommen har en leftBarButtonItem eiendom, som er en forekomst av UIBarButtonItem, og referanser baren knappen elementet vises på venstre side av navigasjonsfeltet. Den navigationItem Eiendommen har også en titleView og en rightBarButtonItem eiendom
I viewDidLoad metode, setter vi leftBarButtonItem eiendom visningen kontrolleren navigationItem til en forekomst av UIBarButtonItem ved å kalle initWithBarButtonSystemItem. Target: action, og passerer UIBarButtonSystemItemAdd som første argument. Denne metoden skaper en system gitt forekomst av UIBarButtonItem
Selv om vi allerede har møtt den target-handlingsmønster, andre og tredje parameter for initWithBarButtonSystemItem. Target: action: trenger noen forklare. Når knappen i navigasjonsfeltet tappes, et budskap om AddItem: sendes til målet, selv eller TSPListViewController eksempel
Som jeg sa, vi har allerede møtt den target-handlingsmønster når vi koblet en. knappen touch hendelse til en handling i dreieboken noen leksjoner siden. Dette er svært like, den eneste forskjellen er at tilkoblingen er gjort programmatisk.
Målet-handlingsmønster er svært vanlig i Cocoa. Ideen er enkel. Et objekt holder en referanse til meldingen eller handling velger som trenger å bli sendt til en bestemt gjenstand, og målet, en gjenstand som meldingen skal sendes.
Vent et minutt. Hva er en velger? En selektor er navnet eller den unike identifikator som brukes til å velge en metode som et objekt er forventet å utføre. En velgeren er av typen SEL og kan lages ved hjelp avselector kompilatoren direktivet. . Du kan lese mer om velgere i Apples Cocoa kjernekompetanse
guide
Før du kjører programmet i iOS Simulator, må vi opprette tilsvarende AddItem: metode i visningen kontrolleren. Hvis vi ikke gjør dette, vil visningen kontrolleren ikke være i stand til å svare på meldingen den mottar når det bankes på knappen, og et unntak vil bli kastet.
Ta en titt på formatet på metodedefinisjon i kodebiten nedenfor. Som vi så tidligere i denne serien, godtar handlingen ett argument, objektet som sender meldingen til visningen kontrolleren (mål), som er den knappen i navigasjonsfeltet i vårt eksempel.
- (Void) AddItem :( id) avsender {NSLog (@ "Button ble tappet.");}
Jeg har lagt til en logg uttalelse til metoden gjennomføringen for å teste om oppsettet fungerer riktig. Bygge prosjektet og kjøre programmet for å teste knappen i navigasjonsfeltet.
Opprette en View Controller
Opprett en ny UIViewController underklasse (ikke en UITableViewController underklasse) og kall den TSPAddItemViewController trenger
. Vi først å erklære to utsalg i klassens header fil for de to tekstfelt som vi skal lage i en liten stund. Denne prosessen bør være kjent nå. Ta en titt på topptekstfilen vist nedenfor (kommentarer er utelatt)
#import < UIKit /UIKit.h >interface TSPAddItemViewController. UIViewController @ eiendom IBOutlet UITextField * nameTextField;property IBOutlet UITextField * priceTextField; end
Vi trenger også å erklære to handlinger i klassen gjennomføring fil (MTAddItemViewController.m). Den første handlingen, avbryte :, vil avbryte opprettelsen av et nytt element, mens den andre handlingen, lagre :, vil spare den nyopprettede elementet Anmeldelser - (IBAction) avbryte:. (Id) avsender {} - (IBAction) lagre: (id) avsender {}
Åpne dreieboken, dra en UIViewController eksempel fra Object Library
, og sette sin klasse TSPAddItemViewController i Identity Inspector
.
Opprett en manuell naturlig overgang ved å trykke Kontroll og dra fra List View Controller
objekt til Legg til element View Controller
objekt. Velg Modal
fra menyen som dukker opp.
Velg segue du nettopp opprettet, åpner attributter Inspector
, og sette Identifier
til AddItemViewController
Før vi legger tekstfeltene, velg add element visning kontrolleren og legge det i en navigeringskontrolleren ved å velge Embed In >.; Navigation Controller
fra Editor
menyen.
Tidligere i denne leksjonen, vi programma lagt en UIBarButtonItem til listevisning kontrollerens navigasjon element. La oss utforske hvordan dette fungerer i et storyboard. Zoom inn på add element visning controller, legge to UIBarButtonItem tilfeller av sin navigasjonsfeltet, posisjonering en på hver side. Velg den venstre knappen elementet, åpne attributter Inspector, og satt Identifier å avbryte. Gjør det samme for høyre bar knappen element, men i stedet sette Identifier å spare.
Velg Legg til element View Controller
objekt, åpner du Tilkoblinger Inspektør
på høyre, og koble den avbryter: action med venstre bar knappen objekt og spare. handling med høyre bar knappen element
Drag to UITextField tilfeller fra objektbiblioteket til tilleggselement view controller syn. Plasser tekstfelt som vist i skjermbildet nedenfor.
Velg den øverste tekstfeltet, åpner attributter Inspector, og skriv navn i Placeholder feltet. Velg den nederste tekstfeltet, og i attributter Inspector, setter sin eksempelteksten til Pris og tastatur til Number Pad. Dette sikrer at brukere kan bare taste inn tall i bunntekstfeltet. Velg Legg til element View Controller
objekt, åpner Connections Inspector, og koble nameTextField og priceTextField uttak til de tilhørende tekstfeltene i visningen kontrolleren syn.
Det var litt av en bit av arbeid . Alt vi har gjort i dreieboken kan også gjøres programmatisk. Noen utviklere ikke engang bruke storyboards og skape hele programmets brukergrensesnitt programmatisk. Det er akkurat det som skjer under panseret likevel
Implementing AddItem.
Med TSPAddItemViewController klassen klar til bruk, la oss dra tilbake til den AddItem: handlingen i TSPListViewController klassen.