[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]