Navigation kontrollere og View Controller hierarkier
to
Del
6
Del
Dette Cyber mandag Envato Tuts + Kursene 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.Table Vis BasicsExploring Tab Bar Controller
Navigasjon kontrollere er en av de viktigste verktøyene for å presentere flere skjermer av innhold med iOS SDK. Denne artikkelen vil lære deg hvordan du gjør nettopp det!
Innledning
Som vi så i forrige leksjon, er UIKit bord syn klasse en fin måte å presentere tabell eller søyle data. Men når innhold må være spredt over flere skjermer, en navigeringskontrolleren, implementert i UINavigationController klassen, er ofte førstevalget.
Akkurat som alle andre UIViewController underklasse, forvalter en navigeringskontrolleren en UIView eksempel. Navigeringskontrolleren syn forvalter flere subviews inkludert en navigasjonslinjen øverst, et syn som inneholder tilpasset innhold, og en valgfri verktøylinjen nederst.
En navigasjonskontrolleren skaper og forvalter et hierarki av visningskontrollere, som er kjent som et navigasjons stabel. Når du forstår hvordan navigasjons kontrollere fungerer de vil bli lett å bruke.
I denne artikkelen vil vi lage en ny iOS søknad om å bli kjent med UINavigationController klassen. Du vil merke at kombinasjonen av en navigeringskontroller og en stabel med (tabell) se kontrollerne er en elegant og kraftig løsning.
I tillegg til UINavigationController klassen, jeg vil også dekke UITableViewController klassen, en annen UIViewController underklasse. Den UITableViewController klasse forvalter en UITableView eksempel i stedet for standard UIView eksempel. Som standard, vedtar det de UITableViewDataSource og UITableViewDelegate protokoller, som vil spare oss ganske mye tid.
En annen Prosjekt
Søknaden at vi er i ferd med å skape heter Library. Med vår søknad, kan brukerne bla gjennom en liste over forfattere og vise bøkene de har skrevet. Listen over forfattere blir presentert i en tabellvisning.
Når brukeren kraner navnet på en forfatter, animerer en liste over bøker som er skrevet av forfatteren til syne. Tilsvarende når brukeren velger en tittel fra listen over bøker, animerer et annet syn til syne, viser en fullscreen bilde av bokomslaget. La oss komme i gang
Opprette prosjekt
Åpne Xcode, opprette et nytt prosjekt ved å velge New >.; Prosjekt ...
fra Fil
menyen, og velg Single Vis Application mal fra listen over iOS
maler.
Navn prosjektet Library, tildele et organisasjonsnavn, og et selskap identifikator. Velg en klasse prefiks og satt enheter til iPhone. Fortell Xcode hvor du vil lagre prosjektet og traff Opprett.
Malen som vi valgte for dette prosjektet inneholder et program delegat klasse (TSPAppDelegate), et storyboard, og en UIViewController underklasse (TSPViewController). Anmeldelser
Åpne TSPAppDelegate.m og ta en titt på gjennomføringen av programmet: didFinishLaunchingWithOptions :. Gjennomføringen bør se kjent nå Anmeldelser - (BOOL) program: (UIApplication *) søknad didFinishLaunchingWithOptions:. (NSDictionary *) launchOptions {return JA;}
legge til ressurser
kildefilene som følger med denne artikkelen omfatter data som vi skal bruke. Du finner dem i mappen Resources. Mappen inneholder en eiendom liste (Books.plist) som inneholder informasjon om forfatterne, bøkene de har skrevet, og litt informasjon om hver bok, og et bilde for hver bok inkludert i eiendoms listen.
Drag Resources mappen inn i prosjektet for å legge dem til prosjektet. Xcode vil vise deg noen alternativer når du legger mappen til prosjektet. Sørg for å sjekke avmerkingsboksen Kopier elementer til bestemmelses gruppens mappe (om nødvendig) og ikke glem å legge til filene i biblioteket målet
Eiendom Lister
. Før du fortsetter , ønsker jeg å ta en stund å snakke om eiendoms lister og hva de er. En egenskap listen er noe mer enn en representasjon av et objekt graf. Som vi så tidligere i denne serien, er et objekt graf en gruppe av objekter som danner et nettverk gjennom koblinger eller referanser de deler med hverandre.
Det er lett å lese og skrive eiendomslister fra og til disk, som gjør dem ideelle for oppbevaring av små mengder data. Når du arbeider med eiendomslister, er det også viktig å huske at bare visse typer data kan lagres i eiendoms lister, for eksempel strenger, tall, datoer, arrays, ordbøker, og binære data.
Xcode gjør surfing eiendom lister veldig lett som vi så tidligere. Velg Books.plist fra Resources mappen du har lagt til i prosjektet, og bla gjennom innholdet på Books.plist bruker Xcode innebygde eiendom liste nettleser. Dette vil være et nyttig verktøy senere i denne artikkelen når vi begynne å jobbe med innholdet i Books.plist.
subclassing UITableViewController
Før vi kan begynne å bruke data som er lagret i Books.plist, vi først må legge litt grunnarbeid. Dette inkluderer å lage en visning kontroller som styrer en tabellvisning, som vil vise forfatterne oppført i Books.plist.
I stedet for å bruke en UIViewController underklasse og legge en tabellvisning til visningen kontrolleren syn, slik vi gjorde i den forrige artikkelen, vil vi lage en UITableViewController underklasse som jeg antydet tidligere i denne artikkelen.
Start med å fjerne TSPViewController.h Hotell og TSPViewController.m Anmeldelser fra prosjekt. Opprett en ny klasse ved å velge New > Fil ...
fra Fil
menyen. Velg Objective-C klassen
mal i listen over iOS > Cocoa Touch
maler.
navn den nye klassen TSPAuthorsViewController og gjøre det en underklasse av
UITableViewController. Det er ikke nødvendig å sjekke avmerkingsboksen også opprette XIB fil
som vi skal bruke dreieboken for å skape programmets brukergrensesnitt.
Åpne Main.storyboard
til erstatte visningen kontrolleren i dreieboken med en tabellvisning kontrolleren. Velg visningen kontrolleren i dreieboken, trykke på slettetasten og dra en UITableViewController
eksempel fra Object Library
til høyre. Velg den nye visningen kontrolleren, åpner du Identity Inspektør
på høyre, og sette sin klasse til
TSPAuthorsViewController.
Deretter velger tabellvisning objektet i arbeidsområdet eller fra listen over objekter på venstre, åpner Egenskaper Inspektør
på høyre side, og sette Prototype Cells
til 0. Vi vil ikke bruke prototype celler i denne artikkelen.
Fylle den Tabell
Åpne TSPAuthorsViewController.m og inspisere filens innhold. BecauseTSPAuthorsViewController er en underklasse av UITableViewController, er gjennomføringen filen befolket med standard implementeringer av de nødvendige og noen valgfrie metoder for UITableViewDataSource og UITableViewDelegate protokoller.
Før vi kan vise data i tabellvisningen, trenger vi data til utstilling. Som jeg nevnte tidligere, vil eiendommen liste Books.plist tjene som datakilde tabellvisningen. For å bruke data som er lagret i Books.plist, trenger vi først å laste innholdet inn i et objekt, en matrise for å være presis.
Opprett en egenskap av type NSArray i visningen kontrollerens header fil og gi den navnet forfattere.
#import < UIKit /UIKit.h >interface TSPAuthorsViewController: UITableViewController @ eiendom (sterk, nonatomic) NSArray * forfattere;end
Utsikten kontrollerens viewDidLoad metoden er et godt sted å laste inn data fra bøker. plist inn utsikten kontrolleren forfattere eiendom. Vi kan gjøre dette ved hjelp av en NSArray klassemetode, arrayWithContentsOfFile :.
self.authors = [NSArray arrayWithContentsOfFile: filepath];
Metoden godtar en fil banen, noe som betyr at vi må finne ut hva filen banen Books.plist er. Filen, Books.plist, ligger i søknaden bunt, som er et fancy navn på katalogen som inneholder programmet kjørbar og programmets ressurser-bilder, lyder, etc.
For å få filbanen for Books.plist, trenger vi først en referanse til programmets hoved bundle ved hjelp mainBundle, en NSBundle klassemetode. Det neste trinnet er å spørre programmets bunt for banen til en av sine ressurser, Books.plist. Vi gjør dette ved å sende det et budskap om pathForResource: ofType: og bestått navn og type (forlengelse) på filen vi ønsker banen for. Vi lagrer filen banen i en forekomst av NSString som vist nedenfor
NSString * filepath = [[NSBundle mainBundle] pathForResource: @ & quot; Bøker & quot;. ofType: @ & quot; plist & quot;];
Hvis vi setter de to delene sammen, ender vi opp med følgende gjennomføring av viewDidLoad. Jeg har også lagt til en NSLog statement å logge innholdet i forfattere eiendom til konsollen, slik at vi kan undersøke innholdet etter lasting eiendommen liste Anmeldelser - (void) viewDidLoad {[super viewDidLoad].; NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "bøker" ofType: @ "plist"]; self.authors = [NSArray arrayWithContentsOfFile: filepath]; NSLog (@ "forfattere >% @", self.authors);}
Hvis du har lest den forrige artikkelen i denne serien, så fyller utsikten tabellen bør være grei. Tabellvisningen vil inneholde bare én del, som gjør gjennomføringen av numberOfSectionsInTableView: trivielle Anmeldelser - (NSInteger) numberOfSectionsInTableView: (UITableView *) Tableview {return 1;}
Antall rader i den eneste delen av. tabellvisning er lik antall forfattere i forfatterne rekke så alt vi trenger å gjøre er å telle tabellens elementer Anmeldelser - (NSInteger) Tableview:. (UITableView *) Tableview numberOfRowsInSection: (NSInteger) seksjon {return [selvtillit. Forfatterne telle];}
Gjennomføringen av Tableview: cellForRowAtIndexPath: er lik den vi så i den forrige artikkelen. Den største forskjellen er hvordan vi hente data som vi viser i tabellvisningen cellen.
Rekken av forfatterne inneholder en ordnet liste av ordbøker, med hver ordboken inneholder to nøkkelverdipar. Objektet for nøkkelen heter forfatteren er en forekomst av NSString, mens objektet for de viktigste bøker er en rekke ordbøker med hver ordboken representerer en bok skrevet av forfatteren. Åpne Books.plist i Xcode å inspisere strukturen i datakilden hvis dette ikke er klart
Med denne informasjonen i bakhodet, gjennomføring av Tableview. CellForRowAtIndexPath. Bør ikke være for vanskelig Anmeldelser - (UITableViewCell *) Tableview: (UITableView *) Tableview cellForRowAtIndexPath: (NSIndexPath *) indexPath {statisk NSString * CellIdentifier = @ "Cell Identifier"; [Tableview Register: [UITableViewCell klasse] forCellReuseIdentifier: CellIdentifier]; UITableViewCell * celle = [Tableview dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath]; //Fetch Forfatter NSDictionary * author = [self.authors objectAtIndex: [indexPath ro]]; //Konfigurer Cell [cell.textLabel setText: [forfatter objectForKey: @ "forfatter"]]; returnere celle;}
Tastene av en ordbok og små bokstaver, så dobbeltsjekke nøklene hvis du får problemer. Bygge og drive prosjektet enda en gang for å se resultatet.
Legge til en Navigation Controller
Legge til en navigeringskontrolleren er enkelt å bruke et storyboard. Men før vi legger en navigeringskontrollen, er det viktig å forstå hvordan navigasjons kontrollere fungerer på iOS.
Akkurat som alle andre UIViewController underklasse, forvalter en navigeringskontrolleren en UIView eksempel. Navigeringskontrolleren syn forvalter flere subviews inkludert en navigasjonslinjen øverst, et syn som inneholder tilpasset innhold, og en valgfri verktøylinjen nederst. Hva gjør en navigeringskontrolleren unik er at den klarer en stabel med utsikt kontrollerne.
Begrepet stack kan nesten tas bokstavelig. Når et navigasjonskontrolleren er initialisert, er en rot view controller spesifisert som vi vil se i et øyeblikk. Roten view controller er utsikten controller nederst i navigasjons stabelen.
Ved å trykke på en annen visning kontrolleren til navigasjons stabelen, er visningen av roten view controller erstattes med visning av den nye visningen kontrolleren. Når du arbeider med navigasjonskontrollere, er den synlige visningen alltid visningen av den øverste visning kontrolleren av navigasjons stabelen.
Når en visning kontrolleren er fjernet eller poppet fra navigasjons stabelen, visning av den oppfatning kontrolleren under den blir synlig igjen. Ved å trykke og spratt vise kontrollerne på og fra en navigasjonskontrolleren navigasjon stabelen, er et hierarki visning opprettet, og som et resultat, kan en datahierarki opprettes. La oss se hvordan alt dette presser og spratt fungerer i praksis.
Revidere prosjektets storyboard ( Main.storyboard
) og velg visningen kontrolleren. For å legge til en navigasjonskontrolleren til mix, velg Embed In > Navigation Controller
fra Editor
menyen. Et par ting har endret seg:
navigeringskontrolleren er dreieboken sin første visningen controller
en ny scene som heter Navigasjon Controller Scene
har blitt lagt
< li> en navigeringslinje legges til navigasjon og forfatterne vise kontrolleren
navigeringskontrolleren og forfatterne vise kontrolleren er koblet sammen med en naturlig overgang
segues er vanlig i storyboards og vi? ll lære mer om dem senere i denne serien. Det finnes ulike typer segues og naturlig overgang som forbinder navigasjon og forfatterne vise kontrolleren er en sammenheng naturlig overgang.
Hver navigeringskontrolleren har en rot utsikt controller, utsikten controller nederst i navigasjons stabelen. Det kan ikke være popped fra navigasjons stabelen som et navigeringsvisningen kontrolleren må alltid sikte på kontrolleren for å vise til brukeren.
naturlig overgang mellom navigasjonskontrolleren og forfatterne vise kontrolleren symboliserer at sistnevnte er roten view controller av navigasjonskontrolleren.
Navigasjonslinjen øverst på navigasjonskontrolleren og forfattere vise kontrolleren er noe du får gratis når du arbeider med navigasjonskontrollere. Det er en forekomst av UINavigationBar og bidrar til å navigere navigasjons stabelen.
Selv om navigasjonskontrolleren er den første visningen kontrolleren av dreieboken, forfatterne vise kontrolleren er den første visningen kontrolleren vi får se når du starter programmet. Som jeg nevnte tidligere, er navigeringskontrolleren noe mer enn en wrapper som hjelper navigere mellom et hierarki av visningskontrollere. Sitt syn er befolket av synspunktene til visningen kontrollere i sin navigasjon stabelen
For å legge til en tittel i navigasjonsfeltet, setter du inn følgende linje inn i viewDidLoad metoden i TSPAuthorsViewController klassen Anmeldelser -.. (Void ) viewDidLoad {[super viewDidLoad]; //Set Tittel self.title = @ "Forfattere"; //Laste Books NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "bøker" ofType: @ "plist"]; self.authors = [NSArray arrayWithContentsOfFile: filepath];}
Hver visning kontrolleren har en tittel eiendom som brukes i ulike steder som navigasjonslinjen. Bygge og drive prosjektet for å se resultatet av dette småpenger.
Pushing og spratt
Det er på tide å legge evnen til å se en liste over bøker når brukeren kraner navnet på en forfatter . Dette betyr at vi må ta valget, navnet på forfatteren, bruke et nytt syn kontroller basert på at valg, og skyv den nye visningen kontrolleren til navigasjons stabelen for å vise det til brukeren. Høres dette komplisert? Det er ikke. La meg vise deg.
En annen Table View Controller
Hvorfor ikke vise listen over bøker i en annen tabellvisning. Opprett en ny underklasse av UITableViewController og gi den navnet TSPBooksViewController.
Legge listen over bøker er lett som vi så tidligere, men hvordan bøkene vise kontrolleren vet hva forfatteren brukeren har valgt? Det er flere måter å fortelle den nye visningen kontrolleren om brukerens valg, men tilnærmingen som Apple anbefaler er kjent som passerer ved henvisning. Hvordan fungerer dette?
Bøkene vise kontrolleren erklærer en eiendom som heter forfatteren, som kan settes til å konfigurere bøkene vise kontrolleren til å vise bøkene til den valgte forfatteren. Åpne TSPBooksViewController.h og legge en eiendom av type NSString og name it forfatter som vist nedenfor. Du kan ignorere nonatomic nøkkelordet for nå. Det er ikke viktig for vår historie i øyeblikket
#import < UIKit /UIKit.h >interface TSPBooksViewController. UITableViewController @ eiendom (nonatomic) NSString * forfatter;end
Husker fra noen leksjoner siden at Fordelen med Objective-C egenskapene er at getter og setter-metoder for de tilsvarende forekomst variabler genereres automatisk for oss. Det er tider, men når det er nødvendig eller nyttig å implementere din egen getter eller setter metoden. Dette er en av de gangene.
Når forfatteren eiendommen av TSPBooksViewController klassen er satt, må datakilden av visningen tabellen som skal endres. Vi vil gjøre dette i fuglehunden metoden i _author instansvariabel. La oss se hvordan dette fungerer.
Åpne TSPBooksViewController.m og legge en eiendom tilinterface blokk på toppen av gjennomføringen filen. Du vil kanskje bli overrasket over å se eninterface blokk i klassen implementering fil. Dette er kjent som en klasse forlengelse, og som navnet tilsier, det kan for å utvide grensesnittet av klassen. Fordelen med å legge en klasse forlengelse til gjennomføringen fil av en klasse er at egenskapene og instansvariabler du angir i en klasse forlengelse er private, noe som betyr at de er kun tilgjengelig med forekomster av klassen.
interface MTAuthorsViewController ()property NSArray * bøker;end
Ved å erklære bøker eiendom i klassen forlengelse av TSPBooksViewController, kan det bare nås og modifisert av en forekomst av klassen. Hvis en instansvariabel eller eiendom skal bare gis til forekomster av klassen, så det anbefales å erklære det som privat.
Den setter metoden for visningen kontrollerens _author instansvariabel limes nedenfor. Du kan legge dem inn hvor som helst i klassensimplementation blokken. Ikke bli skremt av gjennomføringen. La oss starte på toppen Anmeldelser - (void) setAuthor: (NSString *) forfatter {if (_author = forfatter!) {_author = Forfatter;. NSString * filepath = [[NSBundle mainBundle] pathForResource: @ "bøker" ofType: @ "plist"]; NSArray * forfattere = [NSArray arrayWithContentsOfFile: filepath]; int teller = authors.count; for (int i = 0; i < telle; i ++) {NSDictionary * authorDictionary = [forfattere objectAtIndex: i]; NSString * tempAuthor = [authorDictionary objectForKey: @ "forfatter"]; if ([tempAuthor isEqualToString: _author]) {self.books = [authorDictionary objectForKey: @ "bøker"]; }}}}
Vi først kontrollere om den nye verdien, forfatter, skiller seg fra den nåværende verdien av _author. Den understrek foran forfatteren viser at vi er direkte tilgang til instansvariabel. Begrunnelsen for denne kontrollen er at det er vanligvis ikke nødvendig å sette verdien av en instansvariabel hvis verdien ikke er endret.
Hvis den nye verdien er forskjellig fra dagens verdi, så vi oppdaterer verdien av _author forekomsten variabel med den nye verdien. En tradisjonell setter vanligvis ender her. Men vi implementere en tilpasset setter metode for en grunn, dynamisk sett eller oppdatere bøker array, datakilde tabellvisningen.
De neste to linjene bør være kjent. Vi legger eiendommen listen fra applikasjons bunt og lagre innholdet i en matrise som heter forfatterne. Vi iterere over listen over forfattere og søke etter forfatteren som samsvarer med forfatteren lagret i _author.
Det viktigste bit av denne fuglehunden er sammenligningen mellom tempAuthor og _author. Hvis du skulle ta en dobbelt likhetstegn (==) for denne sammenligningen, du ville være å sammenligne de referanser til objekter (pekere) og ikke de strenger objektene administrerer. Den NSString klassen definerer en metode, isEqualToString :, som tillater oss å sammenligne strenger i stedet for objektpekere.
For mer informasjon om settere og getters (accessors), vil jeg gjerne henvise til Apples dokumentasjon. Det er vel verdt din tid til å lese denne delen av dokumentasjonen.
Resten av TSPBooksViewController klassen er lett i forhold til hva vi har dekket så langt. Ta en titt på implementeringer av de tre UITableViewDataSource protokoll metoder vist nedenfor Anmeldelser - (NSInteger) numberOfSectionsInTableView: (UITableView *) Tableview {return 1;} - (NSInteger) Tableview:. (UITableView *) Tableview numberOfRowsInSection: (NSInteger) seksjon {return [self.books telle];} - (UITableViewCell *) Tableview: (UITableView *) Tableview cellForRowAtIndexPath: (NSIndexPath *) indexPath {statisk NSString * CellIdentifier = @ "Cell Identifier"; [Tableview Register: [UITableViewCell klasse] forCellReuseIdentifier: CellIdentifier]; UITableViewCell * celle = [Tableview dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath: indexPath]; //Fetch Book NSDictionary * bok = [self.books objectAtIndex: [indexPath ro]]; //Konfigurer Cell [cell.textLabel setText: [bok objectForKey: @ "Title"]]; returnere celle;}
Pushing a View Controller
Når brukeren taps en forfatters navn i forfatterne vise kontrolleren, bør søknaden viser en liste over bøker som er skrevet av forfatteren. Dette betyr at vi trenger på å bruke en forekomst av TSPBooksViewController klassen, forteller eksempel hva forfatteren ble valgt av brukeren, og skyv den nye visningen kontrolleren til navigasjons stabelen for å vise det.
Storyboards vilje hjelper oss med dette. Åpne Main.storyboard
, dra en annen
UITableViewController eksempel fra Object Library
, og sette sin klasse TSPBooksViewController i Identity Inspector
.
Velg tabellvisningen i den nye visningen kontrolleren og angi antall Prototype Cells
til 0 i Egenskaper Inspector
som vi gjorde for forfatterne vise kontrolleren. Å presse bøkene vise kontrolleren til navigasjons stabel av navigasjonskontrolleren, må vi opprette en annen naturlig overgang. Denne gangen, derimot, må vi opprette en manuel naturlig overgang
, en trykk naturlig overgang
å være presis.
Velg forfatterne vise kontrolleren i dreieboken, hold Ctrl-tasten, og dra fra forfatterne vise kontrolleren til bøkene vise kontrolleren. Velg Push
fra menyen som ser ut til å skape en naturlig overgang mellom de to view kontrollerne.
Det er en ting vi må gjøre før du går tilbake til gjennomføringen av bøkene vise kontrolleren. Velg segue vi laget, åpner Egenskaper Inspektør
på høyre, og setter naturlig overgang Identifier
til BooksViewController
. . Ved å gi segue et navn, kan vi henvise til den i kode
For å si det naturlig overgang til å bruke, må vi implementere Tableview: didSelectRowAtIndexPath: metode forfatterne vise kontrolleren. Denne metoden er definert i UITableViewDelegate protokollen som vi så i forrige artikkel om bord visninger.
Før vi kommer i gang, legger en import uttalelse på toppen av TSPAuthorsViewController.m
å importere header fil av theTSPBooksViewController klasse.
#import "TSPBooksViewController.h"
Vi trenger også å erklære en privat eiendom til midlertidig lagring av brukerens valg, forfatteren brukeren har valgt fra visningen tabellen. Vi så allerede hvordan du gjør dette i TSPBooksViewController klassen
interface TSPAuthorsViewController ()property NSString * forfatter;end
Gjennomføringen av Tableview. DidSelectRowAtIndexPath: er kort. Vi fjerner markeringen raden brukeren har tappet, hente forfatteren ordbok som korresponderer med brukerens valg, trekke navnet på forfatteren, og utfører naturlig overgang som kobler forfatterne vise kontroller med bøkene vise kontrolleren
. - (void) Tableview: (UITableView *) Tableview didSelectRowAtIndexPath: (NSIndexPath *) indexPath {[Tableview deselectRowAtIndexPath: indexPath animerte: YES]; //Fetch Forfatter NSDictionary * author = [self.authors objectAtIndex: [indexPath ro]]; self.author = [forfatter objectForKey: @ "forfatter"]; //Utfør Segue [selv performSegueWithIdentifier: @ "BooksViewController" avsender: selv];}
performSegueWithIdentifier: avsender: metoden tar to argumenter, identifikatoren til naturlig overgang og avsenderen av meldingen. Det skal nå være klart hvorfor vi ga push naturlig overgang en identifikator i dreieboken?
Vi setter forfatteren tilhører forfatterne View Controller, men hvordan bøkene vise kontrolleren vet hva forfatteren brukeren valgt? Før en naturlig overgang er utført, får utsikten kontrolleren et budskap om prepareForSegue: avsender :. I denne metoden, kan visningen kontrolleren konfigurere reisemålet visning kontrolleren, bøkene vise kontrolleren. La oss gjennomføre prepareForSegue: avsender: å se hvordan dette fungerer Anmeldelser - (void) prepareForSegue:. (UIStoryboardSegue *) segue avsender: (id) avsender {if ([segue.destinationViewController isKindOfClass: [TSPBooksViewController klasse]]) {//Konfigurer Bøker View Controller [(TSPBooksViewController *) segue.destinationViewController setAuthor: self.author]; //Tilbake Forfatter [selv setAuthor: null]; }}
Denne metoden er påberopt når en naturlig overgang er utført. Vi sjekker først om destinationViewController eiendommen av naturlig overgang er en forekomst av TSPBooksViewController klassen. Vi bruker isKindOfClass: for dette. Vi satt forfatteren eiendom av bøkene vise kontrolleren og sette forfatteren tilhører forfatterne vise kontrolleren til null. Sistnevnte er en beste praksis.
Du kan lure på når vi initial bøkene vise kontrolleren? Vi har ikke eksplisitt instantiate en forekomst av bøkene vise kontrolleren. Dreieboken vet hvilken klasse den trenger på å bruke og det gjør dette for oss.
Før du kjører programmet, åpen TSPBooksViewController.m Hotell og angi visningen kontrolleren tittel til forfatteren eiendommen. Dette vil oppdatere tittelen på navigasjonslinjen Anmeldelser - (void) viewDidLoad {[super viewDidLoad].; //Sett Tittel self.title = self.author;}
Bygg og kjøre prosjektet. Klikk på navnet til en forfatter i visningen bordet og observere hvordan en ny forekomst av TSPBooksViewController klasse skyves på navigasjons stabelen og vises til brukeren. Har du lagt merke til at vi også får en tilbake-knapp for gratis når du bruker en navigeringskontrollen. Tittelen på tilbake-knappen er hentet fra tittelen på den forrige visningen kontrolleren.
Legge til en Book Cover
Når brukeren taps en boktittel i bøkene vise kontrolleren, Søknaden skal vise bokomslaget. Vi vil ikke bruke en tabellvisning kontroller for dette. I stedet bruker vi en vanlig vanilje UIViewController underklasse og vise bokomslag i en forekomst av UIImageView klassen. Den UIImageView klassen er en UIView underklasse bygget for å vise bilder.
Opprett en ny underklasse av UIViewController-ikke UITableViewController-og navn det TSPBookCoverViewController.
Vi må legge til to eiendommer til den nye visningen kontrolleren header fil. Den første eiendommen er av typen UIImage, en referanse til bokomslag som skal vises i bildevisningen. Den andre eiendommen er en referanse til bildet oppfatning at vi skal bruke for å vise bokomslaget. Den IBOutlet nøkkelord indikerer at vi vil gjøre tilkoblingen i dreieboken. La oss gjøre det nå
#import < UIKit /UIKit.h >interface TSPBookCoverViewController. UIViewController @ eiendom UIImage * bookCover;property IBOutlet UIImageView * bookCoverView;end
Åpne dreieboken, dra en UIViewController eksempel fra Object Library
, og sette sin klasse til TSPBookCoverViewController
i Identity Inspector
.
Dra et UIImageView eksempel fra Object Library
, gjør det dekke hele visningen av visningen kontrolleren, og koble den med bookCoverView utløpet av utsikten kontrolleren.
Før vi gjennomføre visningen kontrolleren, opprette en trykk naturlig overgang
mellom bøkene vise kontrolleren og bokomslaget view controller, sette sin identifikator til BookCoverViewController
.
Vi kunne overstyre setter metoden i _bookCover eksempel variabel, men å vise deg en alternativ tilnærming, setter vi bildevisningen image eiendom i visningen kontrollerens viewDidLoad metode som vist nedenfor. Vi sjekker først om bookCover Eiendommen ligger-ikke nil-og deretter sette bookCoverView image eiendom til verdien som er lagret i bookCover eiendom
- (void) viewDidLoad {[super viewDidLoad].; if (self.bookCover) {[self.bookCoverView setImage: self.bookCover]; }}
Lukke Loop
Alt som gjenstår for oss å gjøre, er å vise bokomslaget når brukeren springen er en boktittel i bøkene vise kontrolleren. Det betyr å implementere tabellvisningen delegat metode Tableview: didSelectRowAtIndexPath: i TSPBooksViewController klassen. Ikke glem å først importere tekstfilen av TSPBookCoverViewController klassen ved å legge en import uttalelse øverst TSPBooksViewController.m.
#import "TSPBookCoverViewController.h"
Som vi gjorde i de forfatterne vise kontrolleren, vi trenger for å lage en privat eiendom for å lagre bildet av bokomslaget
interface TSPBooksViewController ()property NSArray * bøker;property UIImage * bookCover;end
Gjennomføringen av Tableview. didSelectRowAtIndexPath: i TSPBooksViewController.m
bør se kjent. Vi hente boken brukeren har valgt og lage en UIImage forekomst ved hjelp av imageNamed: class metode og passerer navnet på bildet. Bildet er lagret i bookCover eiendom
- (void) Tableview: (UITableView *) Tableview didSelectRowAtIndexPath: (NSIndexPath *) indexPath {[Tableview deselectRowAtIndexPath: indexPath animerte: YES].; //Fetch Book Cover NSDictionary * bok = [self.books objectAtIndex: [indexPath ro]]; self.bookCover = [UIImage imageNamed: [bok objectForKey: @ "Cover"]]; //Utfør Segue [selv performSegueWithIdentifier: @ "BookCoverViewController" avsender: selv];}
Vi utfør deretter naturlig overgang med identifikator BookCoveViewController og konfigurere bokomslaget view controller i prepareForSegue: avsender :. Anmeldelser - (void) prepareForSegue : (UIStoryboardSegue *) segue avsender: (id) avsender {if ([segue.destinationViewController isKindOfClass: [TSPBookCoverViewController klasse]]) {//Konfigurer Book Cover View Controller [(TSPBookCoverViewController *) segue.destinationViewController setBookCover: self.bookCover]; //Tilbake Book Cover [selv setBookCover: null]; }}
UIImage klassen arver direkte fra en av de Foundation rot klasser, NSObject. Den UIImage klassen er mer enn en beholder for lagring av bildedata. UIImage er en kraftig UIKit komponent for å lage bilder fra ulike kilder, inkludert rå bildedata. Klassen definerer også metoder for å tegne bilder med ulike alternativer, for eksempel blandingsmodi og tetthetsverdier.
Hvor kommer det pop?
Tidligere i denne artikkelen, forklarte jeg