[Powered by Google Translate] [Seminar] [iOS: Skrivning Apps Like a Boss]
[Tommy MacWilliam] [Harvard University]
[Dette er CS50.] [CS50.TV]
>> Okay, alle sammen, velkommen til iOS: Skrivning Apps som en Boss.
Dette seminar vil fokusere på at skrive apps til iPhone
og til gengæld skriftligt apps til iPad, og så vi dybest set kommer til at gå igennem
et par forskellige eksempler på, hvordan man laver en app, et simpelt spil som Tic Tac Toe,
eller hvis du er mere interesseret i at gøre en app som en slags nyhedslæser
eller noget, der interagerer med internettet vil jeg tale om, at så godt.
Her er vores korte dagsorden.
>> IOS apps er skrevet i et sprog kaldet Objective-C,
og så dette er en lille smule svarende til C, men ikke virkelig overhovedet,
så vi vil tale lidt om selve sproget
og derefter hvordan man opbygger iPhone apps ved hjælp af denne app program kaldet XCode,
som hvis du ikke har downloadet det endnu er du velkommen til at starte download nu.
Det er flere gigabytes.
Det bør være gratis i App Store, så du bliver nødt til at have en Mac
ideelt kører den nyeste version af OS X.
Hvis du ikke er, ikke noget problem.
Vi har Mac'er i science center til din rådighed
med XCode installeret, og så er du velkommen til at bruge dem til udvikling.
Hvis du ønsker at lave en app, men ikke har en Mac, så fortvivl ikke.
Der er masser af campus ressourcer til det.
Og så så vi kommer til at dække 2 større eksempler på forskellige apps, du kan gøre.
Objective-C er teknisk, hvad der kaldes en super sæt C.
Det betyder, at enhver C-kode gælder også Objective-C kode.
Det betyder, at vi slags rørledning tapede på nogle ekstra funktioner til C.
Nogle af disse funktioner omfatter ikke skulle nogensinde skrive malloc igen, gudskelov,
ingen behøver at bekymre sig om de dumme pointers og frigøre dem og alt det der
du hadede om C, og det er lidt væk i Objective-C.
>> Nu, Objective-C har også en meget større standard bibliotek,
så der er en masse mere funktionalitet, du får gratis inde i Objective-C.
Husk når vi skriver PHP bemærkede vi, at vi gik fra
dette mindste sprog til den gigantiske bibliotek af alle disse skøre ting, du kan gøre.
Det samme sker i iOS.
Der er objekter for ting som den buddhistiske kalender, og virkelig noget
du kan muligvis tænke på sandsynligvis allerede findes i Objective-C gennemførelse.
Formålet del af Objective-C refererer noget
kaldet objektorienteret programmering.
Det er lidt af et nyt begreb, men vi har faktisk for det meste lært
en masse af disse begreber allerede.
Ideen bag objektorienteret programmering er, at du kommer til at strukturere
en masse af din kode omkring disse ting kaldet klasser,
og disse klasser er virkelig glorificeret struct.
Inde i en struct vi dybest set sagt her er der en ting,
og denne ting kan have medlemmer.
For eksempel kan en knude i en forbundet liste har andre ting
som en værdi, en markør til den næste node i listen
og sammen at pointer, og at værdien komponeret denne ene forekomst af en struct.
Klasserne er meget ens bortset
klasser kan også have funktioner inde i dem.
Når vi erklæret en struct, kunne vi kun sige int n eller node * næste.
>> Nu med Objective-C kan vi faktisk lægge funktioner
indersiden af ​​disse ting.
En anden ting, at klasser kan gøre, er at de kan arve data fra andre klasser.
For eksempel, vil vi se på en flok indbygget i Objective-C-klasser.
En af dem kan være den klasse, der repræsenterer visning for en skærm,
og så ved at sige jeg ønsker at implementere min egen opfattelse
vi dybest set sige nogen over på Apple, sandsynligvis virkelig nice mennesker,
skrev denne klasse for mig, og det håndterer ting som visning af knapper
eller gøre skærmen, og vi ville være virkelig forpint
at gennemføre alle denne funktionalitet selv, og så ved blot
arver data vi kan sige alt det, du gjorde i denne klasse
Jeg vil også gerne inde i min klasse, og så jeg har tænkt mig at gøre nogle andre ting,
nemlig gennemføre en app.
Det er, hvad dette ord arv betyder. Vi vil se en mere konkret eksempel.
>> Og endelig, nøglen med objektorienteret programmering, er, at
det fører til data indkapsling.
I nogle af vores problem sætter vi kunne have disse store, globale variable
og globals overalt, og det er, hvordan vi ville holde styr på statens.
Med klasser kan vi begynde at indkapsle information inde i et objekt.
Hvis vi har en skærm på vores app, behøver vi ikke virkelig har brug for at have nogen data fra
anden skærm i vores app inde i denne,
og så ved at indkapsle ting inden klasser dette rent faktisk fører
til langt bedre kode design, og dette er muligt med nogle af de ekstra funktioner
af Objective-C.
Forvarsel, syntaksen for Objective-C er bananer.
Det er ligesom noget vi har set før,
så det er lidt af en indlæringskurve at vænne sig til
hvad dælen betyder det?
Men når du kommer forbi, at den indledende indlæringskurve, det er virkelig, virkelig glat
at begynde at skrive apps.
>> At erklære en klasse, for at sige her er min klasse, den eksisterer,
og måske her er nogle ting, som jeg har tænkt mig at definere senere,
Jeg har tænkt mig at sige @ interface.
Jeg har tænkt mig at sige @ interface. Jeg har tænkt mig at give min klasse et navn.
Og så senere et andet sted jeg har tænkt mig at sige @ ende,
og alt i mellem @ interface og @ ende
vil være min klasse.
Det kommer til at være, hvad der er inde i vores. H-filer.
Ligesom i C vores. H-filer grundlæggende sagde her er nogle ting, der vil eksistere.
Jeg er ikke nødvendigvis fortælle dig, hvad de gør endnu,
men compileren brug for at vide, at de eksisterer.
Senere inde i vores. M. filer-fordi m for Objective-C
er, hvor vi faktisk kommer til at definere, hvad disse klasser gør.
Meget gerne vores. C-filer, forudsat at vi en implementering af funktioner.
Inderside i vores. M. fil vi vil sige her er, hvad alle de funktioner
indersiden af ​​min klasse-hvad de alle gør.
Og endelig, inde i en struct vi kunne sige indersiden af ​​disse krøllede parenteser
int n eller node * næste,
og i Objective-C vi kommer til at bruge søgeordet @ ejendom,
og dette er hvad der kommer til at definere de egenskaber,
eller de ikke-funktioner, der er en del af mine klasser.
>> Opkald funktioner i Objective-C er også bananer.
Når vi erklærede funktioner i C vi sagde noget lignende int Foo
og åben parentes og derefter gav det en liste over argumenter.
Dette er, hvad erklære metoder eller funktioner ser ud i Objective-C.
Hvis jeg ønsker at erklære en funktion eller en metode
hvor jeg siger metode er egentlig bare en funktion, der er et medlem af en klasse,
så slags substituerbare, men ikke rigtig,
så indersiden af ​​min metode jeg ønsker at oprette en ny metode.
Det kommer til at returnere noget, så det kommer til at være af typen ugyldige.
Dette er returtypen min funktion.
Nu har vi parens her fordi, jeg ikke kender.
Næste bliver navnet på min funktion,
og så endelig har vi et semikolon ligesom vi havde i C.
Hvad er nyt her er denne fyr her.
Denne bindestreg er faktisk nødvendigt, og hvad det siger, er, at
denne metode her skal kaldes på en instans af en klasse.
>> Efter at vi erklærede vores struct vi sandsynligvis sagde noget i retning
struct node n, og den faktisk skabte
eller instantieres en af ​​disse struct, så jeg kunne faktisk begynde at arbejde
med, hvad der er inde i det, denne streg så betyder, at vi er nødt til at
instantiere klassen ligesom vi instantieres at struct
før vi kan kalde denne metode på det.
Hvis jeg ønsker at begynde at tilføje argumenter til mine metoder
det bliver endnu flere bananer.
Her er min metode navn.
Så jeg har tænkt mig at få et kolon, og efter denne kolon der står her kommer nogle argumenter.
Denne metode kræver ét argument.
Den type for sin argumentation er en int, og navnet på dette argument
eller den variabel, jeg har tænkt mig at begynde at bruge indersiden af ​​metoden kaldes i.
Igen, dette er metode. Den har et argument.
>> Hvis du ønsker at begynde at tilføje flere argumenter det får flere bananer
i, at vi har denne kolon, der siger her kommer min liste over argumenter.
Denne første argument er et heltal.
Nu dette andet argument er interessant.
Variablen at jeg har tænkt mig at bruge indersiden af ​​min funktion
kaldes f, så indersiden af ​​min funktion jeg kunne sige
f + = 1 eller noget.
Denne ting her er dybest set en nøgle til dette argument eller parameter.
Ligesom vi havde centrale værdipar og noget som JSON eller associative arrays
Objective-C taget beslutningen om at sige, okay, bare så det er virkelig klar
når du kalder en metode, hvad alle disse parametre er
Jeg er faktisk kommer til at nævne dem alle.
Når du ringer til en metode, vil du faktisk sige andFloat,
og så skal du passere det i.
>> Interessant, er dette en ikke navngivet, men alle de andre parametre er,
så hvis vi havde en 3rd argument jeg kunne sige andFloat
og en anden flydende og så videre.
Når jeg kalder disse metoder er det naturligvis bananer,
så hvis jeg har et objekt, og jeg defineret en metode, der hedder foo,
og jeg vil kalde det, i stedet for at sige Foo åben / luk parens
Jeg har tænkt mig at åbne en konsol.
Her er navnet på min metode.
Jeg har tænkt mig at lukke bøjlen, og det er formålet, jeg ringer det på.
Husk, alle disse metoder eksisterer i klasser
fordi klasser kan have metoderne defineret inde i dem.
>> Her har jeg vilkårligt oprettet et objekt af en vis klasse,
og dette er den syntaks for at gøre det.
Der er 2 skridt til at oprette et objekt.
Det første skridt er at sige, at jeg ønsker at afsætte plads.
Dette svarer til en malloc. Vi har ikke sige allokere mere.
Vi droppede m, gjorde det alloc, og erstattet den. C med. M.
Efter vi Alloc noget, vi så nødt til at initialisere det.
Dybest set, når du opretter objekter du måske ønsker at have en vis logik
der udfører når de er oprettet, så du kan passere i nogle standardværdier
eller noget lignende, og så denne init metode er hvad der rent faktisk skaber objektet.
Vi først afsætte plads, ligesom vi gjorde i C,
og så har vi initialisere det, som måske eller måske ikke gøre en hel masse.
Så vi vender tilbage denne ting ind i et objekt o.
Der er en stjerne her, fordi dette er teknisk en pegepind,
men fortvivl ikke, pointers er ikke så stor en aftale i Objective-C længere.
>> Nu har vi instantieret denne klasse kaldet NSObject,
og dette er blot en tilfældig klasse, at Apple har.
Vi har instantieret dette, og nu har jeg en instans af denne klasse
i dette formål o, at det betyder, at hvis jeg definerede
disse metoder jeg kunne kalde dem sådan.
Tilsvarende, hvis jeg ønskede at kalde en metode med ét argument,
så dette er den bar metode, der tager et argument,
og her er det baz: qux metode, så dette tager 2 argumenter.
Dette kalder en funktion på dette objekt o.
Give mening?
Syntaksen skal give mening, men du slags vænne sig til det.
>> Okay, lad os tale om et par ting, der er indbygget i Objective-C
, som ikke nødvendigvis er indbygget i C.
I C vi sådan skulle håndtere strenge som disse dumme tegndatatabeller,
og det fik virkelig irriterende.
Objective-C har de alle bygget i for os, og det er bygget i
ved hjælp af denne klasse kaldet NSString.
Når jeg ønsker at skabe en NSString vi har flere mystiske syntaks.
Snarere end at sige "CS50", siger vi @ "CS50"
og dette er kun syntaksen for at erklære strenge i Objective-C.
Det er ekstremt let at glemme, så gør det ikke.
Nu, når jeg har det, det er en streng, men bemærker
det er egentlig bare et objekt.
Jeg sagde NSString, hvilket betyder, at jeg instantieres klassen
kaldet NSString, som en anden skrev til mig,
og de var meget nice om det, og så nu
Jeg kan begynde at kalde metoder på det.
Hvis jeg kalder metoden længde på dette objekt s
det vil vende tilbage til mig længden af ​​strengen.
Det er ligesom strlen i C.
Dette ville vende tilbage 4.
>> Ligeledes en anden metode jeg måske ønsker at bekymre sig om, er denne characterAtIndex.
Dette er en metode, der siger på denne streng s
Jeg vil have dig til at få den nulte karakter,
og så dette ville vende tilbage til mig karakter c,
og der er en hel masse flere af disse metoder, du kan Google virkelig nemt.
Apples dokumentation er stor, og vi vil tage et kig på det i en smule.
Det er strenge.
Vi har også variabel størrelse arrays bygget i.
Husk i C, når vi erklærede et array
vi havde at sige du har 5 elementer, slutningen af ​​historien.
Da vi fik til JavaScript og PHP vi kunne starte
gøre ting som at tilføje elementer eller flytte elementer.
Vi kan gøre det samme i Objective-C.
Snarere end at skabe et array i den normale C vej
Vi har igen en anden klasse kaldet NSMutableArray.
Der er også NSArray,
og dette vil dybest set indkapsle nogle array.
Det siger det første, jeg vil gøre, er jeg ønsker at tildele
plads til et nyt array, og efter at jeg tildeler det
Jeg skal derefter initialisere det.
Igen, bare kalde disse 2 metoder.
Nu betyder det, at indersiden af ​​dette objekt en
Jeg har en tom række sidder der.
Hvis jeg ønsker at tilføje noget til dette array, kan jeg kalde addObject metode.
Jeg vil tilføje et objekt til arrayet a, og jeg vil tilføje strengen CS50.
Hvis jeg ønskede at omvendt fjerne, at jeg kan sige, at jeg gerne vil
fjern genstanden på det første sted på arrayet eller gøre indsigelse en.
>> Give mening?
Okay, du slags vænne sig til denne firkantet beslag ting.
Af den måde, du inde i en masse af Apples biblioteker vil se denne NS.
NS faktisk står for næste skridt, som var en af ​​Steve Jobs første virksomheder,
og det er her han virkelig begyndte at skrive en masse af koden
som en slags grundlag for Mac OS X og alle de andre ting,
og så denne NS er sådan denne nice arv råbe ud til en af ​​de tidligere selskaber
tilbage, når Apple blev først starter ud.
Det er overalt.
Lad os tage et kig på en mere holistisk Objective-C eksempel.
Her er jeg inde i XCode.
For at komme her, jeg første gang hentede XCode fra App Store,
åbnede det op, og så gik jeg op her til fil,
herover til ny, og derefter projekt.
Efter jeg gøre, at jeg har alle disse muligheder for, hvad jeg ønsker at skabe,
og så vil vi tage et kig på disse muligheder senere,
men kun for dette eksempel, fordi vi ikke er faktisk kommer til at have en app endnu,
Jeg kom herned, og jeg sagde Command Line Tool,
og dette er en app, at jeg kunne løbe på kommandolinjen
ligesom vi har kørt fra C.
Det er, hvordan jeg skabte dette projekt, og så nu er jeg her,
så lad os først se på denne fil, og dette bør se temmelig bekendt.
Jeg har en int navn. Der er min ven argc, min anden kammerat argv.
Og så vi kan se, at det er indgang til min første Objective-C program.
Her kan vi se bort fra dette for nu.
Dette er dybest set noget hukommelse management ting, du vil ikke rigtig
nogensinde nødt til at bekymre sig om.
>> Lad os se på dette første blok her.
Denne første linje, hvis jeg siger Student * alice = [[Student alloc] init] hvad er det gør?
Denne første student her, det er nok en klasse.
Dette er ikke en klasse, som Apple skrev, men det er en klasse, som jeg skrev.
Det første, jeg vil gøre, er jeg ønsker at afsætte plads til en ny elev,
og så vil jeg initialisere det, så det giver mig tilbage
denne nye elev objekt, og jeg gemme dette i en variabel kaldet Alice.
Hvor kom denne klasse komme fra?
Tja, her over på venstre side disse er alle de forskellige filer inde i mit projekt.
Vi kan se her har jeg en Student.h og en Student.m.
Den. H-filen, skal du huske, hvor jeg erklærer alle de ting
der vil eksistere inden for klassen.
>> Lad os tage et kig på det.
Okay, her har vi denne @ interface, og det siger, at her kommer
erklæringerne om alt det, der vil eksistere i min klasse.
Så jeg har et kolon. Så jeg har denne NSObject ting.
Denne kolon betyder, at arv bit vi diskuterede lidt tidligere.
Det siger alt en NSObject kan gøre
hvor NSObject er denne klasse skrevet af en anden,
alt dette NSObject kan gøre Jeg ønsker at være i stand til at gøre det.
Ved at sige: NSObject det betyder, at jeg dybest set
arvet alle funktioner af en anden klasse.
Det gav mig virkelig en hel masse forskellige metoder og egenskaber, som jeg kan bruge.
Hernede Jeg skaber 2 ejendomme.
Det betyder min elev, hvis dette var en struct, ville disse være de 2 ting
inde i min struct, så hver elev har et navn
der er en streng, og en studerende har også en klasse,
som er en int.
>> Endelig hernede jeg har tænkt mig at skabe en metode til min elev.
Jeg ringede til min metode, initWithName, og det tager et argument,
og dette argument er en streng, og jeg kaldte det navn.
Lad os nu se på, hvordan vi rent faktisk gennemføres denne klasse.
Her, nu er jeg inde i mit. M-fil,
m for implementering, tror jeg.
Jeg har min implementering, min ende, og her er hvor jeg er faktisk at definere
hvad initWithName gør.
Jeg har initWithName, navnet på min parameter, og derefter dette
er, hvor jeg er faktisk at skabe en elev,
og så dette er en lille smule kryptisk, men det er lidt af standardteksten
at du ønsker at medtage i dine konstruktører.
Denne initialisering funktion her, initWithName, er en form for constructor.
Du er dybest set at konstruere en ny elev objekt
og måske sende nogle data i den.
Det første, jeg vil gøre, er jeg ønsker at kalde init på denne super ting.
>> Husk, at når jeg sagde tilbage her i. H-filen
at alt en NSObject har en elev også har.
Det betyder, når jeg opretter en elev, hvad jeg også nødt til at gøre, er
sørg for, at NSObject at jeg arver alle disse data fra
er også initialiseret korrekt.
Hvad jeg behøver at sige er dette super rent faktisk kommer til at henvise til den forælder klasse
at jeg arver fra, så jeg vil være sikker på jeg initialisere
alt, hvad jeg afhængig af, før jeg begynder at prøve at bruge det.
Så hvis det initialiseret korrekt dette er ligesom at sige, om malloc
vendte ikke tilbage null så jeg kan begynde at sætte nogle egenskaber.
>> I JavaScript og PHP vi havde dette søgeord kaldes dette,
og det nævnte nuværende instans af en klasse.
I Objective-C kalder vi det selv.
Når jeg siger self.name, der betyder, at objektet
Jeg har lige oprettet, da jeg sagde student alloc init,
der kommer til at give mig tilbage et objekt.
Det betyder, at jeg ønsker at indstille navnet på den pågældende genstand
til, hvad jeg lige passeret i.
Ligesom i C, vi adgang medlemmer med denne prik,
så self.name siger navnet på den studerendes objektet
skal nu være, hvad du lige har passeret i.
Og så til sidst, kan jeg returnere det, så jeg rent faktisk får noget tilbage.
>> Spørgsmål?
Okay, så denne selv = super init,
hvis du ikke helt forstår arven ting du ikke bekymre dig.
Bare vide, at hvis du nogensinde ønsker at lave din egen init metode bare
gøre det, og du vil være god til at gå.
Ja. >> [Student] Hvad gør, hvis self betyde?
Det betyder, at når vi malloc noget, vi altid kontrolleres, hvis det var lig med nul,
og hvis det var nul, så vi afsluttet.
Det er det samme, for hvis dette afkast null, så er vi sandsynligvis vil seg fejl
Hvis vi begynder at prøve at manipulere det.
Det er vores elev klasse.
Det betyder, at vi kan initialisere vores elever på en af ​​to måder.
Hvis jeg siger student alloc init Jeg bruger ikke denne metode, som jeg netop skrev,
og i stedet kan jeg blot sige alice.name,
og nu vil jeg til at indstille denne egenskab navn.
>> Tilsvarende, hvis jeg ønsker at bruge denne initWithName metode
Jeg kan blot sige alloc, og derefter i stedet for at sige init
Jeg har tænkt mig at kalde denne metode, som jeg lige har oprettet, og jeg har tænkt mig at passere i Bob.
På dette tidspunkt har det formål Bob et navn lig med Bob.
Okay, ned her jeg bruger det NSMutableArray at vi kiggede på tidligere.
Jeg fordeling space.Then jeg initialisere et nyt array.
Jeg har tænkt mig at tilføje 2 ting til det.
Dette array har nu studerende objekter.
Bemærk, at intetsteds havde jeg skal sige dette er en vifte af studerende.
Jeg sagde, det er et array, periode.
Så kan jeg sætte uanset inde i det, jeg vil.
Her har jeg 2 objekter.
>> Endelig har jeg et andet objekt her, denne TF.
Herovre i TF.h stort set det samme.
Jeg arver fra NSObject, og af den måde,
når du opretter klasser foregår det hele for dig,
denne form for grænseflade standardtekst.
Det har en egenskab af studerende.
Jeg har et par metoder her, der ikke rigtig gøre en hel masse,
og så det betyder, når jeg har oprettet denne TF objekt
Jeg kan kalde denne metode klasse på det på denne måde.
Eventuelle spørgsmål om Objective-C syntaks, før vi begynder at flytte ind i nogle mere
interessante apps udvikling stuff?
>> Okay, så lad os faktisk gøre en iPhone app.
De centrale klasser, som du skal bruge inde i din iPhone app kaldes view controllere,
og en visning controller dybest set repræsenterer en enkelt skærm
indersiden af ​​din app, hvis så jeg er på den musik app, for eksempel,
én visning controller kunne repræsentere den visning, hvor jeg se alle de sange på min iPhone.
Another view controller kunne være, når jeg klikker på en sang og begynde at spille det
eller som jeg bore ned i kunstnere.
Hver af disse forskellige skærme kan være repræsenteret som en anden opfattelse controller,
og en visning controller er egentlig bare en klasse, der siger, hvordan dette skærmbillede fungerer.
Ting inde af en visning controller, vi vil have egenskaber,
så ting som en knap der vil være en egenskab ved vores opfattelse controller.
>> Vi vil også have metoder, og disse er dybest set hændelseshandlere.
Denne metode siger, når du trykker på denne knap
Jeg ønsker at gøre noget, og endelig, igen,
vi skal bruge denne self søgeord for at få adgang til den aktuelle forekomst.
At opbygge grænseflader i iOS er faktisk virkelig, virkelig nemt.
De har denne nice drag and drop interface kaldet Interface Builder,
og de 2 centrale begreber, wire op din Objective-C til Interface Builder
er IBOutlet og IBAction.
En IBOutlet blot siger, at hvis du erklærer en ejendom, der er en knap,
og du ønsker at tilslutte den til noget i din faktiske UI,
du kommer til at sige, det er en stikkontakt.
Tilsvarende, hvis du ønsker at repræsentere en hændelseshandler
så du kommer til at sige, det er en handling.
>> For rent faktisk at wire op denne grafiske repræsentation
og din kode, det er virkelig, virkelig simpelt.
Hvis du ønsker at vedhæfte en IBOutlet, alt hvad du skal gøre, er at du kontrollerer klik,
og vi vil se et eksempel på dette virkelig hurtig.
Du styrer klik hvor der står View Controller.
Du kommer til at trække ind i grænsefladen, eller omvendt,
hvis du ønsker at tilslutte en hændelseshandler du vil trække fra grænsefladen
i den anden retning.
Lad os tage et kig på en meget simpel iOS eksempel.
>> Lad os oprette et nyt projekt.
Jeg har tænkt mig at komme herop til Anvendelse,
og jeg har tænkt mig at klikke på Enkeltvisning Application.
Jeg har tænkt mig at klikke næste. Jeg vil give mit projekt et navn.
Jeg vil kalde det Hej.
Interessant Apple påtager du opretter et produkt
så du kan sælge det, og de kan tjene penge.
Hernede vil jeg sige, at dette er en iPhone app.
Du kan oprette en iPad app, eller hvis du vil oprette en af ​​disse apps
der understøtter begge enheder, du kan gøre det også.
Disse er, hvad du vil have dine checkmarks at se ud.
>> Du ønsker at bruge storyboards, som vi vil se senere,
og du absolut vil bruge automatisk henvisning optælling,
som er en nice funktion, der forhindrer dig i at skulle sige malloc og gratis.
Medmindre du vil ringe til malloc og fri, ville jeg forlade denne kontrolleret.
Jeg vil klikke næste, og endelig er dette vil spørge mig, hvor jeg vil gemme det.
Jeg slår skabe, og her er vi gå.
Jeg har oprettet et nyt projekt.
Herovre på venstre er alle de filer, der er inde i mit projekt,
og bemærk, at jeg fik en hel masse, og jeg har ikke selv gøre noget.
IOS er stor.
>> For eksempel, her i ViewController.h
dette vil repræsentere min første visning controller,
så det første skærmbillede inde i min app.
Nu ved vi, hvad det siger.
Vi siger jeg ringer denne klasse viewcontroller,
og en viewcontroller gør alt, hvad en UIViewController gør,
og dette igen, er nogle klasse, at Apple skrev, at gør en masse praktisk ting for os
gerne vise skærmen.
Her er der, hvor jeg rent faktisk kan begynde at definere, hvad min opfattelse controller gør,
og det viser sig, at jeg virkelig ikke brug for noget af dette.
Dette er standardtekst kode, som Apple giver mig gratis.
Jeg behøvede at første linje, eller jeg ikke har en klasse,
så vi kan slippe af med det og slippe af med dette.
Okay, så dette er min tomme skærm.
>> Lad os nu klikke på dette MainStoryboard.storyboard,
og det er her det begynder at blive interessant.
Dette er den første skærm på min app.
Hvis jeg ønsker at tilføje en knap, i HTML jeg var nødt til at oprette en knap tag.
I Android du nødt til at oprette en knap tag,
men i iOS, hvis jeg bare komme herned til nederste højre
og hvis jeg klikker på denne 3. en her hvor der står Objects,
og jeg kan rulle ned, eller jeg kan starte søgningen efter knap.
Og se, en knap, så hvis jeg faktisk trække og slippe denne dér,
Jeg har lige tilføjet en knap til dette skærmbillede på min app.
Hvis jeg ønsker at ændre teksten, kan jeg dobbeltklikke på det,
sige noget lokkende lignende "Tryk mig."
Okay, nu, hvis jeg kører denne app, så vi kompilere det,
så at køre det jeg klikker på play-knappen i øverste venstre, og der er min app.
Jeg gjorde ikke noget, og jeg fik en sød leder iPhone app.
Hvis jeg ønsker at stoppe den, kan du klikke på stopknappen
fordi det er sjovere.
>> Lad os sige, at jeg faktisk vil have noget til at ske, når jeg trykker på denne knap.
For at gøre dette, hvad jeg skal gøre, er jeg nødt til at oprette
en ny hændelseshandler eller en handling.
Det betyder, at jeg er nødt til at skabe nogle metode, jeg ønsker at blive kaldt
når jeg trykker på knappen, så lad os skabe en ny metode.
Jeg er inde i ViewController.h.
Jeg er nødt til at sige, at en metode findes.
Jeg skal bruge en bindestreg første fordi jeg har tænkt mig at kalde dette på den opfattelse controller.
Jeg er nødt til at give dette en type.
Typen af ​​dette vil være, at IBAction ting, som vi så tidligere.
Dette er en event handler, så det kommer til at returnere en IBAction,
og dette er en antydning til XCode sige, at
det er noget, jeg ønsker at wire noget til.
Jeg kan give den et navn, ligesom buttonPressed, semikolon.
>> Nu har jeg erklæret en ny metode inde i min klasse.
Jeg har sagt denne metode har at eksistere.
Lad os nu komme i ViewController.m,
og lad os sige, hvad denne metode kan gøre.
Hvis jeg begynder at skrive, for eksempel, buttonPressed (void)
varsel XCode er virkelig rart og autocompletes for mig.
Det er virkelig vidunderlig.
Bemærk her, at indersiden af. M. fil jeg kan også sige ugyldig,
og dette skyldes, at IBAction ikke er faktisk en form.
Det er faktisk hashtag defineret et sted at være et tomrum,
og igen, det er bare en antydning til XCode, der siger
Jeg ønsker, at dette skal være en hændelseshandler, og vi vil se hvorfor i bare et sekund.
Når denne knap trykkes Jeg har tænkt mig at gøre noget irriterende
gerne vise en popup.
>> For at gøre, at jeg kan oprette en ny instans af denne klasse kaldet UIAlertView,
og dette er en klasse, at Apple skrev, at der kommer til at vise irriterende popups.
Vi kalder denne popup advarsel, og jeg har 2 trin, skal du huske, at skabe dette objekt.
Den første ting jeg skal gøre, er afsætte plads.
Jeg vil have en UIAlertView.
Jeg ønsker at afsætte plads. Det er min første metode.
Mit næste metode er jeg ønsker at initialisere den,
og så har jeg denne store, lange metode kaldet initWithTitle.
Det er dybest set kommer til at kontrollere, hvad denne popup siger.
Titlen på min pop kan være goddag.
Budskabet i denne popup kan være "Dette er iOS."
Delegate ting, jeg ved ikke hvad det er.
Lad os sige, det er ikke noget.
Nu den knap, der kommer til at blive vist kan sige noget lignende "Det er godt nok,"
og jeg har ikke rigtig lyst nogen andre knapper, så lad os slette det og lukke beslag.
>> Okay, jeg oprettede en ekstra. Der vi går.
Dette er, hvordan jeg kan oprette en ny popup.
Hvis jeg ønsker at faktisk vise popup jeg vil kalde showet metode.
For at gøre, at jeg kan sige opmærksomme og show,
og igen, autocomplete var super nice.
Hvis jeg har glemt, hvad det var, hvis jeg lige har skrevet i s,
Jeg kan rulle igennem her for at finde ud af, hvad det var,
og det filtrerer pænt.
Nu har jeg oprettet denne nye popup.
Vi vil vende tilbage til det delegerede betyder senere,
og nu vil jeg gerne sige, at jeg ønsker, at denne metode til at blive fyret
når jeg trykker på knappen, så jeg har tænkt mig at vende tilbage til mit storyboard,
og jeg vil gerne nu vedhæfte denne IBAction.
Den første ting du vil gøre, er at klikke på knappen.
Når jeg trykker på denne knap, jeg vil have noget til at ske.
Jeg har ikke tænkt mig at holde kontrol.
Jeg har tænkt mig at klikke og trække fra knappen
til herovre, hvor der står View Controller.
Vi kan se, at det pænt lyser op.
>> Hvis jeg lader gå med min mus jeg har nu denne popup herovre, hvor jeg har nogle valgmuligheder.
En af disse er de begivenheder, jeg kan registrere.
Disse er alle disse metoder, jeg erklærede i min h-fil som IBActions.
Dette er, hvordan XCode ved, hvad der skal vises i denne lille liste,
så det er bare en antydning.
Hvis jeg klikker på trykket på knappen, har jeg nu registreret hændelseshandler.
I JavaScript vi havde at sige jeg har noget kode der registreret hændelseshandler.
I Objective-C var det virkelig så let.
Hvis jeg køre dette igen
nu, når jeg trykker på knappen min hændelseshandler vil fyre,
og jeg har tænkt mig at få denne popup.
Super, super simpelt der.
>> Hvis du nogensinde ønsker at se alle de begivenheder, der sker for at blive registreret
på en komponent, hvis jeg klikker på denne knap
og jeg kommer herover til højre
første kan du se herovre jeg kan gøre ting som typen af ​​knappen,
så hvis du ønsker en af ​​dem, jeg er eller add kontakt knappen
eller hvad.
Hvis jeg ønsker at se alle de begivenheder, der er på denne knap
hvis jeg kommer hele vejen herover til højre
vi kan se her på de begivenheder, jeg har alle disse forskellige begivenheder.
Jeg kan trykke på knappen, når jeg slipper knappen, når jeg trykke to gange eller hvad ved jeg,
og den ene jeg bare registreret, er denne begivenhed kaldet Touch Up Inside,
og det siger, at så snart min finger kommer fra knappen
denne begivenhed vil brand, og det er præcis, hvad der lige er sket.
Det er en slags standard nede begivenhed.
>> Eventuelle spørgsmål indtil videre?
Okay, det er, hvordan vi kan begynde at wire op ting i vores kode
ind i ting inde i vores interface.
Husk det første, vi havde at gøre var at finde koden,
og derefter vi kablet op grænsefladen til koden,
og der er vores første app.
Okay, det var virkelig cool, og vi skabte denne knap.
Hvad hvis vi ikke ønsker at skulle skabe en masse ejendomme
repræsenterer disse knapper?
For eksempel, jeg i Tic Tac Toe har 9 knapper,
og det ville være super, super irriterende at skulle trække og slippe 9 gange
eller hvis jeg havde at gøre Tic Tac Toe med 81 i stedet for 9
og jeg var nødt til at trække og slippe 81 gange, og det er halt.
Det, vi kan gøre i stedet er meget ligesom en HTML
når vi havde ting som ID'er og navne, og vi kan søge efter ting
af deres id, er der en tilsvarende begreb i iOS kaldet tags.
>> Et mærke er ganske enkelt et unikt identifikationsnummer for en komponent.
Hvis jeg siger dette har en tag på 0, for eksempel,
hvis jeg opretter en knap og give det et tag på 0, og vi vil se hvordan man gør det på bare et sekund,
hvis jeg ønsker at få det knap kan jeg bare sige, jeg vil ringe til
den viewWithTag metode på objektet herovre,
den self.view, som repræsenterer det aktuelle skærmbillede, f.eks.
Hvis jeg kalder viewWithTag metode, vil jeg trække tilbage knappen med tag 0.
Lad os tage et kig på dette ved at bygge Tic Tac Toe.
Først, dette er mit storyboard.
Jeg har oprettet disse 10 UI knapper.
Bemærk de er alle samme størrelse.
Hvis jeg klikker på en af ​​disse, og jeg kommer tilbage her over på denne højre side
vil du se, at jeg justeret fonten lige her, så jeg lavede fonten en lille smule større,
men hvad jeg også gjorde, var jeg sat dette tag.
Jeg sagde, at dette har en tag på 1, og det er øverst til venstre.
>> Nu, hvis jeg klikker på en anden knap, som denne anden her,
Nu vil du se, at mit tag er 2.
Hver af disse knapper lige har en unik tag,
og så dette er senere, hvordan jeg har tænkt mig at begynde at interagere
med min app.
Det er alt sammen inde i én visning controller,
men her er hvad vi har.
Vi har 3 ejendomme her.
Den første og sidste kommer til at repræsentere staten mit bord.
Dybest set dette første er et array, der repræsenterer hvor Xs og OS er.
Denne anden her fortæller os, hvis tur det er.
Du vil bemærke, at jeg også har disse ting her.
Før da vi erklærede egenskaber vi gav dem et navn og en type.
Vi kan også give dem nogle supplerende oplysninger her.
Denne første siger nonatomic, og hvad det siger
er dybest set kun én ting vil nogensinde være at forsøge at få adgang til denne variabel ad gangen.
Du kan gøre mere komplekse applikationer, der er multi-threaded,
og så tilbage i Scratch havde vi forskellige tråde,
og forskellige sprites kunne gøre forskellige ting på samme tid.
>> Hvis det ikke er tilfældet, som det ikke i noget, som vi vil se på,
hvis vi siger nonatomic det er faktisk kommer til at gøre tingene en lille smule hurtigere.
Vi har også denne ting kaldet tildele, stærk eller svag.
Dette tildele bare siger, at det er en standard type.
Dette er ikke et objekt eller en pegepind, fordi dette er blot en bool,
så bool er indbygget i Objective-C.
Det siger du ikke forsøge at gøre noget fancy med pointere her.
Det er en almindelig gammel scaler.
Stærk og svag, denne svage siger, at der faktisk
Jeg ønsker, at dette skal pege på noget i udsigt controller.
Jeg har ikke tænkt mig at faktisk tildele eller init dette selv.
Interfacet builder, når jeg kører app, vil håndtere alt det initialiseringen.
Hvis jeg siger svag, der siger en anden vil være at skabe denne.
Hvis jeg siger stærk, det siger, at jeg har tænkt mig at være den ene
der er at skabe dette board objekt,
og så her jeg har nogle flere metoder her,
for eksempel, med påstand om, når det nye spil trykkes
en sag om, når nogen af ​​de andre der trykkes på knapperne,
og et cetera.
>> Vi vil ikke komme ind i for meget af logikken i Tic Tac Toe,
selvom det er meget spændende, men lad os tage et kig på
nogle af de ting, vi kan gøre inde i iOS.
Dette nye spil metode vil blive affyret
hver gang jeg trykker på nye spil-knappen.
At tilslutte det op jeg simpelthen komme over til min storyboard.
Jeg klikkede på nyt spil.
Hvis jeg kommer herover til højre jeg kan se, at
Touch Up Inside er sluttet til den newGame metode.
Det er derfor, det vil blive fyret.
Den newGame Metoden kommer til at gøre nogle sæt op.
Det kommer til at sige, at jeg vil have dig til at slette tilstand af brættet.
Dette er en nice metode på bevægelige arrays.
Dette vil sige, det er nu X tur,
og nu vil jeg til at drage fordel af denne viewWithTag ting.
>> Jeg ved, at mine knapper har de tags 1-9,
og det er noget jeg tilfældigt plukket.
Hvis jeg ønsker at indstille teksten til hver knap til at være tom
fordi jeg lige startet et nyt spil, og jeg vil ikke have nogen
Xs eller O'er at blive tilovers jeg kan gøre dette.
Jeg kan sige, jeg vil have det synspunkt, med tag, 1, 2, 3, 4 et cetera.
Dette vil trække en anden knap hver gang.
Her vil jeg har tænkt mig at kaste det til UIButton.
Ligesom vi kunne kaste int'er til flåd og omvendt
dette siger, at jeg ønsker at kaste dette til en UIButton.
Det betyder typen af ​​dette vil være en UIButton *
på grund af pegepinde, men bare rolig, de er ikke skræmmende længere.
>> Når jeg har denne knap, jeg har tænkt mig at kalde en metode på det.
Denne metode kaldes setTitle forState, og så det siger
Jeg ønsker at indstille teksten til knappen for at være den tomme streng,
og jeg ønsker det skal være den tomme streng, når den ikke holdes nede.
Hvis jeg bruger denne metode, kan jeg ændre teksten på knappen
så snart en person rammer det, men vi ønsker at sige, når knappen bare sidder der
Jeg ønsker, at teksten skal være tom.
Endelig vil vi initialisere mit bord,
og jeg har tænkt mig at sige, at alt er i øjeblikket på 0,
så denne bestyrelsesmedlemmer uforanderlige er en foranderlig array,
hvilket betyder, at jeg kan ringe til addObject metode og bare en 0 inde i den.
Det er, hvad der sker, når jeg opretter et nyt spil.
>> Lad os tage et kig på en anden.
Denne metode her er det IBAction der kommer til at blive presset
hver gang en af ​​disse felter er trykket.
Nu har vi nogle Tic Tac Toe logik her.
Vi regne ud, hvis tur det er,
og baseret på, at vi enten indstille en X eller en O,
men vi bemærker, at vi genbruge den samme hændelseshandler
for hver enkelt af disse knapper.
Det betyder, at jeg ikke har en fremgangsmåde til den øverste venstre knap,
en anden metode til knappen nederst til højre, selv om jeg kunne have gjort.
Det ville egentlig ikke være godt design.
Hvad jeg laver her, er jeg faktisk kommer til at bestemme
hvad tag af den knap, der blev trykket er.
Du bemærker, at denne leg metode tager ét argument.
Det hedder afsender, og hvad afsenderen er er afsender vil
repræsentere præcis hvad der blev truffet foranstaltninger på.
Hvis jeg trykker på en knap, er denne afsender vil være at UIButton
at jeg faktisk presset, så det betyder, at UIButton
har et tag, fordi jeg skabte et tag.
>> Hvis jeg ønsker at komme på tag jeg kan blot sige
Jeg vil have mærket på afsenderen,
og igen, jeg har lige støbt det til en UIButton.
Jeg ved, at afsenderen vil være en UIButton.
Det behøver ikke altid at være en UIButton.
Jeg kunne for eksempel registrere den samme hændelseshandler
for en for en knap, en for en skyder.
I dette tilfælde ved jeg, de er alle knapper, så jeg har tænkt mig at sige
Jeg ønsker, at dette at være en knap, og så jeg kan få tag,
og fra tag jeg nu, hvor jeg er inde i bestyrelsen.
Så kan jeg blot indstille enten X eller O, kan vende igen,
kontrollere, hvem har vundet, et cetera.
>> Eventuelle spørgsmål om dette indtil videre?
Okay, al den kode, vi lagt online-vi ønsker ikke at komme ind i for meget
af Tic Tac Toe logik, men nu kan du se, der virkelig
alt, hvad vi gør, er vi looping over denne array,
så vi har et par efter sløjfer her, og vi er bare sammenligne til at se
har vi en kamp i alle rækker, en kamp i en kolonne eller sådan noget.
For rent faktisk at køre denne app, hvis jeg klikker på en af ​​disse knapper
at spille metode blev fyret, så det betyder, at jeg netop har indstillet
på knappen for at være et X, så nu denne knap vil være en O, og så videre,
og så det er, hvordan vi er begyndt at interagere med denne enkelt side app.
>> Vi vil sende koden, så er du velkommen til at granske det,
men lad os nu tale om nogle apps, der er mere end bare én side.
Så spændende som Tic Tac Toe var, en masse apps inde i iOS
er slags af disse drill down ting med flere skærme.
Det første koncept, som vi bliver nødt til at snakke om er protokoller,
og en protokol er blot et sæt metoder
at du kan love at definere.
Hvis jeg opretter denne nye protokol med 2 metoder, denne første,
hvis afkastet type er ugyldig, jeg kaldte det foo.
Det tager ingen argumenter. Jeg har en anden metode.
Den returnerer en int. Jeg kaldte det bar, og det har et argument.
Alt denne protokol er, at kaldes SomeProtocol heroppe,
Dette er et sæt af ting at nogen kan gennemføre.
Jeg har ikke inde i denne protokol sagt, hvad Foo gør.
I stedet, jeg siger bare, du kunne definere Foo, hvis du vil.
Hvis jeg opretter en visning controller eller oprette en klasse
Jeg kan indersiden af ​​denne klasse løfte om at gennemføre
nogle af disse metoder, så for eksempel, hvis sige
dette nu siger, at jeg gør et løfte til dig, at inde
af dette synspunkt controller klasse jeg vil have definitioner for både foo og bar.
>> Hvorfor er det nyttigt?
En masse af komponenter inde i iOS drage fordel af dette
design mønster kaldet delegation, og hvad delegation siger
er, at for eksempel, hvis jeg har en tekstboks
og der er nogle begivenheder, der kunne registreres inde i min tekst boks,
snarere end at skabe separate hændelser hvad jeg kan gøre, er jeg kan sige
den delegerede af denne tekstboks vil være nogle objekt.
Når jeg siger, at dette er en delegeret nu, betyder, at
hver gang en begivenhed ville være blevet fyret i tekstboksen
snarere end at skulle registrere det eller noget lignende
det er bare at kalde en metode på den delegerede.
For eksempel, på min tekstboks inde har jeg en metode til når jeg trykker
det gjort knappen i nederste højre,
og så i stedet for at registrere hændelseshandler hvad jeg kan sige er
tekstboks, her er et objekt, som jeg vil have dig til at kalde en metode på
hver gang nogen trykker på knappen Udført,
og det betyder, at det pågældende objekt har at gennemføre nogle protokol
der siger jeg lover at definere det gjort knap handling,
fordi hvis det ikke definerer denne metode, og du trykker på Udført,
så det kommer til at være forvirrende.
>> Lad os tage et kig på et eksempel.
Her har jeg simpelthen har en tekstboks,
og en af ​​egenskaberne for denne tekstboks herovre på denne højre side er stedfortræderen.
Dette er en egenskab af klassen.
Hvad jeg gjorde her er jeg styre klikkede, og jeg trak fra denne plet herovre
til visningen controller, og det siger nu delegeret fra denne tekstboks
bliver visningen controller.
Det betyder, at når visse foranstaltninger ske i stedet for at registrere
separate hændelseshandlere jeg ønsker, at du sende dem til den delegerede.
Lad os nu tage et kig på min opfattelse controller.
Inde i. H. fil jeg har lavet et løfte.
Jeg har lovet at gennemføre nogle metoder inde i denne protokol
kaldet UITextFieldDelegate, og igen,
Dette er blot nogle liste over nogle ting, som jeg kan vælge at gennemføre.
>> Hvis jeg kommer her i min. M-fil, har jeg implementeret en sådan metode.
Jeg har kaldt det textFieldShouldReturn
fordi det er hvad det blev kaldt inde i protokollen.
Og nu når jeg trykker på knappen Udført indersiden af ​​denne tekstfelt
dette er, hvad der kommer til at blive kaldt, så jeg ikke registrere en event handler.
Jeg har tilsluttet delegerede, og når denne begivenhed er fyret
det er den metode, der vil blive kaldt, så hvis jeg kommer herover til min storyboard og køre det-
mens der er indlæsning vi kan se, hvad det gør.
På min skærm jeg har 2 ting.
Jeg har dette tekstfelt, og jeg har denne etiket.
Jeg siger blot jeg vil have teksten til denne etiket
at være lig med, hvad brugeren har indtastet inde i tekstfeltet.
Denne næste linje her er simpelthen en metode, som jeg ringer
på tekstfeltet, der siger jeg vil have dig til at skjule tastaturet.
Dette er blot den vilkårlige metode, som Apple har valgt.
>> Igen, før jeg gjorde noget jeg var nødt til at wire det hele op, så jeg først kom herover.
Fra det synspunkt controller jeg trækker over til tekstfeltet.
Jeg slap, og jeg kan se her, at jeg kan gøre dette tekstfeltet ejendom
da herovre i det synspunkt controller jeg har defineret en ejendom
der er en IBOutlet af et tekstfelt.
Det siger, at jeg kan wire denne egenskab op
til et tekstfelt i min UI.
Nu når jeg klikker på denne jeg kan begynde at skrive.
Nu, hvis jeg klikker på knappen Udført dette vil fyre
en begivenhed, som jeg nu kan reagere på.
Ingen hændelseshandlere.
Det er sådan jeg bare reagerede på det gjort knap.
Give mening?
>> Dette er ikke et design mønster, at-du måske ikke nogensinde finde dig selv
oprette din egen protokol, men bare vide, at nogle
forskellige iOS-komponenter registrere begivenheder på forskellige måder.
Knapper, for eksempel, bruge disse IBActions.
Tekstfelter, på den anden side, går er at bruge delegerede.
Vi kan se, og du kan se alt dette på indersiden af ​​dokumentationen.
Af den måde, er der faktisk et ton af UI ting indbygget i iOS for dig,
så for eksempel, den måde, jeg gjorde, at sige gjort nederst til højre
er jeg valgt dette tekstfelt.
Jeg kom herover.
Jeg rullet ned lidt at vende nøgle,
og jeg kan faktisk gøre dette til en hel masse ting, ligesom hvis jeg ønsker at sige
nødopkald i stedet jeg kan gøre det, som er helt tilfældigt,
og jeg ved ikke, hvorfor der er en indbygget alarmopkald knap,
men der, det siger nødopkald i virkelig små bogstaver.
Værsgo.
>> Absolut udforske alle disse forskellige muligheder i iOS.
Eventuelle spørgsmål vedrørende delegerede?
Igen, bare en interessant design mønster, som du bør være opmærksom på.
Okay, lad os næste tage et kig på tabelvisninger.
En tabelvisning er dybest set denne liste af emner, der er overalt i iOS.
Når du bladre gennem alle dine kontaktpersoner, du ser på
Indstillingssiden, og den slags liste over ting, kaldes en tabelvisning.
Implementering af en tabelvisning i iOS er ret enkel.
I stedet for at lave en klasse, der nedstammer fra det UIViewController
ligesom vi har gjort før vi simpelthen nødt til at sige i stedet for
alt, hvad en UIViewController gør jeg ønsker at gøre,
Jeg siger alt en UITableViewController gør jeg ønsker at gøre,
så der blot tilføjer nogle ekstra ting, der er fuldstændig gjort for os.
Vi skal gøre meget lidt for stort set udfylde de tomme felter inde i tabellen.
>> For at vise en tabel jeg har brug for at besvare nogle spørgsmål.
Det første spørgsmål, jeg skal besvare, er, hvor mange sektioner er i tabellen?
Når du bladre gennem dine kontakter app du vil opdage, at det er lidt
arrangeret af As, så har du den Bs, og du har den lille sub header.
Hver af disse kaldes en sektion.
Du måske eller måske ikke brug for disse.
Den første ting du skal gøre, er at implementere en metode
kaldet tableView: numberOfSectionsInTableView.
Det er simpelthen returnerer hvor mange sektioner du har,
så dette kunne sige returnere en, hvis du har en stor tabel visning.
Det næste spørgsmål, som iOS brug for at vide er, hvor mange rækker har du?
For eksempel, du bladre gennem en tabelvisning.
Du har et fast antal sange du kigger på eller et fast antal kontakter.
Hvis du er mig naturligvis ikke, at mange,
og så det er hvordan iOS ved hvor mange celler til at vise.
>> Igen kan dette sige noget afkast 3.
Min tabelvisning har 3 rækker.
Endelig iOS brug for at vide, hvad hver enkelt celle ser ud,
så hvad det er faktisk kommer til at gøre, er at kalde denne metode hernede,
denne tableView: cellForRowAtIndexPath.
Det kommer til at kalde denne metode på hver enkelt celle inde i tabellen.
Hvordan det, hvor mange gange at kalde det?
Tja, du fortalte det inde i antallet af rækker i sektionen.
Vi vil kalde dette på hver af vores celler,
og inde i dette er, hvor du rent faktisk kan gøre ting som
indstille teksten eller fortælle dig, hvad den lille blå knap på højre side gør.
Mønstret for at få disse celler, vi kommer til at bruge denne metode
kaldet dequeueReusableCellWithIdentifier.
>> Objective-C er faktisk meget kendt for den latterlige længden af ​​deres metode navne,
og det er virkelig en dejlig sag i punkt eksempel.
Hvad denne metode gør, er det bare siger, jeg vil have dig til at give mig en celle.
Bare en iOS ting.
Hvis du har noget lignende 100.000 sange på din iPod
hvad iOS ikke ønsker at gøre, er tildele 100.000 celler,
fordi hvis du er på toppen af ​​din liste, har du virkelig brug for at allokere hukommelse
for den celle, der er 99.000 rækker ned?
Nej, for som du ruller du kan slags tildele som du går sammen.
Dette er gjort for dig.
Du behøver ikke at bekymre dig om alt det dumme ydeevne stuff.
Alt du siger er du kalder denne metode dequeueReusableCellWithIdentifier,
og det siger, okay, hvis du har brug for jeg har tænkt mig at oprette en ny celle til dig.
>> Men hvis du er i bunden af ​​tabellen, og du har allerede afsat nogle celler
øverst i tabellen, du virkelig ikke vil få brug for når som helst snart
Jeg har tænkt mig at give dig en af ​​dem tilbage i stedet for at tildele et nyt,
og så dette er en fin forestilling bekymring.
Du behøver ikke at afsætte de celler selv.
Det kommer til at give dig tilbage en celle.
Det kommer til at vende tilbage til dig en celle objekt.
Når du har den celle objekt, du kan gøre ting til det.
Du kan indstille teksten i cellen med denne egenskab kaldes tekstetiket.
Du kan tilføje, at pilen til højre eller nogle andre tilfældige ting
med denne anden ejendom kaldet accessoryType, og så videre og så videre.
>> Lad os tage et kig på faktisk at gennemføre en tabelvisning nu.
Da jeg skabte dette projekt
snarere end at sige en enkelt visning applikation jeg faktisk kom herover
til master-detail ansøgning, og så dybest set svarer det til den mail app
på iPad med tabelvisningen til venstre og derefter indholdet til højre.
På iPod eller iPhone dette vil svare til en enkelt tabel visning.
Det er der, jeg fik min starter kode.
>> Lad os først tage et kig på storyboard.
Alt dette blev gjort for mig, dybest set skabt.
Denne navigationslinjen viste mig, hvad et eksempel celle kunne se ud,
og jeg kan dobbeltklikke på dette, ændre titlen.
Alle andre UI bekymringer, som jeg kan klare det.
Den header fil ser virkelig simpelt.
Snarere end at sige dette er UIViewController vi nu siger dette er et
TableViewController, så vi ved, at vi ønsker at kalde alle disse bordet metoder.
Næste jeg ønsker at oprette en ejendom, der kommer til at repræsentere
de ting inde i mit bord.
Denne tabel vil vilkårligt vise
en liste over frugt, og så jeg er nødt til at skabe nogle række
hvor jeg kan indsætte frugt.
Inde i mit gennemførelsen fil den første ting jeg ønsker at gøre
er jeg vil være sikker på jeg initialisere denne array.
>> Jeg sagde Alloc init, skabte min frugt array,
og jeg tilsætning af 4 ting til det, hvoraf den ene er noget mere vanskelig end de andre 3.
Og nu har jeg en vifte af størrelse 4.
Vi ryster det op i CS50.
Jeg har nu en bred vifte af størrelse 4.
Nu jeg har tænkt mig at begynde at besvare disse spørgsmål, og faktisk,
når jeg oprettet denne app alt dette blev allerede gjort for mig.
Jeg behøvede ikke at skrive ud i antallet af sektioner i tabelvisning.
Det var der allerede, og jeg udfylde de tomme felter.
Hvor mange sektioner har jeg?
One. Alle gjort.
Hvor mange rækker har jeg?
Tja, jeg har én række for hver frugt, så denne tælling
er en egenskab ved enhver array, der siger hvor stor er den?
Det er sådan mange rækker jeg har.
Endelig vil jeg nødt til at sige, hvad betyder hver celle ud?
Jeg har tænkt mig at sige dequeueReusableCellWithIdentifier.
>> Igen var dette allerede skrevet til mig.
Jeg behøvede ikke at gøre det selv, og jeg ønsker at komme tilbage
denne celle på dette sted.
Husk, at vi kalder den samme metode på hver enkelt celle,
og dette argument her, denne indexPath argument,
siger, hvad rækken, jeg er i.
Hvis jeg siger indexPath.row hernede
dette vil være 0, vil det være 1, så vil det være 2, og det er så jeg ved
hvilken celle Jeg er i øjeblikket viser.
Jeg ønsker at indstille teksten i cellen ved hjælp af denne TextLabel ejendom
at gå ind i mit frugt array og få
objektet, der svarer til hver række.
Hvis dette er en streng, jeg sætter nu
teksten ejendom til en streng.
Jeg kan gøre en anden ting.
Jeg kan også registrere en event handler på hver af cellerne,
så når jeg trykker hver af disse celler
denne didSelectRowAtIndexPath, vil dette blive kaldt for mig,
så blot ved at definere dette jeg kan nu håndtere, hvad der sker
når du trykker på en celle, og igen, vi passerer i hvilken celle blev aflyttet
således at vi kan genbruge den samme event handler for alle vores celler.
>> Igen, det er noget iOS gør for mig.
Lad os vise en anden irriterende popup
der simpelthen siger du plukket noget, hvor at noget
bliver rækken objekt.
Når jeg kører denne, vil jeg have denne nice tabelvisning
med én række for hver af disse frugter, og hvis jeg trykker på en
det fortæller mig, hvad der skete.
Give mening?
Lad os bygge en lidt mere kompleks af en app,
så meget som at klikke dig plukket tomat er.
Den pæne del om storyboarding
er det ikke kun kommer til at hjælpe os med at designe skærme individuelt,
det er også vil hjælpe os med at binde sammen hele vores app,
så den endelige app vi vil være bygning er denne nice sportsnyheder læser,
og så det kommer til at have flere skærme, og så jeg kan faktisk repræsentere
hver af disse mange skærme på storyboard,
og jeg kan zoome ud og se min app fra et højt niveau.
>> For at oprette et nyt element inde i mit storyboard
det er meget simpelt inde i Interface Builder.
Hvis jeg ønsker at tilføje en anden skærm til dette, for eksempel,
Jeg kan først zoome ud med pinch zoom, at Apple elsker så meget,
og hernede før jeg søge efter en knap
og jeg trække og slippe en knap
hvis jeg ønsker at oprette en ny skærm jeg kan faktisk bare trække og slippe
en hel visning controller, så hvis jeg vælger dette, skal du trække det over her,
hey, der er en anden skærm, og så nu bruger denne samme storyboard fil
Jeg kan have alle de skærme inde i min app, og jeg kan zoome ud
og se, hvordan de interagerer.
Disse vil ikke interagere endnu.
Den måde, hvorpå disse 2 skærme interagerer er du definere relationer.
Du kan stort set sige dette skærmbillede, når du trykker på denne knap,
Jeg vil have dig til at glide over til denne nye skærm.
Det betyder, at der er denne form for relation mellem
det første skærmbillede, og den anden skærm.
Du har dybest set en pil fra denne knap til den anden skærm
at sige, at når du trykker på denne knap, er hvor jeg vil hen.
Ligesom vi kontrol klikkede og slæbt for at definere disse forretninger
vi vil gøre det samme for at definere disse segues.
>> Vi vil se et eksempel for det, og før vi faktisk overgang
fra den ene skærm til den anden iOS er rart nok at kalde denne metode
kaldet prepareForSegue, og det er her, vi kan begynde
afsendelse af data fra én app til en anden.
I det eksempel, vi er ved at se på det vil som udgangspunkt give os
at filtrere baseball hold af ligaer og divisioner.
Når jeg vælger en liga, for eksempel, vil jeg overgang
til min næste skærm, hvor jeg kan vise alle divisionerne
i denne liga eller alle de forskellige teams.
Jeg er nødt til at sende til denne skærm hvilke hold, du skal vise.
For at gøre, at jeg har tænkt mig at drage fordel af denne metode her.
>> Endelig bare et tilfældigt sted på iOS.
Hvis du ønsker at gemme data der er denne ting kaldet centrale data,
der er faktisk lidt kompliceret at arbejde med.
Du kan også bruge SQL til at gemme data,
, som igen er rart men slags på de mere komplicerede side at arbejde med,
men iOS understøtter også disse virkelig cool ting kaldet ejendom lister,
og en ejendom liste er bare en fil, der repræsenterer centrale værdipar.
Du definerer en liste af nøgler, og du siger denne tast bliver et array.
Denne nøgle vil være en streng, og dybest set noget du kan gøre
i JSON kan du gøre inde i en ejendom liste,
og så dette virkelig pænt giver os mulighed for at arbejde med nogle data.
For eksempel har jeg denne Teams.plist at jeg har oprettet.
Jeg har oprettet en ny plist fil, og jeg kan bore ned.
Dette er en ordbog, er dette en ordbog, er disse strenge,
og så dette er en pæn grafisk repræsentation af en JSON dokument
eller bare en række centrale værdi par,
og så dette er de data, som jeg vil arbejde med indersiden af ​​min app.
>> Lad os først komme herover. Vi har en masse flere filer nu.
Men lad os først komme herover til storyboardet.
Storyboard her-hvis jeg kan zoome ud-
kan vi nu se, at dette er strømmen af ​​min app.
Jeg først at gå til at starte på denne skærm.
Jeg har tænkt mig at bore ned til denne skærm,
og jeg har tænkt mig at bore ned til denne skærm, og vi kan se her, at hvis jeg slags
flytte en af ​​disse omkring vi har disse pile går herfra til her,
og den måde jeg definere, at pilen var, hvis jeg zoome ind en lille smule,
og hvis jeg kommer over til dette synspunkt controller,
og her er en celle, og jeg vil gerne sige, at når du trykker på en celle
Jeg vil have dig til at glide over til en anden skærm.
Jeg kan simpelthen holde kontrol,
rulle over en lille smule, hold, skal du trække denne celle over og give slip.
>> Og herovre vi siger, hvad der er den overgang, du vil bruge?
Ønsker du at bruge denne slide ting, der kaldes push?
Ønsker du at glide op fra bunden?
Det kaldes modal.
Og når jeg klikker på en af ​​disse, går det at tegne denne pil for mig,
og det betyder, at jeg faktisk har håndteret hvad der sker når jeg trykker på denne knap grafisk.
Jeg skrev ikke noget kode til rent faktisk at glide fra den ene skærm til den næste.
Jeg definerede denne visuelt inde i Interface Builder.
Hvis jeg klikker på denne pil, kan vi se, at jeg gav denne ting et navn.
Jeg kaldte det showDivisions, og det er, så jeg kan kende
hvilken overgang er ved at opstå, og vi vil se hvorfor i bare et sekund.
Det er sådan jeg har kablet op til de forskellige skærme i min app.
Hvis dette var en knap, for eksempel i stedet for en tabel visning,
Jeg kunne styre klikke på knappen, trække over til den næste skærm,
og det er sådan jeg kan gøre navigationen på den måde.
>> Virkelig hurtigt, hvis vi kommer ind i MasterViewController,
igen, vi simpelthen kommer til at definere en liste over ting
der vil blive vist i tabellen visning.
Her Jeg siger jeg vil have dig til at tage det plist fil,
og jeg vil have dig til at lægge det op i en ordbog,
og når du har at ordbogen, vil jeg besvare de samme spørgsmål igen.
Her er antallet af sektioner.
Den ene, der er én række for hver liga, og teksten af ​​hver celle
være enten den første, den første liga, den anden liga, og så videre.
Endelig vil jeg benytte denne metode, som vi lige har set kaldet prepareForSegue,
og det er den metode, der kommer til at blive fyret, når jeg klikker
på en af ​​disse rækker, og således aktivere denne overgang
at jeg er oprettet med pilene.
Det siger, at jeg kan have flere
relationer fra den ene skærm til den anden.
Hvis jeg har 2 knapper, og hver knap tager dig til en anden skærm
Jeg har tænkt mig at have 2 segues, 1 for hver knap.
Men denne prepareForSegue er igen vil blive genanvendt
for hver af de forskellige relationer, betyder så, at jeg har brug for en måde
at identificere, hvis du trykker på den første knap, eller du trykker på den anden knap.
>> Husk da jeg gav det Segue et navn, dette showDivisions,
det er sådan jeg ved nu, at dette er Segue der blev aktiveret.
Alt hvad jeg ønsker at gøre, er jeg ønsker at sige
Jeg ønsker at finde ud af hvad jeg bare ramt,
og så for at få det, kan jeg sige, at jeg ønsker, at indexPath for den valgte række,
huske indexPath bare siger, hvor jeg bare klikkede,
og så vil jeg sige, at jeg ønsker at finde ud af, hvor jeg skal hen.
Denne destinationViewController, det er en egenskab af Segue.
Det er skærmen jeg har tænkt mig at,
så jeg ved, at skærmen vil jeg kaldes DivisionsViewController
fordi jeg oprettede denne klasse,
og så nu, hvis jeg siger d.divisions
Jeg sætter nu en ejendom af den opfattelse controller jeg er ved at gå til.
Dette er, hvordan jeg sender data fra den ene skærm til den anden skærm.
>> Bare se på denne DivisionsViewController
du kan se her, at der i. h-filen
der er, at ejendommen divisioner, og det er hvad jeg dybest set befolker,
så det er sådan jeg ved, at jeg viser de divisioner, der svarer til
ligaen, at jeg klikkede, og igen,
den faktiske tabelvisningen ser temmelig meget den samme, blot at besvare dem
3 simple spørgsmål samt identificere
hvad der sker, når du flytter til det næste skærmbillede.
Blot et par andre ting her.
Du bemærker øverst her, at i stedet for at sige # include
Jeg siger nu # importere.
Dette er blot en Objective-C ting.
Importen er dybest set en pænere version af indbefatter,
og for eksempel, har vi brug for at vide, hvad denne klasse er,
så jeg kan ikke bare sige DivisionsViewController.
Hvis vi ikke hashtag standardio.c inde i vores. C. fil
compileren havde ingen idé om, hvad printf var.
Tilsvarende, hvis jeg ikke importerer den DivisionsViewController
compileren har virkelig ingen idé om, hvad en DivisionsViewController er.
Bare sørg for, at indersiden af ​​dine forskellige. M filer du sørge for at importere
de tilsvarende. H filer, så compileren ved, hvad der foregår.
>> Endelig, hvad Apple i sidste ende gør, er at vise noget data fra en web visning,
og så en web visning er et objekt, som du kan integrere
en lille webbrowser indersiden af ​​din app.
Alt du skal gøre er at levere en URL til din webbrowser,
så jeg ønsker at gå til mlb.mlb.com,
og det er sådan jeg kan få adgang til hjemmesiden for hvert hold,
og så ved at passere i denne URL
web view kan vise dette for mig, og jeg kan browse rundt,
og simulator er i brug af det ene.
Nu dette kom fra min plist.
Hvis jeg klikker på denne dette også kom fra min plist, og denne glidende blev håndteret
ved at definere disse segues.
Jeg klikker på denne og en mere,
og nu her er mit UIWebView, så ligesom det
Her er hjemmesiden for den webadresse, som jeg netop indlejret,
og jeg behøvede ikke at håndtere noget vanvittigt.
Dette er hvordan du får vist en webside.
Ting som dette tilbage-knap her er også givet til mig
helt gratis, fordi jeg har defineret disse relationer ved hjælp segues.
>> Eventuelle spørgsmål? Yeah.
[Student] Så når du bruger alloc, du aldrig behøver at fri noget?
Præcis, når du ringer Alloc og init du behøver ikke at befri dem.
IOS kommer til at håndtere alt dette for dig.
Det er vidunderligt, og du ikke bryde nogen regler. Yeah.
[Student] Hvis du skulle til at omfatte flere hold, der kunne passe på skærmen,
vil det automatisk have en rulle mulighed, eller er det noget du har brug for at tilføje?
Præcis, hvis jeg havde flere hold, for eksempel, vil det automatisk håndtere
rulningen for mig, og alle de præstationer bekymringer
med den enorme bord håndteres også helt for mig.
>> Andre spørgsmål?
Alt dette kodeks vil blive udstationeret.
Vi slags tilsløret lidt af de mere mindre detaljer,
men ting som at sætte nogle egenskaber til web visning
er bare ting, som du kan få ved at browse Apples dokumentation,
der er virkelig, virkelig pænt lagt ud.
De har en masse eksempler på apps og eksempel kutymer
af forskellige API'er, gennemlæse så absolut dem, hvis du kan.
Blot nogle nyttige links, du måske ønsker at tage et kig på.
Disse er nogle praktiske dokumentation guider.
De webadresser er massiv, så de er afkortet.
Denne første er hele biblioteket af dokumentation.
Der er lidt søgning barer, så hvis du begynder at skrive knap
vil det begynde at give dig alle oplysninger om alle de ting, du kan gøre med en knap.
Jeg har også inkluderet den Table View Programming Guide.
Det håndterer tabelvisninger i langt flere detaljer,
hvordan man gør ting som dynamisk tilføje celler eller redigere celler eller fjerne dem.
>> Der er masser af eksempler på apps fra Apple, som vil vise dig, hvordan du gør det,
og endelig den sidste er den menneskelige grænseflade retningslinjerne,
og det er dybest set en diskussion af UI komponenter,
ting som ikke gør en knap, der er 4 pixels med 4 pixels.
Det er en dårlig idé, og andre ting, som Apple ønsker dig at gøre
at fremme godt design.
>> Eventuelle sidste spørgsmål, før vi slutter op?
Okay, helt sikkert velkommen til-Vi kommer til at have særlige etiketter på Diskuter.
Vi vil have en iOS en, så absolut velkommen til at udnytte det.
Hvis du ønsker at arbejde med dine klassekammerater om projekter
eller hjælpe regne ud nogle tilfældige iOS stuff
velkommen til at kontakte mig, og helt sikkert gennemlæse al den kode online, fordi
bare af hensyn til tid, vi slags tilsløret mere
finere kornet detaljer ting.
Men hvis ikke, så held og lykke på dine iOS-projekter, og jeg håber, at vi har
en stor tilstrømning af apps i App Store.
[CS50.TV]