[Powered by Google Translate] [Seminar] [iOS: Skrive Apps Like a Boss] [Tommy MacWilliam] [Harvard University] [Dette er CS50.] [CS50.TV] Greit, alle sammen, velkommen til iOS: Skrive Apps som en Boss. Dette seminaret skal fokusere på å skrive apps for iPhone og i sin tur skriftlig apps for iPad, og så vi i utgangspunktet kommer til å gå gjennom et par forskjellige eksempler på hvordan å lage en app, et enkelt spill som Tic Tac Toe, eller hvis du er mer interessert i å gjøre en app som en slags nyhetsleser eller noe som kommuniserer med Internett jeg vil snakke om det også. Her er våre kort agenda. IOS apps er skrevet på et språk som kalles Objective-C, og så dette er litt lik C, men egentlig ikke i det hele tatt, så vi skal snakke litt om selve språket og deretter hvordan å bygge iPhone-apps som bruker dette programmet program kalt XCode, som Hvis du ikke har lastet ned det ennå gjerne starte nedlasting nå. Det er flere gigabyte. Det bør være gratis på App Store, så du må ha en Mac ideell kjører den nyeste versjonen av OS X. Hvis du ikke, ikke noe problem. Vi har maskiner i vitensenteret tilgjengelig for bruk med XCode installert, og så gjerne bruke dem for utvikling. Hvis du ønsker å lage en app, men ikke har en Mac, ikke bekymre deg. Det er nok av campus ressurser til det. Og så så vi kommer til å dekke to større eksempler på ulike apps du kan gjøre. Objective-C er teknisk det som kalles en super sett C. Det betyr at enhver C-kode er også gyldig Objective-C-kode. Det betyr at vi på en måte duct tapet på noen ekstra funksjoner til C. Noen av disse funksjonene inkluderer ikke å måtte noensinne skrive malloc igjen, takk Gud, ingen måtte bekymre deg om de dumme pekere og frigjøre dem og alt det der du hatet om C, og det er slags gått i Objective-C. Nå har Objective-C også en mye større standard bibliotek, så det er mye mer funksjonalitet du får gratis innsiden av Objective-C. Husker du da vi skulle skrive PHP vi merke til at vi gikk fra Dette minste språket til den gigantiske bibliotek med alle disse sprø tingene du kan gjøre. Det samme skjer i iOS. Det er objekter for ting som den buddhistiske kalenderen, og virkelig noe du kan tenke trolig eksisterer allerede i Objective-C implementering. Målet del av Objective-C er refererer noe kalt objektorientert programmering. Dette er slags et nytt konsept, men vi har faktisk det meste lært mange av disse begrepene allerede. Ideen bak objektorientert programmering er at du kommer til å strukturere mye av koden din rundt disse tingene kalles klasser, og disse klassene er virkelig glorified structs. Innsiden av en struct vi i utgangspunktet sa her er en ting, og denne tingen kan ha medlemmer. For eksempel, kan en node i en lenket liste har andre ting som en verdi, en peker til den neste node i listen, og sammen at pekeren og at verdien består dette en forekomst av en struct. Klassene er svært like, bortsett klasser kan også ha funksjoner innsiden av dem. Når vi erklært en struct, kan vi bare si int n eller node * neste. Nå med Objective-C kan vi faktisk sette funksjoner innsiden av disse tingene. En annen ting som klasser kan gjøre er at de kan arve data fra andre klasser. For eksempel vil vi se på en haug med innebygd Objective-C klasser. En av dem kan være den klassen som representerer visningen for en skjerm, og så å si vil jeg gjennomføre min egen visning vi i utgangspunktet si noen over på Apple, sannsynligvis veldig hyggelige mennesker, skrev denne klassen for meg, og den håndterer ting som å vise knapper eller rendering skjermen, og vi ville være veldig pinlig å gjennomføre all den funksjonaliteten selv, og så ved å arve data kan vi si alt som du gjorde i den klassen Jeg ønsker også innsiden av klassen min, og da kommer jeg til å gjøre noen andre ting, nemlig gjennomføre et program. Det er hva det ordet arv betyr. Vi får se en mer konkret eksempel. Og til slutt, er nøkkelen med objektorientert programmering som det fører til data innkapsling. I noen av vårt problem setter vi kunne ha disse store, globale variabler og globals overalt, og det er hvordan vi ville holde styr på staten. Med klasser kan vi begynne innkapsle informasjon innsiden av et objekt. Hvis vi har en skjerm på app vår, vi egentlig ikke trenger å ha noen data fra annen skjerm i våre app innsiden av det, og så ved å innkapsle ting i klasser fører dette faktisk til mye bedre kode design, og dette er mulig med noen av de ytterligere funksjoner av Objective-C. Forvarsel, er syntaksen for Objective-C bananer. Det er ingenting vi har sett før, så det er litt av en læringskurve å bli vant til hva pokker betyr dette? Men når du kommer forbi det første læringskurve det er virkelig, virkelig glatt å begynne å skrive apps. Å erklære en klasse, for å si her er min klasse, det eksisterer, og kanskje her er noen ting som jeg kommer til å definere senere, Jeg kommer til å si @ grensesnitt. Jeg kommer til å si @ grensesnitt. Jeg kommer til å gi min klasse et navn. Og senere et annet sted jeg kommer til å si @ slutten, og alt i mellom @ grensesnittet og @ end kommer til å være min klasse. Det kommer til å bli hva som er på innsiden av våre. H-filer. Akkurat som i C våre. H-filer i utgangspunktet sagt her er noen ting som vil eksistere. Jeg er ikke nødvendigvis å fortelle deg hva de gjør ennå, men kompilatoren trenger å vite at de eksisterer. Senere inne i vår. M filer-fordi m for Objective-C er der vi faktisk kommer til å definere hva disse klassene gjør. Mye som våre. C-filer, forutsatt at vi en implementering for funksjoner. Innsiden av våre. M-fil skal vi si her er hva alle funksjonene innsiden av min klasse-hva de alle gjør. Og til slutt, på innsiden av en struct kan vi si innsiden av disse klammeparentes int n eller node * neste, og i Objective-C skal vi bruke søkeordet @ eiendom, og dette er hva som kommer til å definere egenskapene, eller de ikke-funksjoner som er en del av mine klasser. Ringe funksjoner i Objective-C er også bananer. Når vi erklært funksjoner i C vi sa noe sånt som int foo og åpne paren og ga det en liste over argumenter. Dette er hva erklære metoder eller funksjoner ser ut i Objective-C. Hvis jeg ønsker å erklære en funksjon eller en metode hvor jeg sier metoden er egentlig bare en funksjon som er medlem av en klasse, så slags utskiftbare, men egentlig ikke, så innsiden av min metode jeg vil opprette en ny metode. Det kommer til å returnere ingenting, så det kommer til å være av typen ugyldig. Dette er avkastningen type funksjon min. Nå har vi parentesar her fordi-Jeg vet ikke. Neste kommer til å være navnet på funksjonen min, og så til slutt har vi et semikolon akkurat som vi hadde i C. Hva er nytt her er denne fyren her. Dette bindestrek er faktisk nødvendig, og hva dette sier er at denne metoden her må kalles på en forekomst av en klasse. Etter at vi erklært våre structs vi sikkert sagt noe sånt struct node n, og som faktisk opprettet eller startes en av disse structs slik at jeg kunne faktisk begynne å jobbe med hva som er på innsiden av det, så dette dash betyr at vi må instantiate klassen akkurat som vi startes at struct før vi kan kalle denne metoden på det. Hvis jeg ønsker å begynne å legge argumenter til mine metoder det blir enda flere bananer. Her er min metode navn. Så jeg kommer til å ha et kolon, og etter denne kolon sier det her kommer noen argumenter. Denne metoden tar ett argument. Den type argumentasjon sin er en int, og navnet på det argumentet eller variabel som jeg kommer til å begynne å bruke innsiden av metoden kalles jeg. Igjen, dette er metoden. Det tar ett argument. Hvis du ønsker å begynne å legge flere argumenter får flere bananer i at vi har denne kolon som sier her kommer min liste over argumenter. Dette første argumentet er et heltall. Nå, dette er andre argumentet interessant. Variabelen som jeg kommer til å bruke innsiden av funksjon min kalles f, så innsiden av funksjon min kunne jeg si f + = 1 eller noe. Denne saken her er i utgangspunktet en nøkkel for det argumentet eller parameter. Akkurat som vi hadde viktige verdi-par og noe som JSON eller assosiative matriser Objective-C gjort beslutningen om å si, ok, bare slik at det er veldig klart når du kaller en metode hva alle disse parametrene er Jeg er faktisk kommer til å nevne dem alle. Når du kaller en metode, vil du faktisk si andFloat, og da vil du passere det i. Interessant, er dette en ikke navngitt, men alle de andre parametrene er, så hvis vi hadde en tredje argument jeg kunne si andFloat og en annen flottør og så videre. Når jeg kaller disse metodene er det selvfølgelig bananer, så hvis jeg har et objekt, og jeg definert en metode som kalles foo, og jeg vil kalle det, i stedet for å si Foo åpne / lukke parentesar Jeg kommer til å åpne en brakett. Her er navnet på min metode. Jeg kommer til å lukke braketten, og dette er objektet jeg ringer det på. Husk, alle disse metodene eksisterer innenfor klasser fordi klasser kan ha metoder definert på innsiden av dem. Her har jeg vilkårlig opprettet et objekt av noen klasse, og dette er syntaksen for å gjøre det. Det er 2 trinn for å lage et objekt. Det første trinnet er å si at jeg ønsker å tildele plass. Dette tilsvarer en malloc. Vi trenger ikke å si malloc lenger. Vi droppet m, gjorde det Alloc, og erstattet. C med. M.. Etter at vi Alloc noe da vi trenger å initialisere den. I utgangspunktet når du oppretter objektene du kanskje ønsker å ha noen logikk som utføres når de er opprettet, slik at du kan passere i noen standardverdier eller noe sånt, og så dette init metoden er hva som faktisk skaper objektet. Vi først tildele plass, akkurat som vi gjorde i C, og da vi initialisere den, noe som kan eller ikke kan gjøre en hel masse. Så vi er tilbake denne tingen til et objekt o. Det er en stjerne her fordi dette er teknisk sett en peker, men ikke bekymre deg, pekere er ikke så stor en avtale i Objective-C lenger. Nå har vi instansiert denne klassen heter NSObject, og dette er bare en tilfeldig klasse som Apple har. Vi har instansiert dette, og nå har jeg en forekomst av denne klassen i dette objektet o, så det betyr at hvis jeg definerte disse metodene jeg kan kalle dem som dette. Tilsvarende, hvis jeg ønsket å kalle en metode med ett argument, så dette er baren metoden, som tar ett argument, og her er baz: qux metoden, så dette tar 2 argumenter. Dette kaller en funksjon på dette objektet o. Fornuftig? Syntaksen bør være fornuftig, men du slags blir vant til det. Ok, la oss snakke om noen ting som er innebygd i Objective-C som ikke ble nødvendigvis bygget inn C. I C slags vi måtte håndtere strenger som disse dumme karakter matriser, og det fikk virkelig irriterende. Objective-C har de alle bygd i for oss, og det er bygget i bruker denne klassen heter NSString. Når jeg ønsker å lage en NSString vi har mer uforståelige syntaks. Snarere enn å si "CS50" vi sier @ "CS50" og dette er bare syntaksen for å erklære strenger i Objective-C. Dette er ekstremt lett å glemme, så ikke gjør det. Nå, når jeg har dette, dette er en streng, men legg merke det er egentlig bare et objekt. Jeg sa NSString, som betyr at jeg instansiert klassen kalt NSString, som noen andre skrev for meg, og de var veldig fint om det, og så nå Jeg kan begynne å ringe metoder på den. Hvis jeg kaller metoden lengden på dette objektet s det kommer til å gå tilbake til meg lengden på strengen. Dette er akkurat som strlen i C. Dette ville tilbake 4. Tilsvarende er en annen metode jeg kanskje vil bry seg om dette characterAtIndex. Dette er en metode som står på denne strengen s Jeg vil at du skal få zeroth karakter, og så dette ville gå tilbake til meg tegnet c, og det er en hel haug flere av disse metodene som du kan google virkelig enkelt. Apples dokumentasjon er stor, og vi vil ta en titt på det i en bit. De er strenger. Vi har også variabel størrelse arrays bygget i. Husk i C når vi erklært en rekke vi hadde å si du har 5 elementer, end of story. Da vi kom til JavaScript og PHP vi kunne starte å gjøre ting som å legge elementer eller flytte elementer. Vi kan gjøre det samme i Objective-C. Snarere enn å lage en matrise på vanlig C måte Vi har igjen en annen klasse som kalles NSMutableArray. Det er også NSArray, og dette kommer til å utgangspunktet kapsle noen array. Dette sier det første jeg vil gjøre er at jeg ønsker å allokere plass for en ny rekke, og etter at jeg fordele det Jeg så behovet for å initialisere den. Igjen, bare å ringe disse to metodene. Nå betyr dette at innsiden av dette objektet en Jeg har en tom matrise sitter der. Hvis jeg ønsker å legge noe til denne tabellen, kan jeg ringe addObject metoden. Jeg vil legge til et objekt til array en, og jeg ønsker å legge strengen CS50. Hvis jeg ønsket å omvendt fjerne at jeg kan si at jeg ønsker å fjerne objektet på det første sted på tabellen eller objektet en. Fornuftig? Ok, du slags bli vant til dette hakeparentes ting. Forresten, innsiden av en rekke av Apples biblioteker vil du se denne NS. NS står faktisk for neste steg, som var en av Steve Jobs første selskapene, og det er der han virkelig begynte å skrive mye av koden som en slags basis for Mac OS X og alle andre ting, og så dette NS er slags denne fine arven rope ut til en av de tidligere selskapene tilbake når Apple ble først starter. Det er overalt. La oss ta en titt på en mer helhetlig Objective-C eksempel. Her er jeg inne i XCode. For å komme hit, jeg først lastet ned XCode fra App Store, åpnet den opp, og da jeg gikk opp hit til fil, over her til nye, og deretter prosjektet. Etter at jeg gjør at jeg har alle disse alternativer for hva jeg ønsker å lage, og så skal vi ta en titt på disse valgene senere, men bare for dette eksemplet, fordi vi ikke faktisk kommer til å ha en app ennå, Jeg kom ned hit, og jeg sa Command Line Tool, og dette er en app som jeg kunne kjøre på kommandolinjen akkurat som vi har kjørt fra C. Det er hvordan jeg laget dette prosjektet, og så nå er jeg her, så la oss først se på denne filen, og dette bør se ganske kjent. Jeg har en int navn. Det er min venn argc, min andre kompis argv. Og så kan vi se at dette er utgangspunktet for min første Objective-C-programmet. Her kan vi se bort fra dette for nå. Dette er i utgangspunktet noen minnehåndtering ting som du ikke vil virkelig noensinne har å bekymre seg for. La oss se på dette første blokk her. Denne første linje, hvis jeg sier Student * alice = [[Student lloc] init] hva er det du gjør? Denne første student her, dette er trolig en klasse. Dette er ikke en klasse som Apple skrev, men det er en klasse som jeg skrev. Det første jeg vil gjøre er at jeg ønsker å tildele plass for en ny student, og da vil jeg initialisere den, så dette gir meg tilbake denne nye student objekt, og jeg lagrer dette i en variabel kalt Alice. Hvor kom den klassen kommer fra? Vel, her på venstre side disse er alle de forskjellige filer inne i prosjektet mitt. Vi ser her har jeg en Student.h og Student.m. Den. H fil, husk, er hvor jeg erklærer alle de tingene som vil eksistere i klassen. La oss ta en titt på det. Greit, her har vi denne @ grensesnittet, og dette sier at her kommer uttalelser fra alt som vil eksistere innenfor klassen min. Så jeg har et kolon. Da har jeg denne NSObject ting. Dette kolon betyr at arv bit vi diskuterte litt tidligere. Dette sier alt en NSObject kan gjøre hvor NSObject er denne klassen skrevet av noen andre, alt dette NSObject kan gjøre jeg ønsker å være i stand til å gjøre det. Ved å si: NSObject det betyr at jeg i utgangspunktet arvet alle funksjonene av en annen klasse. Som virkelig ga meg en hel haug med forskjellige metoder og egenskaper som jeg kan bruke. Her nede Jeg oppretter to eiendommer. Det betyr at min student, hvis dette var en struct, vil disse være de 2 tingene innsiden av struct mitt, så hver elev har et navn som er en streng, og en student har også en klasse, som er en int. Til slutt, her nede skal jeg lage en metode for student min. Jeg ringte min metode, initWithName, og det tar ett argument, og at argumentet er en streng, og jeg kalte det navnet. La oss nå se på hvordan vi faktisk implementert denne klassen. Her, nå er jeg inne i min. M-fil, m for gjennomføring, antar jeg. Jeg har min gjennomføring, min ende, og her er der jeg faktisk definerer hva initWithName gjør. Jeg har initWithName, navnet på parameteren min, og da dette er hvor jeg faktisk lage en student, og så dette er litt kryptisk, men dette er slags standardtekst som du ønsker å inkludere i konstruktører. Denne initialisering funksjon her, initWithName, er en type konstruktør. Du i utgangspunktet bygge en ny student objekt og kanskje sende noen data inne i den. Det første jeg vil gjøre er at jeg ønsker å kalle init på denne super ting. Husk at når jeg sa tilbake hit i. H fil at alt en NSObject har en student har også. Det betyr at når jeg oppretter en elev hva jeg også trenger å gjøre er sørge for at NSObject at jeg arve alle disse dataene fra er også riktig initialisert. Det jeg trenger å si er dette super faktisk kommer til å referere til den overordnede klassen at jeg arve fra, så jeg ønsker å sørge for at jeg initialisere alt som jeg avhengig før jeg begynner å prøve å bruke den. Så hvis det initialisert korrekt dette er akkurat som å si at hvis malloc kom ikke tilbake null så jeg kan begynne å sette noen egenskaper. I JavaScript og PHP hadde vi dette søkeordet kalte dette, og dette referert til nåværende forekomst av en klasse. I Objective-C kaller vi dette selv. Når jeg sier self.name, betyr det at objektet Jeg opprettet nettopp da jeg sa student Alloc init, som kommer til å gi meg tilbake en gjenstand. Det betyr at jeg ønsker å sette navnet på det objektet til hva jeg nettopp passert i. Akkurat som i C, får vi tilgang til medlemmer med dette punkt, så self.name sier navnet på studenten objektet Nå kommer til å være det du nettopp passert i. Og så til slutt, kan jeg returnere det så jeg faktisk får noe tilbake. Spørsmål? Ok, så dette selv = super init, hvis du ikke helt forstår arv ting ikke bekymre deg. Bare vet at hvis du noen gang ønsker å lage din egen init metoden bare gjøre det, og du vil være godt å gå. Ja. >> [Student] Hva gjør hvis selvtillit bety? Dette betyr at når vi malloc noe vi alltid sjekket om det var lik null, og hvis det var null, så vi avsluttet. Dette er det samme, fordi hvis dette returnerer null, så vi sannsynligvis kommer til å SEG feil hvis vi begynner å prøve å manipulere det. Det er vår student klassen. Det betyr at vi kan starte våre studenter i en av to måter. Hvis jeg sier student Alloc init jeg ikke bruker denne metoden som jeg nettopp skrev, og i stedet jeg kan bare si alice.name, og nå skal jeg sette den egenskapen navn. Tilsvarende, hvis jeg ønsker å bruke det initWithName metoden Jeg kan bare si Alloc, og da heller enn å si init Jeg kommer til å kalle det metode som jeg nettopp opprettet, og jeg kommer til å passere i Bob. På dette punktet, har dette objektet Bob en navn lik Bob. Ok, her nede jeg bruker som NSMutableArray som vi så på tidligere. Jeg tildeling space.Then jeg initialisere en ny rekke. Jeg kommer til å legge to ting til det. Denne tabellen har nå student objekter. Legg merke til at ingensteds jeg må si dette er en rekke studenter. Jeg sa at det er en matrise, periode. Da kan jeg plassere hva innsiden av det som jeg vil. Her har jeg to objekter. Endelig har jeg et annet objekt her, dette TF. Over her i TF.h utgangspunktet det samme. Jeg arvet fra NSObject, og forresten, når du oppretter klasser dette er gjort for deg, denne typen grensesnitt standardtekst. Den har en eiendom av studenter. Jeg har et par metoder her som ikke virkelig gjøre en hel masse, og så det betyr når jeg lager denne TF objekt Jeg kan kalle denne metoden karakter på det slik. Eventuelle spørsmål om Objective-C syntaks før vi begynner å flytte inn i noen mer interessant apps utvikling ting? Ok, så la oss faktisk gjør en iPhone-app. Kjernen klasser som du skal bruke innsiden av din iPhone app kalles visning kontrollere, og en visning kontrolleren representerer i utgangspunktet et enkelt skjermbilde innsiden av programmet ditt, så hvis jeg er på musikk app, for eksempel, én visning kontrolleren kunne representere visningen der jeg vise alle sangene på min iPhone. Another view controller kan være når jeg klikker på en sang og begynne å spille det eller som jeg dykke ned i kunstnere. Hver av disse forskjellige skjermer kan være representert som et annet syn kontrolleren, og en visning kontrolleren er egentlig bare en klasse som sier hvordan dette skjermbildet fungerer. Ting inni av en visning kontroller, kommer vi til å ha egenskaper, så ting som en knapp kommer til å være en egenskap av vårt syn kontrolleren. Vi kommer også til å ha metoder, og disse er i utgangspunktet hendelseshåndterere. Denne metoden sier når du trykker på denne knappen Jeg ønsker å gjøre noe, og til slutt, igjen, vi kommer til å bruke denne selv søkeord for å få tilgang til gjeldende forekomsten. Å bygge grensesnitt i iOS er faktisk veldig, veldig enkelt. De har denne fine dra og slipp-grensesnitt kalt Interface Builder, og de to sentrale begreper som wire opp din Objective-C til Interface Builder er IBOutlet og IBAction. En IBOutlet sier ganske enkelt at hvis du deklarerer en eiendom som er en knapp, og du ønsker å koble den opp til noe i den faktiske UI, du kommer til å si at det er en stikkontakt. Tilsvarende, hvis du ønsker å representere en hendelseshåndterer så du kommer til å si at det er en handling. Å faktisk koble opp denne grafisk fremstilling og koden er det veldig, veldig enkelt. Hvis du ønsker å legge ved et IBOutlet, alt du trenger å gjøre deg kontrollere klikk, og vi får se et eksempel på dette virkelig rask. Du styrer klikker der det står View Controller. Du kommer til å dra inn i grensesnittet, eller omvendt, Hvis du ønsker å koble opp en hendelseshåndterer du kommer til å dra fra grensesnittet i den andre retningen. La oss ta en titt på en veldig enkel iOS eksempel. La oss lage et nytt prosjekt. Jeg kommer til å komme opp hit til Application, og jeg kommer til å klikke Enkel visning Application. Jeg kommer til å klikke neste. Jeg vil gi mitt prosjekt et navn. Jeg vil kalle det Hello. Interessant, antar Apple du oppretter et produkt slik at du kan selge det, og de kan tjene penger. Her nede jeg kommer til å si at dette er en iPhone-app. Du kan opprette en iPad app, eller hvis du ønsker å lage en av de apps som støtter begge enhetene du kan gjøre det også. Dette er hva du vil at merkingen skal se ut. Du ønsker å bruke dreiebok, som vi skal se senere, og du definitivt vil bruke automatisk referanse telling, som er en fin funksjon som hindrer deg fra å måtte si malloc og gratis. Med mindre du ønsker å ringe malloc og gratis, ville jeg la dette sjekket. Jeg skal klikke neste, og til slutt, dette kommer til å spørre meg hvor jeg vil lagre det. Jeg vil treffe lage, og her vi går. Jeg opprettet et nytt prosjekt. Over her på venstre er alle filene som er inne i prosjektet mitt, og legge merke til at jeg fikk en hel haug, og jeg hadde ikke selv gjøre noe. IOS er stor. For eksempel, her denne ViewController.h, dette kommer til å representere min første visning kontrolleren, så det første skjermbildet innsiden av app min. Nå vet vi hva dette sier. Vi sier jeg ringer denne klassen ViewController, og en ViewController gjør alt som en UIViewController gjør, og dette, igjen, er noen klasse som Apple skrev som gjør mye av hendig ting for oss liker vise skjermen. Her er der jeg faktisk kan begynne å definere hva mitt syn kontrolleren gjør, og det viser seg at jeg egentlig ikke trenger noe av dette. Dette er standardtekst kode som Apple gir meg gratis. Jeg trengte det første linje, eller jeg har ikke en klasse, slik at vi kan bli kvitt det og bli kvitt dette. Ok, så dette er min tom skjerm. Nå la oss klikke på denne MainStoryboard.storyboard, og det er her det begynner å bli interessant. Dette er første skjermen på app min. Hvis jeg ønsker å legge til en knapp, i HTML måtte jeg lage en knapp tag. I Android må du lage en knapp tag, men i iOS hvis jeg bare komme ned hit til høyre og hvis jeg klikker på denne tredje en her hvor det står objekter, og jeg kan bla nedover, eller jeg kan begynne å lete etter knappen. Og se, en knapp, så hvis jeg faktisk dra og slippe dette rett der, Jeg har nettopp lagt en knapp på denne skjermen på app min. Hvis jeg ønsker å endre teksten, kan jeg dobbelklikke på den, si noe fristende som "Trykk Meg." Ok, nå hvis jeg kjører dette programmet, så vi kompilere den, så å kjøre det jeg trykker på play-knappen øverst til venstre, og det er min app. Jeg har ikke gjort noe, og jeg fikk en søt ser iPhone-app. Hvis jeg ønsker å stoppe det, kan du klikke på stoppknappen fordi det er mer moro. La oss si at jeg faktisk ønsker at noe skal skje når jeg trykker på denne knappen. For å gjøre at det jeg trenger å gjøre er jeg trenger for å lage en ny hendelse fører eller en handling. Det betyr at jeg må lage noen metode som jeg ønsker å bli kalt når jeg trykker på knappen, så la oss lage en ny metode. Jeg er inne i ViewController.h. Jeg må si at en metode eksisterer. Jeg trenger en bindestrek først fordi jeg kommer til å kalle dette på visningen kontrolleren. Jeg må gi dette en type. Typen dette kommer til å være at IBAction ting som vi så tidligere. Dette er en hendelseshåndterer, så det kommer til å returnere en IBAction, og dette er et hint til XCode å si at dette er noe jeg ønsker å koble noe til. Jeg kan gi det et navn, som buttonPressed, semikolon. Nå har jeg erklært en ny metode innsiden av klassen min. Jeg har sagt dette metoden har til å eksistere. Nå la oss komme inn ViewController.m, og la oss si hva denne metoden kan gjøre. Hvis jeg begynner å skrive, for eksempel, (void) buttonPressed varsel XCode er virkelig fin og autocompletes for meg. Det er virkelig flott. Legg merke til her at innsiden av. M-filen kan jeg også si ugyldig, og dette er fordi at IBAction er faktisk ikke en type. Det er faktisk hashtag definert et sted å være et tomrom, og igjen, dette er bare et hint til XCode som sier Jeg vil at dette skal være en hendelseshåndterer, og vi vil se hvorfor på bare et sekund. Når denne knappen trykkes Jeg kommer til å gjøre noe irriterende liker vise en popup. Å gjøre at jeg kan lage en ny forekomst av denne klassen heter UIAlertView, og dette er en klasse som Apple skrev at kommer til å vise irriterende popups. Vi vil kalle dette popup-melding, og jeg har 2 trinn, husk, for å skape dette objektet. Det første jeg må gjøre er å tildele plass. Jeg vil ha en UIAlertView. Jeg ønsker å tildele plass. Det er min første metoden. Mitt neste metode er at jeg ønsker å initialisere den, og så har jeg denne store, lange metode som kalles initWithTitle. Det er i utgangspunktet kommer til å kontrollere hva denne popup sier. Tittelen på popup min kan være hallo. Budskapet i denne popup kan være "Dette er iOS." Delegat ting, jeg vet ikke hva det er. La oss si det er ingenting. Nå knappen som kommer til å dukke opp kan si noe sånt som "Det er sikkert," og jeg egentlig ikke ønsker noen andre knapper, så la oss slette det og lukke braketten. Ok, jeg opprettet en ekstra ett. Det vi går. Dette er hvordan jeg kan lage en ny popup. Hvis jeg ønsker å faktisk vise popup jeg vil kalle showet metoden. For å gjøre det jeg kan si våken og show, og igjen, var autofullfør super fin. Hvis jeg har glemt hva det var, hvis jeg bare skrev i s, Jeg kan bla gjennom her for å finne ut hva det var, og det filtrerer pent. Nå har jeg laget denne nye popup. Vi kommer tilbake til hva representanten betyr senere, og nå vil jeg si at jeg ønsker denne metoden for å bli sparket når jeg trykker på knappen, så jeg kommer til å komme tilbake til storyboard min, og jeg ønsker å nå legge denne IBAction. Det første du ønsker å gjøre er å klikke på knappen. Når jeg trykker på denne knappen jeg vil ha noe å skje. Jeg har ikke tenkt å holde nede kontroll. Jeg kommer til å klikke og dra fra knappen til over her hvor står det View Controller. Vi kan se at det pent lyser opp. Hvis jeg la gå med musen min jeg nå har denne popup over her hvor jeg har noen alternativer. En av disse er hendelser som jeg kan registrere. Dette er alle disse metodene jeg erklært i min h-fil som IBActions. Dette er hvordan XCode vet hva som skal vises i denne lille listen, så det er bare et hint. Hvis jeg klikker på knappen inne, har jeg nå registrert hendelseshåndterer. I JavaScript måtte vi si at jeg har noen kode som er registrert hendelseshåndterer. I Objective-C var det virkelig så enkelt. Hvis jeg kjører dette igjen nå når jeg trykker på knappen min hendelseshåndterer kommer til å skyte, og jeg kommer til å få dette popup. Super, super enkelt der. Hvis du noen gang vil se alle hendelsene som skjer skal registreres på en komponent hvis jeg klikker på denne knappen og jeg kom hit til høyre side først kan du se over her jeg kan gjøre ting som den type knappen, så hvis du ønsker en av de jeg er eller Lagre knappen eller hva. Hvis jeg ønsker å se alle hendelsene som er på denne knappen hvis jeg kommer hele veien hit til høyre side vi kan se her på hendelsene jeg har alle disse forskjellige hendelser. Jeg kan trykke på knappen, når jeg slipper knappen, når jeg dobbelt trykk eller noe, og den jeg bare registrert er denne begivenheten som heter Touch Up Inside, og dette sier at så snart fingeren kommer av knappen at hendelsen kommer til brann, og det er akkurat hva som skjedde. Dette er slags standard-knappen trykkes hendelsen. Eventuelle spørsmål så langt? Ok, det er hvordan vi kan begynne å kable opp ting i koden vår inn i ting inne i grensesnittet vårt. Husk det første vi måtte gjøre var å finne koden, og deretter vi kablet opp grensesnittet til koden, og det er vår første app. Ok, det var kult, og vi skapte denne knappen. Hva hvis vi ikke ønsker å ha til å lage en haug av eiendommer representerer disse knappene? For eksempel, i Tic Tac Toe har jeg 9 knapper, og det ville være super, super irriterende å måtte dra og slippe 9 ganger eller om jeg måtte gjøre Tic Tac Toe med 81 i stedet for 9 og jeg måtte dra og slippe 81 ganger, og det er halt. Hva vi kan gjøre i stedet er mye som en HTML når vi hadde ting som IDer og navn, og vi kan søke etter ting av ID sin, det er en lignende forestilling i iOS kalt tags. En kode er rett og slett en unik numerisk identifikator for en komponent. Hvis jeg sier dette har en tagg på 0, for eksempel, hvis jeg oppretter en knapp og gi det en kode på 0, og vi får se hvordan du gjør det i løpet av et sekund, hvis jeg ønsker å få denne knappen kan jeg bare si at jeg ønsker å ringe den viewWithTag metoden på objektet over her, den self.view, som representerer den aktuelle skjermen, for eksempel. Hvis jeg kaller det viewWithTag metoden, kommer jeg til å trekke tilbake knappen med tag 0. La oss ta en titt på denne ved å bygge Tic Tac Toe. Først, dette er min storyboard. Jeg har opprettet disse 10 UI knappene. Legg merke til de er alle i samme størrelse. Hvis jeg klikker på en av disse, og jeg kommer tilbake hit på denne høyre side vil du se jeg justert skriften her, så jeg gjorde skriften litt større, men det jeg også gjorde var jeg satt denne koden. Jeg sa at dette har en kode på 1, og det er øverst til venstre. Nå, hvis jeg klikker på en annen knapp, som denne andre en her, Nå vil du se at min tag er to. Hver av disse knappene har bare en unik kode, og så dette er senere hvordan jeg skal begynne å samhandle med app min. Dette er alle inne i en View Controller, men her er hva vi har. Vi har 3 egenskaper her. Den første og siste kommer til å representere staten mitt bord. I utgangspunktet er dette første er en rekke representerer hvor Xs og Os er. Denne andre forteller oss her hvem sin tur det er. Du vil merke at jeg også har disse tingene her. Før når vi erklært egenskapene vi ga dem et navn og en type. Vi kan også gi dem litt ekstra informasjon her. Denne første seier nonatomic, og hva dette sier er i utgangspunktet bare en ting noen gang vil være å prøve å få tilgang til denne variabelen gangen. Du kan gjøre mer komplekse applikasjoner som er multi-threaded, og så tilbake i Scratch hadde vi forskjellige tråder, og ulike sprites kan gjøre forskjellige ting samtidig. Hvis det ikke er tilfelle, som det ikke er i noe som vi vil se på, hvis vi sier nonatomic det faktisk kommer til å gjøre ting litt raskere. Vi har også dette som kalles tildele, sterk eller svak. Dette tilordne bare sier at dette er en standard type. Dette er ikke et objekt eller en peker fordi dette er bare en bool, så bool er bygd inn Objective-C. Dette sier ikke prøv å gjøre noe fancy med pekere her. Det er en vanlig gammel skalering. Sterke og svake, sier dette svake som faktisk Jeg vil at dette skal peke på noe i visningen kontrolleren. Jeg har ikke tenkt å faktisk tildele eller init dette selv. Interface Builder, når jeg kjører programmet, kommer til å håndtere alt som initialisering. Hvis jeg sier svak, sier at noen andre kommer til å være å skape dette. Hvis jeg sier sterk, sier dette at jeg kommer til å være den det er å skape dette forumet objekt, og så her jeg har noen flere metoder her, for eksempel, en handling for når det nye spillet trykkes, en handling for når noen av de andre knappene trykkes, og et cetera. Vi vil ikke komme inn for mye av logikken i Tic Tac Toe, selv om det er veldig spennende, men la oss ta en titt på noen av de tingene som vi kan gjøre innsiden av iOS. Dette nye spillet metoden kommer til å bli sparket når jeg trykker det nye spillet knappen. Å koble det opp jeg bare komme over til storyboard min. Jeg klikket på nytt spill. Hvis jeg kommer over her til høyre jeg kan se at Touch Up Innsiden er kablet til newGame metoden. Det er derfor dette kommer til å få sparken. Den newGame metoden kommer til å gjøre noen satt opp. Det kommer til å si at jeg vil at du skal fjerne staten styret. Dette er en fin metode på foranderlig arrays. Dette kommer til å si at det er nå X tur, og nå skal jeg dra nytte av denne viewWithTag ting. Jeg vet at mine knappene har kodene 1-9, og det er noe jeg vilkårlig plukket. Hvis jeg ønsker å sette teksten i hver knapp for å være tom fordi jeg nettopp startet et nytt spill, og jeg vil ikke ha noe Xs eller Os å være igjen jeg kan gjøre dette. Jeg kan si jeg vil at visningen med tag, 1, 2, 3, 4 et cetera. Dette vil trekke en annen knapp hver gang. Her skal jeg kaste det for UIButton. Akkurat som vi kunne kaste ints til flyter og vice versa dette sier at jeg ønsker å kaste dette til en UIButton. Det betyr den type av dette vil være en UIButton * på grunn av pekere, men ikke bekymre deg, de er ikke skremmende lenger. Når jeg har på denne knappen jeg skal kalle en metode på den. Denne metoden kalles setTitle forState, og så dette sier Jeg ønsker å sette teksten i knappen for å være en tom streng, og jeg vil at det skal være en tom streng når det ikke er trykket på. Hvis jeg bruker denne metoden, kan jeg endre teksten på knappen så snart noen treffer det, men vi ønsker å si når knappen bare sitte der Jeg vil at teksten skal være tom. Til slutt, vi kommer til å starte mitt bord, og jeg kommer til å si at alt er for tiden på 0, så dette styremedlemmene uforanderlige er en foranderlig array, som betyr at jeg kan ringe addObject metoden og bare en 0 innsiden av den. Det er hva som skjer når jeg oppretter et nytt spill. La oss ta en titt på en annen. Denne metoden her er IBAction som kommer til å bli presset hver gang en av disse rutene er trykket. Nå har vi noen Tic Tac Toe logikk her. Vi finne ut hvem sin tur det er, og basert på at vi enten sette en X eller en O, men vi merker at vi er gjenbruk den samme hendelseshåndterer for hver eneste en av disse knappene. Det betyr at jeg ikke har en fremgangsmåte for den øverste venstre knapp, en annen metode for nederste høyre knapp, selv om jeg kunne ha gjort det. Det ville egentlig ikke være god design. Hva jeg gjør her er jeg faktisk kommer til å avgjøre hva koden for knappen som ble trykket er. Du legger merke til at dette stykket metoden tar ett argument. Det kalles avsender, og hva avsenderen er er avsender skal representerer nøyaktig hva som ble tatt handling på. Hvis jeg trykker på en knapp, dette avsender skal være at UIButton at jeg faktisk trykket, betyr at det at UIButton har en tag fordi jeg laget en tag. Hvis jeg ønsker å få på koden jeg kan bare si Jeg vil koden av avsenderen, og igjen, jeg har nettopp begynt den til en UIButton. Jeg tilfeldigvis vite at avsenderen vil være en UIButton. Det trenger ikke alltid å være en UIButton. Jeg kunne for eksempel registrerer det samme hendelseshåndterer  for en for en knapp, en for en glidebryter. I dette tilfellet vet jeg de er alle knapper, så jeg kommer til å si Jeg vil at dette skal være en knapp, og så kan jeg få koden, og fra tag nå vet jeg hvor jeg er inne i styret. Da kan jeg bare sette enten X eller O, kan vende turn, sjekke hvem som har vunnet, et cetera. Eventuelle spørsmål om dette så langt? Ok, all koden vi lagt ut på nettet, vi ønsker ikke å komme inn i for mye av Tic Tac Toe logikk, men nå kan du se at virkelig alt vi gjør er at vi looping over denne matrisen, så vi har et par for looper her, og vi bare sammenligne å se har vi en kamp i alle radene, en kamp i en kolonne eller noe sånt. Å faktisk kjøre dette programmet, hvis jeg trykker på en av disse knappene som spiller metoden ble avfyrt, så det betyr at jeg bare satt på knappen for å være en X, så nå denne knappen vil være en O, og så videre, og så det er hvordan vi begynner å samhandle med denne enkelt side app. Vi vil legge ut koden, så gjerne lese det, men la oss nå snakke om noen apps som er mer enn bare én side. Like spennende som Tic Tac Toe var, mye av apps innsiden av iOS er slag av disse drill ned ting med flere skjermer. Det første konseptet som vi må snakke om er protokoller, og en protokoll er bare et sett av metoder at du kan love å definere. Om jeg lager denne nye protokollen med to metoder, denne første, dersom avkastningen typen er ugyldig, jeg kalte det foo. Det tar ingen argumenter. Jeg har en annen metode. Den returnerer en int. Jeg kalte det bar, og det tar ett argument. Alt dette protokollen er at kalles SomeProtocol opp her, Dette er et sett av ting som noen kan implementere. Jeg har ikke på innsiden av denne protokollen sa hva Foo gjør. I stedet, jeg bare sier at du kan definere foo hvis du vil. Hvis jeg oppretter en visning kontroller eller opprette en klasse Jeg kan innsiden av den klassen lover å implementere noen av disse metodene, slik at for eksempel hvis si Dette sier nå jeg gjør et løfte til deg som inne for dette synet kontrolleren klassen vil jeg ha definisjoner for både foo og bar. Hvorfor er det nyttig? Mange komponenter inne i iOS dra nytte av dette design mønster kalt delegasjon, og hva delegasjon sier er at, for eksempel, hvis jeg har en tekstboks og det er noen hendelser som kan være registrert på innsiden av min tekstboksen, snarere enn å skape separate hendelser hva jeg kan gjøre er at jeg kan si representanten for denne tekstboksen vil være noen gjenstand. Når jeg sier at dette er en representant nå det betyr at når noen hendelse ville ha blitt sparket i tekstboksen heller enn å måtte registrere det eller noe sånt det er bare kommer til å kalle en metode på representanten. For eksempel, på innsiden av min tekst boksen har jeg en metode for når jeg trykker det gjort knappen nederst til høyre, og så heller enn å registrere hendelseshåndterer hva jeg kan si er tekstboksen, her et objekt som jeg vil at du skal kalle en metode på Hver gang noen trykker på knappen Ferdig, og det betyr at det objektet må gjennomføre noen protokoll som sier at jeg lover å definere det gjort knapp handling, fordi hvis det ikke definerer som metode, og du trykker på Utført, så det kommer til å være forvirrende. La oss ta en titt på et eksempel. Her har jeg rett og slett har en tekstboks, og en av egenskapene til denne tekstboksen over her på denne høyre side er representanten. Dette er en egenskap av klassen. Det jeg gjorde her er jeg kontrollere klikket, og jeg dro fra dette stedet over her til visningen kontrolleren, og som sier nå representanten for denne tekstboksen kommer til å være visningen kontrolleren. Det betyr at når noen handlinger skje, stedet for å registrere separate hendingsaktivatorar jeg vil at du skal sende dem til representanten. La oss nå ta en titt på mitt syn kontrolleren. Innsiden av. H-filen har jeg laget et løfte. Jeg har lovet å iverksette noen metoder innsiden av denne protokollen kalt UITextFieldDelegate, og igjen, Dette er bare noen liste over noen ting som jeg kan velge å implementere. Hvis jeg kommer her i min. M-fil, har jeg gjennomført en slik metode. Jeg har kalt det textFieldShouldReturn fordi det er hva det ble kalt inn i protokollen. Og nå når jeg trykker på knappen ferdig innsiden av dette tekstfeltet Dette er hva som kommer til å bli kalt, så jeg ikke registrere en hendelseshåndterer. Jeg koblet representanten, og når denne hendelsen er sparket Dette er den metoden som vil bli kalt, så hvis jeg kommer over her til dreieboken min og kjøre it- Mens det er lasting vi kan se hva dette betyr. På skjermen min har jeg to ting. Jeg har dette tekstfeltet, og jeg har denne etiketten. Jeg sier bare jeg vil at teksten på denne etiketten å være lik hva brukeren skrev i innsiden av tekstfeltet. Denne neste linje her er rett og slett en metode som jeg ringer i tekstfeltet som sier jeg vil at du skal skjule tastaturet. Dette er bare vilkårlig metode som Apple valgte. Igjen, før jeg gjorde noe jeg måtte koble alt opp, så jeg først kom hit. Fra visningen kontrolleren drar jeg over til tekstboksen. Jeg la gå, og jeg kan se her at jeg kan gjøre dette tekstfeltet eiendom siden over her i visningen kontrolleren har jeg definert en eiendom som er en IBOutlet av et tekstfelt. Dette sier at jeg kan koble denne egenskapen opp til et tekstfelt i UI min. Nå når jeg klikker på denne jeg kan begynne å skrive. Nå hvis jeg trykker på knappen ferdig dette kommer til å skyte en hendelse som jeg kan nå svare på. Ingen hendelsesbehandlinger. Det er slik jeg nettopp svart på det gjort knapp. Fornuftig? Dette er ikke et design mønster som-du kanskje ikke skulle finne deg selv lage din egen protokoll, men bare vet at noen forskjellige iOS komponenter registrere hendelser på ulike måter. Knapper, for eksempel, bruker du dem IBActions. Tekstfelt, på den annen side, kommer til å bruke delegater. Vi kan se og du kan se alt dette opp innsiden av dokumentasjon. Forresten, det er faktisk massevis av UI ting innebygd i iOS for deg, så for eksempel, slik jeg har gjort som sier gjøres nederst til høyre er jeg valgte dette tekstfeltet. Jeg kom hit. Jeg rullet ned litt for å gå tilbake-tasten, og jeg kan faktisk gjøre dette til en hel haug med ting, som om jeg ønsker at dette skal si nødanrop stedet jeg kan gjøre det, noe som er helt tilfeldig, og jeg vet ikke hvorfor det er en innebygd nødnummer knappen, men det står det nødnummer i veldig små bokstaver. Der du går. Definitivt utforske alle disse ulike alternativene i iOS. Eventuelle spørsmål om delegater? Igjen, bare en interessant design mønster som du bør være klar over. Ok, la oss neste ta en titt på tabellen visninger. En tabell visning er utgangspunktet at listen over elementer som er over alt i iOS. Når du blar gjennom alle kontaktene dine, du ser på innstillingen siden, og den slags liste over ting kalles en tabellvisning. Implementere en tabell visning i iOS er ganske enkel. Stedet for å lage en klasse som stammer fra det UIViewController som vi har gjort før vi bare trenger å si heller enn alt en UIViewController gjør jeg ønsker å gjøre, Jeg sier alt en UITableViewController gjør jeg ønsker å gjøre, slik at bare legger noen ekstra ting som er helt gjort for oss. Vi må gjøre svært lite i utgangspunktet fylle ut feltene inne i tabellen. For å vise en tabell jeg trenger å svare på noen spørsmål. Det første spørsmålet jeg må svare på er hvor mange deler er i tabellen? Når du blar gjennom kontaktlisten app du vil merke at det er slags organisert av As, så har du Bs, og du har det lille sub header. Hver av dem kalles en inndeling. Du kanskje eller kanskje ikke trenger disse. Det første du trenger å gjøre er å implementere en metode heter Tableview: numberOfSectionsInTableView. Som returnerer bare hvor mange deler du har, så dette kunne si returnere en hvis du har en stor tabell visning. Det neste spørsmålet som iOS trenger å vite er hvor mange rader har du? For eksempel, du blar gjennom en tabellvisning. Du har et fast antall sanger du ser på eller et fast antall kontakter. Hvis du er meg, selvfølgelig, ikke så mange, og så det er hvordan iOS vet hvor mange celler som skal vises. Igjen, dette kan si noe sånt retur 3. Min tabellvisning har 3 rader. Til slutt må iOS å vite hva hver celle ser ut, så hva det faktisk kommer til å gjøre er å ringe denne metoden her nede, dette Tableview: cellForRowAtIndexPath. Det kommer til å kalle denne metoden på hver enkelt celle inne i tabellen. Hvordan vet det hvor mange ganger å kalle det? Vel, du fortalte det inne i antall rader i seksjonen. Vi kommer til å kalle dette på hver av våre celler, og innsiden av dette er der du faktisk kan gjøre ting som angi tekst eller fortelle deg hva den lille blå knappen på høyre side gjør. Mønsteret for å få disse cellene, vi kommer til å bruke denne metoden kalt dequeueReusableCellWithIdentifier. Objective-C er faktisk veldig godt kjent for latterlig lengden på sine metodenavn, og dette er virkelig en fin sak eksempel. Hva denne metoden gjør er dette sier jeg bare vil at du skal gi meg en celle. Bare en iOS ting. Hvis du har noe som 100.000 sanger på iPod hva iOS ønsker ikke å gjøre er bevilge 100.000 celler, fordi hvis du er på toppen av listen, trenger du virkelig trenger å allokere minne for cellen som er 99 000 rader nedover? Nei, fordi som du ruller du kan slags tildele etterhvert. Dette er gjort for deg. Du trenger ikke å bekymre deg for alt som dumme ytelse ting. Alt du sier er at du kaller denne metoden dequeueReusableCellWithIdentifier, og dette sier, ok, hvis du trenger å jeg kommer til å lage en ny celle for deg. Men hvis du er på bunnen av tabellen, og du allerede har tildelt noen celler på toppen av tabellen som du virkelig ikke kommer til å trenge når som helst snart Jeg kommer til å gi deg en av de som er igjen i stedet for å fordele en ny, og så dette er en fin ytelse bekymring. Du trenger ikke å tildele cellene selv. Det kommer til å gi deg tilbake en celle. Det kommer til å gå tilbake til deg en celle objekt. Når du har cellen objektet du kan gjøre ting til det. Du kan stille teksten i cellen med denne egenskapen kalles tekstetikett. Du kan legge til at pilen på høyre eller noen andre tilfeldige ting med denne andre egenskap kalt accessoryType, og så videre og så videre. La oss ta en titt på faktisk gjennomføre en tabellvisning nå. Da jeg opprettet dette prosjektet stedet for å si én visning program jeg faktisk kom over her til master-detail program, og så i utgangspunktet dette tilsvarer mail app på iPad med bordet syn på venstre og deretter innholdet på høyre. På iPod eller iPhone dette kommer til å tilsvare en enkelt tabell visning. Det er der jeg fikk min starter koden. La oss først ta en titt på storyboard. Alt dette ble gjort for meg, i utgangspunktet opprettet. Navigasjonsfeltet viste meg hva et eksempel celle kunne se ut, og jeg kan dobbeltklikke dette ved å endre tittelen. Eventuelle andre UI bekymringer jeg kan håndtere det. Topptekstfilen ser veldig enkel. Snarere enn å si dette er UIViewController vi nå si dette er en TableViewController, så vi vet at vi ønsker å kalle alle disse tabellen metoder. Neste jeg ønsker å lage en eiendom som kommer til å representere de tingene innsiden av mitt bord. Denne tabellen skal vilkårlig vise en liste av frukt, og så må jeg lage noen matrise hvor kan jeg sette frukt. Innsiden av min gjennomføringen fil det første ønsker jeg å gjøre er at jeg ønsker å sørge for at jeg initialisere denne tabellen. Jeg sa Alloc init, skapte min frukt array, og jeg legger 4 ting til den, hvorav den ene er mye mer kontroversielle enn de andre 3. Og nå har jeg en rekke størrelse 4. Vi rister det opp i CS50. Jeg har nå en rekke størrelse 4. Nå skal jeg begynne å svare på disse spørsmålene, og faktisk, da jeg laget dette programmet alt dette var allerede gjort for meg. Jeg trengte ikke å skrive ut antall seksjoner i tabellvisning. Det var allerede der, og jeg fyller ut feltene. Hvor mange deler har jeg? One. Alle gjort. Hvor mange rader har jeg? Vel, jeg har en rad for hver frukt, så dette teller er en eiendom av noen utvalg som sier hvor stor er den? Det er hvor mange rader jeg har. Til slutt må jeg si hvordan ser hver celle ut? Jeg kommer til å si dequeueReusableCellWithIdentifier. Igjen, dette var allerede skrevet for meg. Jeg trengte ikke å gjøre dette selv, og jeg ønsker å komme tilbake denne cellen på dette stedet. Husk at vi kaller dette samme metode på hver enkelt celle, og dette argumentet her, denne indexPath argument, sier hva rad jeg er i. Hvis jeg sier indexPath.row ned her dette vil være 0, så vil det være 1, så vil det være to, og dette er så jeg vet hva cellen jeg i øyeblikket. Jeg ønsker å sette teksten i cellen ved hjelp av denne textLabel eiendom å gå inn min frukt array og få objektet tilsvarer hver rad. Hvis dette er en streng, er jeg nå setter teksten eiendom til en streng. Jeg kan gjøre en annen ting. Jeg kan også registrere en hendelseshåndterer på hver av cellene, så når jeg klikker på hver av disse cellene Dette didSelectRowAtIndexPath, dette kommer til å bli kalt for meg, så bare ved å definere dette kan jeg nå håndtere hva som skjer når du trykker på en celle, og igjen, vi passerer der cellen ble tappet slik at vi kan gjenbruke den samme hendelseshåndterer for alle våre celler. Igjen, dette er noe iOS gjør for meg. La oss vise en annen irriterende popup som sier ganske enkelt at du plukket noe der som noe kommer til å være raden objektet. Når jeg kjører denne, kommer jeg til å ha denne hyggelig bord visning med en rad for hver av disse frukter, og hvis trykk jeg en det forteller meg hva som skjedde. Fornuftig? La oss bygge en litt mer komplisert av en app, så mye som å klikke deg plukket tomat er. The nice del om storyboards er det ikke bare kommer til å hjelpe oss å utforme skjermer individuelt, det er også kommer til å hjelpe oss binde sammen hele app, så den endelige app vi vil være å bygge dette er hyggelig sports nyhetsleser, og så det kommer til å ha flere skjermer, og så jeg kan faktisk representere hver av disse flere skjermer på storyboard, og jeg kan zoome ut og se min app fra et høyt nivå. For å skape et nytt element innsiden av storyboard min det er veldig enkelt innsiden av Interface Builder. Hvis jeg ønsker å legge til et annet skjermbilde til dette, for eksempel, Jeg kan zoome ut med klype zoom som Apple elsker så mye, og ned her før jeg søker etter en knapp og jeg dra og slippe en knapp hvis jeg ønsker å lage en ny skjerm jeg kan faktisk bare dra og slippe en hel visning kontroller, så hvis jeg plukke dette, trekk den over her, hei, det er en annen skjerm, og så nå bruker den samme storyboard fil Jeg kan ha alle skjermene inne i app min, og jeg kan zoome ut og se hvordan de samhandler. Disse vil ikke samhandle ennå. Måten disse to skjermene samhandle er du definere relasjoner. Du kan i utgangspunktet si dette skjermbildet når du trykker på denne knappen, Jeg vil at du skal gli over til denne nye skjermen. Det betyr at det er denne type forhold mellom  den første skjermen og den andre skjermen. Du vil ha i utgangspunktet en pil fra den knappen til den andre skjermen sier at når du trykker på denne knappen som er der jeg ønsker å gå. Akkurat som vi styrer klikket og dro for å definere disse utsalgssteder vi kommer til å gjøre det samme for å definere disse segues. Vi får se et eksempel på det, og før vi faktisk overgangen fra en skjerm til en annen iOS er hyggelig nok til å kalle denne metoden kalt prepareForSegue, og det er her vi kan starte sende data fra en applikasjon til en annen. I eksempelet er vi i ferd med å se på det vil i utgangspunktet tillate oss å filtrere baseball team av ligaer og divisjoner. Når jeg velger en liga, for eksempel, jeg ønsker å overgang til min neste skjermbilde hvor jeg kan vise alle divisjoner i at league eller alle de forskjellige lagene. Jeg trenger å sende til at skjermen hva lagene du skal vise. Å gjøre at jeg kommer til å dra nytte av denne metoden her. Til slutt, bare en tilfeldig punkt på iOS. Hvis du ønsker å lagre data er det dette som kalles grunndata, som er faktisk slags komplisert å jobbe med. Du kan også bruke SQL til å lagre data, som igjen er fin, men slags på mer komplisert side å jobbe med, men iOS støtter også disse virkelig kule ting som kalles eiendom lister, og en eiendom listen er bare en fil som representerer viktige verdi-par. Du definerer en liste over nøkler, og du sier denne tasten kommer til å være en matrise. Denne tasten er tenkt å være en streng, og i utgangspunktet alt du kan gjøre i JSON kan du gjøre inne på en eiendom liste, og så dette virkelig pent tillater oss å jobbe med noen data. For eksempel har jeg denne Teams.plist som jeg har laget. Jeg har opprettet en ny plist fil, og jeg kan bore ned. Dette er en ordliste, er dette en ordbok, disse er strenger, og så dette er en fin grafisk fremstilling av et JSON-dokument eller bare et sett med viktige verdipar, og så dette er data som jeg skal jobbe med innsiden av app min. La oss først kom hit. Vi har mange flere filer nå. Men la oss først kom hit til dreieboken. Dreieboken her-hvis jeg kan zoome ut- Vi kan nå se at dette er flyten av programmet mitt. Jeg første kommer til å starte på denne skjermen. Jeg kommer til å bore ned til denne skjermen, og jeg kommer til å bore ned til denne skjermen, og vi ser her at hvis jeg slags flytte en av disse rundt vi har disse pilene går herfra til her, og måten jeg definerer som pilen var hvis jeg zoome inn litt, og hvis jeg kommer over til denne visningen kontrolleren, og her er en celle, og jeg vil si at når du trykker på en celle Jeg vil at du skal gli over til en annen skjerm. Jeg kan bare holde nede kontroll, bla over en liten bit, hold nede kontroll, drar denne cellen over og la gå. Og over her sier vi hva som er overgangen du vil bruke? Vil du bruke dette lysbildet ting som heter push? Ønsker du å skyve opp fra bunnen? Det kalles modal. Og når jeg klikker på en av disse, kommer det til å trekke denne pilen for meg, og det betyr at jeg faktisk har håndtert hva som skjer når jeg trykker på denne knappen grafisk. Jeg skrev ikke noen kode å faktisk skyve fra en skjerm til den neste. Jeg definerte dette visuelt innsiden av Interface Builder. Hvis jeg klikker på denne pilen, kan vi se at jeg ga denne tingen et navn. Jeg kalte det showDivisions, og dette er slik at jeg kan vite hva overgangen er i ferd med å skje, og vi vil se hvorfor på bare et sekund. Det er slik jeg har kablet opp de forskjellige skjermene i app min. Hvis dette var en knapp, for eksempel, i stedet for en tabell visning, Jeg kunne kontrollere klikk på knappen, dra over til neste skjermbilde, og det er hvordan jeg kan gjøre navigasjon på den måten. Veldig raskt, hvis vi kommer inn i MasterViewController, igjen, vi bare kommer til å definere en liste over ting som vises i tabellen visning. Her jeg sier jeg vil at du skal ta det plist fil, og jeg vil at du skal laste det opp i en ordbok, og når du har den aktuelle ordlisten, jeg kommer til å svare de samme spørsmålene igjen. Her er antall seksjoner. En, er det en rad for hver liga, og teksten i hver celle bør være enten den første, den første forening, den andre serien, og så videre. Til slutt, jeg kommer til å bruke denne metoden som vi nettopp så kalt prepareForSegue, og dette er den metoden som kommer til å bli sparket når jeg klikker på en av disse rader og derfor aktivere at overgang at jeg satt opp med pilene. Dette sier at jeg kan ha flere relasjoner fra en skjerm til en annen. Hvis jeg har to knapper og hver knapp tar deg til en annen skjerm Jeg kommer til å ha to segues, 1 for hver knapp. Men denne prepareForSegue er, igjen, kommer til å bli gjenbrukt for hver av de forskjellige forhold, betyr så at at jeg trenger en måte å identifisere hvis du trykker på den første knappen eller du trykker på den andre knappen. Husker da jeg ga den segue et navn, dette showDivisions, det er hvordan jeg nå vet at dette er segue som ble aktivert. Alt jeg ønsker å gjøre er at jeg ønsker å si Jeg ønsker å finne ut hva jeg bare treffer, og så å få det, kan jeg si at jeg vil at indexPath for den valgte raden, husker indexPath sier bare hvor jeg bare klikket, og da vil jeg si at jeg ønsker å finne ut hvor jeg skal. Dette destinationViewController, det er en egenskap ved segue. Det er skjermen jeg skal, så jeg vet at skjermen jeg skal kalles DivisionsViewController fordi jeg laget den klassen, og så nå hvis jeg sier d.divisions Jeg er nå å sette en eiendom av visningen kontrolleren jeg skal gå til. Dette er hvordan jeg sender data fra en skjerm til en annen skjerm. Bare se på denne DivisionsViewController du kan se her at i. h fil Det er at eiendommen divisjoner, og det er hva jeg i utgangspunktet fyller, så det er hvordan jeg vet at jeg viser divisjonene tilsvarende ligaen som jeg klikket, og igjen, selve tabellen visningen ser ganske mye det samme, bare svare dem 3 enkle spørsmål, samt identifisere hva som skjer når du flytter til neste skjermbilde. Bare et par andre ting her. Du legger merke til på toppen her at heller enn å si # include Jeg er nå å si # importere. Dette er bare en Objective-C tingen. Importen er i utgangspunktet en bedre versjon av inkludere, og for eksempel trenger vi å vite hva denne klassen er, så jeg kan ikke bare si DivisionsViewController. Hvis vi ikke hadde hashtag standardio.c innsiden av vår. C-fil kompilatoren hadde ingen anelse om hva printf var. Tilsvarende, hvis jeg ikke importere DivisionsViewController kompilatoren har virkelig ingen anelse om hva en DivisionsViewController er. Bare sørg for at innsiden av ulike. M filer du sørge for å importere de tilsvarende. h-filer slik at kompilatoren vet hva som skjer. Til slutt, hva Apple slutt ikke viser er noen data ved hjelp av en web visning, og så en web visning er et objekt som du kan bygge inn litt nettleser innsiden av programmet ditt. Alt du trenger å gjøre er å levere en nettadresse i nettleseren, så jeg ønsker å gå til mlb.mlb.com, og dette er hvordan jeg kan få tilgang til hjemmesiden for hvert lag, og så ved å sende inn denne nettadressen web visningen kan vise dette for meg, og jeg kan bla rundt, og simulator er i bruk av den. Nå kom fra plist min. Hvis jeg klikker på denne dette også kom fra plist min, og dette glidende ble håndtert ved å definere disse segues. Jeg klikker på denne og en til, og nå her er min UIWebView, så bare sånn her er nettstedet for URL som jeg nettopp innebygd, og jeg måtte ikke håndtere noe crazy. Dette er hvordan å vise en webside. Ting som dette tilbake-knappen her er også gitt til meg helt gratis fordi jeg har definert disse relasjonene med segues. Eventuelle spørsmål? Ja. [Student] Så når du bruker Alloc, du aldri trenger å fri noe? Akkurat, når du kaller Alloc og init du ikke trenger å frigjøre den. IOS kommer til å håndtere alt dette for deg. Det er flott, og du ikke bryte noen regler. Ja. [Student] Hvis du skulle inkludere flere lag som kunne passe på skjermen, ville det automatisk en bla alternativet, eller er det noe du trenger å legge til? Akkurat, hvis jeg hadde flere lag, for eksempel, ville det automatisk håndtere rullingen for meg, og alle resultatene bekymringer med stort bord håndteres også helt for meg. Andre spørsmål? Alt dette koden kommer til å bli lagt ut. Vi slags glattet over en liten bit av de mer mindre detaljer, men ting som å sette noen egenskaper til web visning er bare ting som du kan få ved å bla Apples dokumentasjon, som er virkelig, virkelig pent lagt ut. De har mye av prøven apps og eksempel bruksområder forskjellige APIer, så definitivt lese dem hvis du kan. Bare noen nyttige linker du kanskje ønsker å ta en titt på. Dette er noen nyttige dokumentasjon guider. Nettadressene er massiv, så de er forkortet. Dette første er hele biblioteket av dokumentasjon. Det er lite søk barer, så hvis du begynner å skrive knapp det vil begynne å gi deg all informasjon om alle de tingene du kan gjøre med en knapp. Jeg har også tatt med Table View Programming Guide. Det håndterer tabellen visninger i mye mer detalj, hvordan å gjøre ting som dynamisk legger celler eller redigere celler eller fjerne dem. Det er massevis av eksempler på apps fra Apple som vil vise deg hvordan du gjør det, og til slutt, er dette siste Human Interface Guidelines, og dette er i utgangspunktet en del diskusjon om UI komponenter, ting som ikke gjør en knapp som er 4 piksler x 4 piksler. Det er en dårlig idé, og andre ting som Apple ønsker at du skal gjøre å oppmuntre til god design. Noen siste spørsmål før vi ende opp? Greit, definitivt gjerne-Vi kommer til å ha spesielle etiketter på Diskuter. Vi vil ha en iOS en, så definitivt gjerne utnytte den. Hvis du ønsker å jobbe med klassekameratene dine på prosjekter eller hjelpe finne ut noen tilfeldige iOS ting gjerne send meg, og definitivt lese all koden online fordi bare i interesse av tid slags vi glattet over mer finere kornet detaljene av ting. Men hvis ikke, så lykke til på iOS-prosjekter, og jeg håper vi har en stor tilstrømning av apps i App Store. [CS50.TV]