[Powered by Google Translate] [Seminarium] [iOS: Skriva Apps Like a Boss] [Tommy MacWilliam] [Harvard University] [Detta är CS50.] [CS50.TV] Okej, alla, välkommen till iOS: Skriva Apps som en Boss. Detta seminarium kommer att fokusera på att skriva program för iPhone och i sin tur skriver program för iPad, och så vi i grund och botten kommer att gå igenom ett par olika exempel på hur man gör en app, ett enkelt spel som Tic Tac Toe, eller om du är mer intresserad av att göra en app som något slags nyhetsläsare eller något som interagerar med Internet kommer jag att tala om det också. Här är våra kort dagordning. IOS apps är skrivna på ett språk som kallas Objective-C, och så detta är lite liknande C men inte riktigt alls, så vi kommer att prata lite om själva språket och sedan hur man bygger iPhone apps som använder denna app program som heter Xcode, som om du inte har hämtat den ännu gärna starta hämtningen nu. Det är flera gigabyte. Det bör vara gratis på App Store, så du måste ha en Mac idealiskt kör den senaste versionen av OS X. Om du inte, inga problem. Vi har Mac-datorer i science center tillgängliga för dig med XCode installerat och så känn dig fri att använda dem för utveckling. Om du vill göra en app men inte har en Mac, oroa dig inte. Det finns gott om campus resurser för det. Och så då ska vi täcka 2 större exempel på olika program du kan göra. Objective-C är tekniskt vad som kallas en super uppsättning C. Det innebär att alla C-kod gäller även Objective-C-kod. Det betyder att vi typ av trumman tejpade på några extra funktioner till C. Vissa av dessa funktioner inkluderar inte behöva någonsin skriva malloc igen, tack och lov, ingen behöva oroa de dumma pekare och frigöra dem och allt det där du hatade om C, och det är typ av gått i Objective-C. Nu har Objective-C också en mycket större standardbiblioteket, så det finns mycket mer funktionalitet du får gratis inne i Objective-C. Kommer du ihåg när vi skrev PHP märkte vi att vi gick från Detta minsta språk till jätten biblioteket av alla dessa galna saker du kan göra. Samma sak händer i iOS. Det finns objekt för saker som den buddhistiska kalendern, och verkligen något du kan möjligen tänka förmodligen finns redan i Objective-C genomförande. Målet delen av Objective-C är refererar något kallas Objektorienterad programmering. Detta är typ av ett nytt koncept, men vi har faktiskt mest lärt många av dessa begrepp redan. Tanken bakom Objektorienterad programmering är att du kommer att strukturera mycket av din kod runt dessa saker som kallas klasser, och dessa klasser är verkligen högstämd structs. Inne i en struct vi i princip sagt här är en sak, och denna sak kan ha medlemmar. Exempelvis kan en nod i en länkad lista ha andra saker som ett värde, en pekare till nästa nod i listan, och tillsammans att pekaren och detta värde består detta en instans av en struct. Klasserna är mycket lika förutom klasser kan också ha funktioner inne i dem. När vi förklarade en struct, kan vi bara säga int n eller nod * nästa. Nu med Objective-C kan vi faktiskt sätta funktioner inuti dessa saker. En annan sak som klasser kan göra är att de kan ärva data från andra klasser. Till exempel kommer vi att titta på ett gäng inbyggd i Objective-C klasser. En av dem skulle kunna vara den klass som representerar vyn för en skärm, och så genom att säga jag vill genomföra min egen åsikt vi säga i princip någon över på Apple, förmodligen riktigt trevligt folk, skrev denna klass för mig, och den hanterar saker som att visa knappar eller göra skärmen, och vi skulle vara riktigt smärtade att genomföra allt som funktionalitet själva, och det genom att helt enkelt arv data vi kan säga allt som du gjorde i den klassen Jag vill också inne i min klass, och då ska jag göra lite andra grejer, nämligen att genomföra en app. Det är vad det ordet arv betyder. Vi får se en mer konkret exempel. Och slutligen, är nyckeln till Objektorienterad programmering som det leder till data inkapsling. I vissa av våra problem sätter vi kunde ha dessa stora, globala variabler och globals överallt, och det är hur vi skulle hålla reda på stat. Med klasser vi kan börja kapsla informationen inuti ett objekt. Om vi ​​har en skärm på vår app, vi egentligen inte behöver ha några data från en annan skärm i vår app inuti det, och så genom att kapsla saker i klasserna leder faktiskt till mycket bättre kod konstruktion, och detta är möjligt med några av de ytterligare funktioner av Objective-C. Förvarning, är syntaxen för Objective-C bananer. Det är som något vi har sett tidigare, så det är lite av en inlärningskurva att vänja sig vad sjutton betyder det? Men när du komma förbi denna första inlärningskurva det riktigt, riktigt jämn att börja skriva program. Att deklarera en klass, att säga här är min klass, den finns, och kanske här är några saker som jag kommer att definiera senare, Jag ska säga @ gränssnitt. Jag ska säga @ gränssnitt. Jag ska ge min klass ett namn. Och sedan någon annanstans ska jag säga @ slut, och allt mellan @ gränssnittet och @ änden kommer att bli min klass. Det kommer att bli vad som finns inuti våra. H-filer. Precis som i C vår. H-filer sade i princip här är några saker som kommer att finnas. Jag är inte nödvändigtvis berätta vad de gör ännu, men kompilatorn behöver veta att de finns. Senare inne i vår. M. filer, eftersom m för Objective-C är där vi faktiskt kommer att definiera vad dessa klasser gör. Ungefär som våra. C-filer, förutsatt att vi en implementering för funktioner. Inuti vår. M. fil vi ska säga här är vad alla funktioner insidan av min klass vad alla gör. Och slutligen, inne i en struct vi kunde säga inuti dessa klammerparenteser int n eller nod * nästa, och i Objective-C ska vi använda nyckelordet @ egendom, och detta är vad som kommer att definiera egenskaper, eller icke-funktioner som är en del av mina klasser. Ringa funktioner i Objective-C är också bananer. När vi förklarade funktioner i C vi sa något i stil int foo och öppna paren och sedan gav det en lista med argument. Detta är vad som förklarar metoder eller funktioner ser ut i Objective-C. Om jag vill deklarera en funktion eller en metod där jag säger metod är egentligen bara en funktion som är en medlem av en klass, så typ av utbytbara, men inte riktigt, så inne i min metod vill jag skapa en ny metod. Det kommer att återvända ingenting, så det kommer att vara av typen void. Detta är returtyp min funktion. Nu har vi Parens här eftersom-Jag vet inte. Nästa kommer att bli namnet på min funktion, och slutligen har vi ett semikolon precis som vi hade i C. Vad är nytt här är den här killen här. Denna bindestreck faktiskt är nödvändigt, och vad detta säger är att denna metod här måste kallas på en instans av en klass. Efter att vi förklarade våra structs vi sade antagligen något liknande struct nod n och som faktiskt skapade eller instansieras en av de structs så att jag kunde faktiskt börja arbeta med vad som finns inuti den, så denna streck innebär att vi måste instansiera klassen precis som vi instansieras att struct innan vi kan anropa den här metoden på den. Om jag vill börja lägga argument för mina metoder det blir ännu fler bananer. Här är min metod namn. Sen ska jag ha ett kolon, och efter denna kolon står här kommer några argument. Denna metod tar ett argument. Typen av dess argument är en int, och namnet på det argumentet eller den variabel som jag ska börja använda insidan av metoden kallas jag. Återigen, är denna metod. Det tar ett argument. Om du vill börja lägga till fler argument blir det fler bananer att vi har den här kolon som säger här kommer min lista över argument. Denna första argumentet är ett heltal. Nu är denna andra argumentet intressant. Den variabel som jag kommer att använda insidan av min funktion heter f, så inne i min funktion jag kunde säga f + = 1 eller något. Denna sak här är i grunden en nyckel för det argumentet eller parameter. Precis som vi hade nyckel värdepar och något som JSON eller associativa arrayer Objective-C tog beslutet att säga, okej, bara så att det är riktigt klart när du ringer en metod vad alla dessa parametrar är Jag faktiskt kommer att namnge dem alla. När du ringer en metod, kommer du att säga faktiskt andFloat, och då kommer du att passera den i. Intressant nog är detta en inte namngiven, men alla andra parametrar är, så om vi hade en 3: e argument jag kunde säga andFloat och en annan flottören och så vidare. När jag kallar dessa metoder är det naturligtvis bananer, så om jag har ett objekt, och jag definierat en metod som kallas foo, och jag vill kalla det, istället för att säga foo OPEN / CLOSE Parens Jag ska öppna en konsol. Här är namnet på min metod. Jag ska stänga konsolen, och detta är föremålet jag ringer på den. Kom ihåg att alla dessa metoder finns inom klasser eftersom klasser kan ha metoder som definierats inuti dem. Här har jag godtyckligt skapat ett objekt av något klass, och detta är syntaxen för att göra detta. Det finns 2 steg för att skapa ett objekt. Det första steget är att säga att jag vill allokera utrymme. Detta motsvarar en malloc. Vi behöver inte säga malloc längre. Vi tappade m, gjorde det Alloc, och ersatte. C med. M.. Efter att vi alloc något vi måste sedan initiera den. I grund och botten när du skapar objekt du kanske vill ha lite logik som utför när de är skapade så att du kan passera i vissa standardvärden eller något liknande, och så denna init metod är vad som faktiskt skapar objektet. Vi allokera första rutan, precis som vi gjorde i C, och då vi initiera den, vilket kan eller inte kan göra en hel del. Sedan vi tillbaka det här till ett objekt O. Det finns en stjärna här eftersom detta är tekniskt en pekare, men oroa dig inte, pekare är inte så stor en affär i Objective-C längre. Nu har vi instansieras denna klass som heter NSObject, och detta är bara en slumpmässig klass som Apple har. Vi har initierats detta, och nu har jag en instans av denna klass i detta objekt O, så det betyder att om jag definierade dessa metoder kunde jag kalla dem så här. Likaså om jag ville ringa en metod med ett argument, så detta är baren metoden, som tar ett argument, och här är baz: qux metod, så det tar 2 argument. Detta kräver en funktion på detta objekt O. Vettigt? Syntaxen ska vara meningsfullt, men du typ av vänja sig. Okej, låt oss tala om några saker som är inbyggda i Objective-C som inte nödvändigtvis är inbyggd i C. I C vi hade typ av att ta itu med strängar som dessa dumma tecken matriser, och det blev verkligen irriterande. Objective-C har de alla byggda i för oss, och den är byggd i använda denna klass som kallas NSString. När jag vill skapa en NSString vi har mer svårbegripliga syntax. I stället för att säga "CS50" vi säger @ "CS50" och detta är bara syntaxen för att förklara strängar i Objective-C. Detta är extremt lätt att glömma, så gör det inte. Nu, när jag har den här, det här är en sträng, men märker det är egentligen bara ett objekt. Jag sa NSString, vilket betyder att jag instansieras klassen heter NSString, som någon annan skrev för mig, och de var mycket trevligt om det, och så nu Jag kan börja ringa metoder på det. Om jag kallar metoden längden på objektet är det kommer att återvända till mig längden på strängen. Detta är precis som strlen i C. Detta skulle återvända 4. På samma sätt är en annan metod jag kanske vill ta hand om den här characterAtIndex. Detta är en metod som säger om denna sträng är Jag vill att du ska få 0:e karaktär, och så här skulle återvända till mig tecknet c, och det finns en hel massa mer av dessa metoder som du kan Google verkligen enkelt. Apples dokumentation är stor, och vi tar en titt på det i lite. Det är strängar. Vi har också varierande storlek arrayer inbyggd Tänk i C när vi förklarade en matris vi var tvungna att säga att du har 5 element, end of story. När vi kom till JavaScript och PHP vi kunde börja göra saker som att lägga till element eller flytta element. Vi kan göra samma sak i Objective-C. Hellre än att skapa en array på vanligt C-vägen Vi har återigen en annan klass som heter NSMutableArray. Det finns också NSArray, och detta kommer att i grunden kapsla lite array. Detta säger det första jag vill göra är att jag vill att fördela utrymme för en ny array, och efter att jag fördela det Jag måste sedan initiera den. Återigen, bara ringa dessa 2 metoder. Nu innebär detta att insidan av detta objekt en Jag har en tom array sitter där. Om jag vill lägga till något till denna array kan jag ringa addObject metoden. Jag vill lägga till ett objekt i arrayen en, och jag vill lägga till strängen CS50. Om jag ville omvänt bort att jag kan säga att jag vill ta bort föremålet på första plats på arrayen eller objektet en. Vettigt? Okej, du typ av vänja sig vid denna hakparentes sak. Förresten, insidan av en massa Apples bibliotek ser du här NS. NS står faktiskt för nästa steg, vilket var ett av Steve Jobs första företagen, och det är där han verkligen började skriva en hel del av koden som ett slags grund för Mac OS X och alla andra saker, och så denna NS är typ av denna fina arv shout out till en av de tidigare bolagen tillbaka när Apple först börjat. Det är överallt. Låt oss ta en titt på en mer holistisk Objective-C exempel. Här är jag inne i XCode. För att komma hit, hämtat jag först XCode från App Store, öppnade upp, och sedan gick jag upp här filen, hit till nya, och sedan projekt. Efter att jag gör det jag har alla dessa alternativ på vad jag vill skapa, och så ska vi ta en titt på dessa alternativ senare, men bara för det här exemplet, eftersom vi inte faktiskt kommer att ha en app ännu, Jag kom ner hit, och jag sa kommandoradsverktyg, och detta är en app som jag kunde köra på kommandoraden precis som vi har kört från C. Det är hur jag skapade det här projektet, och så nu är jag här, så låt oss först titta på den här filen, och detta bör se ganska bekant. Jag har en int namn. Det är min vän argc, min andra kompis argv. Och så kan vi se att det är inkörsporten för min första Objective-C program. Här kan vi ignorera detta för nu. Detta är i grunden en del minneshantering saker som du inte kommer riktigt någonsin behöver oroa. Låt oss titta på denna första blocket här. Denna första raden, om jag säger Student * alice = [[Student alloc] init] vad är det att göra? Denna första student här, detta är förmodligen en klass. Detta är inte en klass som Apple skrev, men det är en klass som jag skrev. Det första jag vill göra är att jag vill allokera utrymme för en ny student, och då vill jag initiera den, så det ger mig tillbaka denna nya studenter objekt, och jag lagrar det i en variabel som heter Alice. Var kom den klassen ifrån? Tja, här borta på vänster sida dessa är alla de olika filerna inuti mitt projekt. Vi kan se här har jag en Student.h och Student.m. Den. H. fil, kom ihåg, är där jag förklarar alla de saker som kommer att finnas i klassen. Låt oss ta en titt på det. Okej, här har vi det här @ gränssnitt, och det säger att här kommer förklaringarna från allt som kommer att finnas inom min klass. Sen har jag ett kolon. Då jag har denna NSObject sak. Detta kolon innebär att arv bit vi diskuterade lite tidigare. Detta säger allt ett NSObject kan göra där NSObject är denna klass skriven av någon annan, allt detta NSObject kan jag vill kunna göra det. Genom att säga: NSObject det innebär att jag i grund och botten ärvt all funktionalitet för en annan klass. Det gav mig verkligen en massa olika metoder och egenskaper som jag kan använda. Här nere Jag skapar 2 fastigheter. Det betyder min student, om detta var en struct, skulle dessa vara 2 saker insidan av min struct, så varje elev har ett namn som är en sträng, och en student har också en kvalitet, vilket är en int. Slutligen, här nere ska jag skapa en metod för min student. Jag ringde min metod, initWithName, och det tar ett argument, och argumentet är en sträng, och jag kallade det namn. Nu ska vi titta på hur vi faktiskt genomfört denna klass. Här, nu är jag inne på min. M. fil, m för genomförande, antar jag. Jag har min genomförande, mitt slut och här är där jag faktiskt definiera vilken initWithName gör. Jag har initWithName, namnet på min parameter och sedan detta är där jag faktiskt skapar en student, och så detta är lite kryptisk, men det är typ av standardtext som du vill inkludera i dina konstruktorer. Denna initiering fungerar här, initWithName, är en typ av konstruktor. Du är i grunden bygga en ny elev objekt och kanske skicka några data i den. Det första jag vill göra är att jag vill ringa init på denna super sak. Kom ihåg att när jag sa tillbaka här i. H. filen att allt en NSObject har en elev har också. Det innebär att när jag skapar en elev vad jag också behöver göra är se till att NSObject att jag ärver alla av dessa uppgifter från också initieras korrekt. Vad jag behöver säga är denna super faktiskt kommer att hänvisa till den överordnade klassen att jag ärver från, så jag vill se till att jag initiera allt som jag beroende på innan jag börjar försöka använda den. Sen om det initieras korrekt är precis som att säga om malloc inte returnera null då kan jag börja ställa vissa egenskaper. I JavaScript och PHP hade vi det här sökordet kallade detta, och detta anges den nuvarande instans av en klass. I Objective-C som vi kallar jaget. När jag säger self.name, innebär att objektet Jag skapade bara när jag sa eleven Alloc init, det kommer att ge mig tillbaka ett objekt. Det betyder att jag vill ställa namnet på objektet till vad jag just passerat i. Precis som i C, tillgång vi medlemmar i denna punkt, så self.name säger namnet på eleven objektet kommer nu att bli vad du just passerat i. Och så slutligen, kan jag returnera den så jag faktiskt få något tillbaka. Frågor? Okej, så detta själv = super init, Om du inte helt förstår arvet grejer oroa dig inte. Vet bara att om du någonsin vill göra din egen init metod bara göra det, och du kommer att bli bra att gå. Ja. >> [Student] Vad gör om sig själv betyder? Det innebär att när vi malloc något vi alltid kontrollerat om det var lika null, och om det var noll, då vi avslutat. Detta är samma sak, för om det återkommer null, då vi förmodligen kommer att seg fel om vi börjar försöka manipulera den. Det är vår elev klass. Det innebär att vi kan initiera våra elever på ett av två sätt. Om jag säger eleven alloc init jag inte använda den metod som jag just skrev, och istället kan jag bara säga alice.name, och nu ska jag ställa den egenskapen namnet. Likaså om jag vill använda den initWithName metod Jag kan bara säga Alloc, och sedan istället för att säga init Jag ska kalla denna metod som jag just har skapat och jag kommer att passera i Bob. Vid denna punkt har detta objekt Bob ett namn som är lika med Bob. Okej, här nere jag använder den NSMutableArray som vi tittat på tidigare. Jag fördela space.Then jag initiera en ny array. Jag ska lägga 2 saker till den. Denna matris har nu studenter objekt. Observera att ingenstans hade jag att säga att detta är en rad studenter. Jag sa att det är en array, period. Då kan jag ange vad insidan av det som jag vill. Här har jag 2 objekt. Slutligen har jag ett annat objekt här, denna TF. Här borta i TF.h i princip samma sak. Jag ärver från NSObject, och förresten, när du skapar lektioner här är allt gjort för dig, denna typ av gränssnitt standardtext. Den har en egenskap hos studenter. Jag har ett par metoder här som egentligen inte göra en hel del, och så det betyder när jag skapar denna TF objekt Jag kan anropa den här metoden betyg på det så här. Eventuella frågor om Objective-C syntax innan vi börjar flytta in lite mer intressanta apps utveckling grejer? Okej, så låt oss faktiskt göra en iPhone app. Kärnan klasser som du kommer att använda insidan av din iPhone app kallas view styrenheter, och en vy styrenhet är i grunden en enda skärm insidan av din app, så om jag är på programmet Musik, till exempel, en View Controller kan representera den vy som jag ser alla låtar på min iPhone. Another view controller kan vara när jag klickar på en låt och börja spela det eller som jag borrar ned i konstnärer. Var och en av dessa olika skärmar kan representeras som en annan uppfattning styrenhet, och en vy styrenhet är egentligen bara en klass som säger hur den här skärmen fungerar. Saker inuti en View Controller, vi kommer att ha egenskaper, så saker som en knapp kommer att bli en egenskap hos vår uppfattning styrenhet. Vi kommer även att ha metoder, och dessa är i grunden händelsehanterare. Denna metod säger när du trycker på den här knappen Jag vill göra något, och slutligen, återigen, vi kommer att använda detta själv nyckelordet för att komma åt aktuella förekomsten. Att bygga gränssnitt i iOS är faktiskt riktigt, riktigt enkelt. De har denna fina dra och släpp-gränssnitt som kallas Interface Builder, och de 2 centrala begrepp som tråd upp din Objective-C Interface Builder är IBOutlet och IBAction. En IBOutlet säger bara att om du deklarerar en egenskap som är en knapp, och du vill ansluta den till något i din faktiska UI, du kommer att säga att det är ett utlopp. Likaså om du vill representera en händelsehanterare då du kommer att säga att det är en åtgärd. För att verkligen koppla upp denna grafiskt och din kod är det riktigt, riktigt enkelt. Om du vill bifoga en IBOutlet, allt du behöver göra dig kontroll klick, och vi får se ett exempel på detta riktigt snabb. Du styr klicka där det står View Controller. Du kommer att dra in i gränssnittet, eller omvänt, om du vill koppla in en händelsehanterare du kommer att dra från gränssnittet i den andra riktningen. Låt oss ta en titt på en riktigt enkel iOS exempel. Låt oss skapa ett nytt projekt. Jag kommer att komma upp hit till ansökan, och jag ska klicka Enkelvy program. Jag ska klicka på Nästa. Jag ska ge mitt projekt ett namn. Jag kallar det Hej. Intressant, förutsätter Apple du skapar en produkt så att du kan sälja den och de kan tjäna pengar. Här nere kommer jag att säga att detta är en iPhone app. Du kan skapa en iPad app, eller om du vill skapa en av dessa appar som stöder båda enheterna du kan göra det också. Detta är vad du vill att dina markeringar ska se ut. Du vill använda storyboards, som vi kommer att se senare, och du vill absolut använda automatisk referens räkna, vilket är en trevlig funktion som hindrar dig från att behöva säga minnesallokera och gratis. Om du inte vill ringa malloc och fri, skulle jag lämna kontrolleras. Jag klickar på nästa och slutligen, detta kommer att fråga mig var jag vill spara det. Jag kommer hit skapa och nu kör vi. Jag skapade ett nytt projekt. Här borta till vänster är alla filer som är inne i mitt projekt, och märker att jag fick en hel massa, och jag har inte ens göra någonting. IOS är stor. Till exempel här i ViewController.h, detta kommer att representera min första View Controller, så den första skärmen inne i min app. Nu vet vi vad det säger. Vi säger att jag ringer denna klass ViewController, och en ViewController gör allt som en UIViewController gör, och detta är återigen något klass som Apple skrev att gör en hel del praktiskt saker för oss gillar visa skärmen. Här är där jag faktiskt kan börja definiera vad min åsikt controller gör, och det visar sig att jag verkligen inte behöver något av detta. Detta är standardtext kod som Apple ger mig gratis. Jag behövde den första raden, eller jag har inte en klass, så att vi kan bli av med det och bli av med denna. Okej, så det här är min tomma skärm. Nu ska vi klicka på denna MainStoryboard.storyboard, och det är där det börjar bli intressant. Detta är den första skärmen på min app. Om jag vill lägga till en knapp i HTML var jag tvungen att skapa en knapp tagg. På Android måste du skapa en knapp tagg, men i iOS om jag kommer bara hit till det nedre högra och om jag klickar på 3:e en hit där det står föremål, och jag kan rulla ner, eller jag kan börja söka efter knapp. Och titta, en knapp, så om jag faktiskt dra och släppa denna rätt där, Jag har precis lagt till en knapp för att denna skärm på min app. Om jag vill ändra texten, kan jag dubbelklicka den, säga något lockande som "Tryck mig." Okej, nu om jag kör denna app, så vi sammanställer det, så att köra det jag klickar på play-knappen i det övre vänstra och det är min app. Jag har inte gjort någonting, och jag fick en söt ser iPhone-app. Om jag vill stoppa det, kan du klicka på stoppknappen eftersom det är roligare. Låt oss säga att jag faktiskt vill att något ska hända när jag trycker på den här knappen. För att göra det vad jag behöver göra är att jag behöver för att skapa en ny händelsehanterare eller en handling. Det betyder att jag måste skapa någon metod som jag vill bli kallad när jag trycker på knappen, så låt oss skapa en ny metod. Jag insida ViewController.h. Jag måste säga att en metod finns. Jag behöver ett bindestreck först eftersom jag kommer att kalla detta på View Controller. Jag måste ge detta en typ. Den typ av detta kommer att vara att IBAction sak som vi såg tidigare. Detta är en händelsehanterare, så det kommer att returnera en IBAction, och detta är en ledtråd till XCode att säga att detta är något jag vill koppla något. Jag kan ge den ett namn, som buttonPressed, semikolon. Nu har jag förklarat en ny metod inne i min klass. Jag har sagt denna metod har att existera. Nu ska vi komma i ViewController.m, och låt oss säga vad denna metod kan göra. Om jag börjar skriva, till exempel, (void) buttonPressed meddelande XCode är verkligen trevligt och autocompletes för mig. Det är verkligen underbart. Notera här att insidan av. M. filen jag också säga ogiltig, och detta beror på att IBAction är egentligen inte en typ. Det är faktiskt hashtag definieras någonstans att vara ett tomrum, och igen, detta är bara en antydan till XCode som säger Jag vill att detta ska vara en händelsehanterare, och vi får se varför bara en sekund. När denna knapp trycks jag ska göra något irriterande gillar visa en popup. För att göra det jag kan skapa en ny instans av denna klass som kallas UIAlertView, och detta är en klass som Apples skrev det kommer att visa irriterande popup-fönster. Vi kallar denna popup varning, och jag har 2 steg, kom ihåg, att skapa detta objekt. Det första jag behöver göra är att allokera utrymme. Jag vill ha en UIAlertView. Jag vill allokera utrymme. Det är min första metoden. Min nästa metod är att jag vill att initiera den, och så har jag det stora, långa metod som kallas initWithTitle. Som i stort sett kommer att kontrollera vad detta popup säger. Titeln på min popup kan hej. Budskapet i denna popup kan vara "Det här är iOS." Delegera sak, jag vet inte vad det är. Låt oss säga att det är ingenting. Nu knappen som kommer att synas kan säga något i stil med: "Det är säkert," och jag vill verkligen inte några andra knappar, så låt oss ta bort den och stäng hållaren. Okej, jag skapade en extra. Där kör vi. Det är så jag kan skapa en ny popup. Om jag vill verkligen visa popup Jag vill ringa showen metoden. För att göra det jag kan säga alert och visa, och igen, autocomplete super trevligt. Om jag har glömt vad det var, om jag bara skrev i s, Jag kan bläddra igenom här för att räkna ut vad det var, och det filtrerar fint. Nu har jag skapat denna nya popup. Vi kommer tillbaka till vad delegat innebär senare, och nu vill jag säga att jag vill här metoden för att eldas när jag trycker på knappen, så jag kommer att komma tillbaka till min storyboard, och jag vill nu fästa denna IBAction. Det första du vill göra är att klicka på knappen. När jag trycker på denna knapp vill jag att något ska hända. Jag tänker inte hålla ned kontroll. Jag ska klicka och dra från knappen till hit där det står View Controller. Vi kan se att det snyggt lyser. Om jag släpper med min mus har jag nu denna popup hit där jag har några alternativ. En av dessa är de händelser som jag kan registrera. Dessa är alla dessa metoder jag deklarerade i mitt h-filen som IBActions. Detta är hur XCode vet vad som ska visas i denna lilla lista, så det är bara en antydan. Om jag klickar på tryckte på knappen, jag registrerat nu händelsehanteraren. I JavaScript vi hade att säga jag har lite kod som registrerade händelsehanteraren. I Objective-C var det verkligen så enkelt. Om jag kör detta igen nu när jag trycker på knappen mitt händelsehanteraren ska skjuta, och jag kommer att få detta popup. Super, super enkelt där. Om du någonsin vill se alla händelser som är registrerade på en komponent om jag klickar på den här knappen och jag kom hit till höger Först ser hit jag kan göra saker som den typen av knappen så om du vill ha en av de jag är eller Lägg till Kontakt knappen eller vad som helst. Om jag vill se alla händelser som finns på den här knappen om jag kommer ända hit till höger Vi kan se här på de händelser jag har alla dessa olika händelser. Jag kan trycka på knappen, när jag släpper knappen, när jag dubbeltryck eller vad som helst, och det som jag just registrerat är denna händelse som kallas Touch upp inuti, och detta säger att så fort fingret lossnar knappen händelsen kommer att eld och det är precis vad som just hände. Detta är typ av standard pressade knappen händelse. Eventuella frågor hittills? Okej, det är hur vi kan börja koppla upp saker i vår kod in i saker inuti vårt gränssnitt. Kom ihåg den första vi behövde göra var att hitta koden, och då vi trådbunden upp gränssnittet till koden, och det är vår första app. Okej, det var riktigt coolt, och vi skapade den här knappen. Vad händer om vi inte vill ha att skapa ett gäng egenskaper representerar dessa knappar? Till exempel i Tic Tac Toe har jag 9 knappar, och det skulle vara super, super irriterande att behöva dra och släppa 9 gånger eller om jag var tvungen att göra Tic Tac Toe med 81 i stället för 9 och jag var tvungen att dra och släppa 81 gånger, och det är halt. Vad vi kan göra istället är ungefär som en HTML när vi hade saker som ID och namn och vi kan söka efter saker av deras ID, det finns en liknande begrepp i iOS kallas taggar. En tagg är helt enkelt en unik numerisk identifierare för en komponent. Om jag säger detta har en tagg av 0, till exempel, Om jag skapar en knapp och ge den en tagg av 0, och vi får se hur man gör det på bara en sekund, Om jag vill få den knappen jag kan bara säga att jag vill ringa den viewWithTag metoden på objektet hit, den self.view, som representerar den aktuella skärmen, till exempel. Om jag kallar det viewWithTag metod kommer jag att dra tillbaka knappen med etiketten 0. Låt oss ta en titt på denna genom att bygga Tic Tac Toe. Först, det är min storyboard. Jag har skapat dessa 10 UI knappar. Lägg märke till de är alla i samma storlek. Om jag klickar på en av dessa och jag kommer tillbaka hit på denna höger sida ser du jag justerat teckensnitt här, så jag gjorde det teckensnitt lite större, men vad jag också gjorde var jag satt här taggen. Jag sade att detta har en tagg 1, och det är upp till vänster. Nu, om jag klickar på en annan knapp, som denna andra här, Nu ser du att min tagg 2. Var och en av dessa knappar har bara en unik tagg, och så detta är senare hur jag ska börja interagera med min app. Detta är alla inne i en View Controller, men här är vad vi har. Vi har 3 fastigheter här. Den första och den sista en kommer att representera tillståndet i min styrelse. I grund och botten denna första är en matris som representerar var Xs och OS är. Denna andra talar här oss vems tur det är. Du kommer att märka att jag också har dessa saker här. Innan när vi förklarade egenskaper vi gav dem ett namn och en typ. Vi kan också ge dem lite extra information här. Denna första säger nonatomic, och vad detta säger är i grunden bara en sak kommer någonsin att försöka komma åt den här variabeln åt gången. Du kan göra mer komplexa applikationer som är flertrådade, och så tillbaka i Scratch vi hade olika trådar, och olika sprites kan göra olika saker på samma gång. Om det inte är fallet, vilket det inte är i något som vi kommer att titta på, om vi säger nonatomic det faktiskt kommer att göra det lite snabbare. Vi har också denna sak som kallas tilldela, stark eller svag. Detta tilldela säger bara att det är en vanlig typ. Detta är inte ett objekt eller en pekare eftersom detta är bara en bool, så bool är inbyggd i Objective-C. Detta säger inte försöka göra något fint med pekare här. Det är en vanlig gammal scaler. Stark och svag, säger att detta svaga som faktiskt Jag vill att detta ska peka på något i View Controller. Jag tänker inte faktiskt tilldela eller init detta själv. Gränssnittet byggmästare, när jag kör programmet, kommer att hantera allt som initiering. Om jag säger svag, säger att någon annan kommer att skapa denna. Om jag säger stark, säger det att jag kommer att vara en som är att skapa detta forum objektet, och så här jag har några fler metoder här, till exempel en åtgärd när det nya spelet trycks, talan om när någon av de andra knapparna trycks, och et cetera. Vi kommer inte komma in för mycket av logiken i Tic Tac Toe, även om det är väldigt spännande, men låt oss ta en titt på några av de saker som vi kan göra inne i iOS. Det nya spelet metod kommer att avfyras när jag trycker på nytt spel knappen. Att koppla upp det jag helt enkelt komma över till min storyboard. Jag klickade på nytt spel. Om jag kommer hit till höger kan jag se att Tryck upp inne är kopplad till newGame metoden. Det är därför detta kommer att få sparken. Den newGame metoden kommer att göra en del inställningar. Det kommer att säga att jag vill att du ska rensa tillstånd av styrelsen. Detta är ett trevligt sätt på föränderlig matriser. Detta kommer att säga att det är nu X: s tur, och nu ska jag dra nytta av denna viewWithTag sak. Jag vet att mina knappar har taggarna 1-9, och det är något jag godtyckligt plockade. Om jag vill ställa texten för varje knapp vara tom eftersom jag har precis börjat ett nytt spel och jag vill inte ha någon Xs eller O lämnas över jag kan göra detta. Jag kan säga att jag vill ha vyn med taggen, 1, 2, 3, 4 et cetera. Detta kommer att dra en annan knapp varje gång. Här kommer jag att kasta det åt UIButton. Precis som vi kan kasta Ints till flöten och vice versa Detta säger att jag vill kasta det till en UIButton. Det innebär den typ av detta kommer att bli en UIButton * på grund av pekare, men oroa dig inte, de är inte skrämmande längre. När jag har den här knappen ska jag ringa en metod på den. Denna metod kallas setTitle forState, och så detta säger Jag vill ställa texten i knappen vara den tomma strängen, och jag vill att det ska vara den tomma strängen när den inte intryckt. Om jag använder denna metod kan jag ändra texten på knappen så fort någon slår det, men vi vill säga när knappen bara sitter där Jag vill att texten ska vara tom. Slutligen kommer vi att initiera min styrelse, och jag kommer att säga att allt är närvarande 0, så detta styrelseledamöterna oföränderliga är en föränderlig matris, vilket betyder att jag kan ringa addObject metoden och bara en 0 inuti den. Det är vad som händer när jag skapar ett nytt spel. Låt oss ta en titt på en annan. Denna metod här är IBAction som kommer att tryckas varje gång en av dessa rutor trycks in. Nu har vi några Tic Tac Toe logik här. Vi räkna ut vems tur det är, och bygger på att vi antingen satt ett X eller ett O, men vi märker att vi återanvänder samma händelsehanterare för varenda en av dessa knappar. Det betyder att jag inte har en metod för den övre vänstra knappen, en annan metod för nedre högra knappen, även om jag kunde ha gjort det. Det skulle inte vara riktigt god design. Vad jag gör här är jag faktiskt tänker bestämma vad taggen på knappen som trycktes är. Du märker att denna pjäs metoden tar ett argument. Det kallas avsändare och vad avsändaren är avsändaren kommer att representerar exakt vad som vidtagit åtgärder på. Om jag trycker på en knapp, är denna avsändare kommer att vara att UIButton att jag faktiskt ner, betyder så att den UIButton har en tagg eftersom jag skapade en tagg. Om jag vill komma åt taggen kan jag bara säga Jag vill att taggen av avsändaren, och igen, jag gjuten bara den till en UIButton. Jag råkar veta att avsändaren kommer att vara en UIButton. Det behöver inte alltid vara en UIButton. Jag kunde till exempel registrera samma händelsehanterare  för en för en knapp, en för ett skjutreglage. I det här fallet vet jag att de är alla knappar, så jag kommer att säga Jag vill att detta ska vara en knapp, och då kan jag få tag, och från taggen Nu vet jag var jag är inne i styrelsen. Då kan jag bara ställa antingen X eller O, kan vända tur, kontrollera vem har vunnit, et cetera. Har du frågor om detta så här långt? Okej, all kod vi upp på nätet, vi vill inte komma in för mycket av Tic Tac Toe logik, men nu kan man se att verkligen allt vi gör är att vi looping över denna array, så vi har ett par för slingor här och vi bara jämföra för att se har vi en match i alla rader, en match i en kolumn eller nåt sånt. För att verkligen köra den här appen, om jag trycker på en av dessa knappar som spelar metod sparken, så det betyder att jag bara satt knappen för att vara en X, så nu denna knapp kommer att vara en O, och så vidare, och så det är hur vi börjar interagera med denna enda sida app. Vi kommer att lägga in koden, så känn dig fri att granska det, men låt oss nu tala om några program som är mer än bara en sida. Lika spännande som Tic Tac Toe var en hel del apps inuti iOS är typ av dessa borr ner saker med flera skärmar. Det första konceptet som vi behöver prata om är protokoll, och ett protokoll är helt enkelt en uppsättning metoder att du kan lova att definiera. Om jag skapa denna nya protokollet med 2 metoder, det första, Om returtyp är ogiltig, kallade jag det foo. Det tar inga argument. Jag har en annan metod. Den returnerar en int. Jag kallade det bar, och det tar ett argument. Allt detta protokoll är att kallas SomeProtocol här uppe, Detta är en uppsättning saker som någon kan genomföra. Jag har inte inuti detta protokoll sagt vad foo gör. Istället, jag säger bara att du kan definiera foo om du vill. Om jag skapar en vy styrenhet eller skapa en klass Jag kan insidan av den klassen löfte att genomföra några av dessa metoder, så till exempel, om säga Detta säger nu jag gör ett löfte till dig som insidan detta View Controller klass I kommer att ha definitioner för både foo och bar. Varför är det bra? Många komponenter inuti iOS dra nytta av detta designmönster som kallas delegering och vad delegationen säger är det till exempel om jag har en textruta och det finns några händelser som kan registreras insidan av min textrutan snarare än att skapa separata händelser vad jag kan göra är att jag kan säga delegaten av denna textruta blir några objekt. När jag säger att detta är en delegat nu som innebär att när någon händelse skulle ha fått sparken i textrutan snarare än att behöva registrera den eller nåt sånt det bara att anropa en metod på delegaten. Till exempel insidan av min textruta har jag en metod för när jag trycker som gjort knappen i det nedre högra, och så snarare än att registrera händelsehanterare vad jag kan säga är textrutan här är ett objekt som jag vill att du ska anropa en metod på Varje gång någon trycker på knappen Klar, och det betyder att objektet måste genomföra några protokoll som säger att jag lovar att definiera det gjort Knapp Åtgärd, för om det inte definieras denna metod och du trycker på Klar, då det kommer att vara förvirrande. Låt oss ta en titt på ett exempel. Här har jag bara en textruta, och en av egenskaperna hos den här textrutan över här på höger sida är delegaten. Detta är en egenskap av klassen. Vad jag gjorde här är jag kontrollerar klickade, och jag drog från denna plats hit till View Controller och som säger nu är utsedd av textrutan kommer att bli View Controller. Det betyder att när vissa åtgärder inträffar, snarare än att registrera separata händelsehanterare Jag vill att du ska skicka dem till delegaten. Nu ska vi ta en titt på min åsikt styrenheten. Inuti. H. filen jag har gjort ett löfte. Jag har lovat att genomföra några metoder inuti detta protokoll kallas UITextFieldDelegate, och igen, Detta är bara några lista över några saker som jag kan välja att genomföra. Om jag kommer hit i min. M. fil, har jag genomfört en sådan metod. Jag har kallat det textFieldShouldReturn eftersom det är vad det hette insidan av protokollet. Och nu när jag trycker på knappen Klar insidan av den textfältet Detta är vad som kommer att bli synad, så jag inte registrera en händelsehanterare. Jag är ansluten delegaten, och när denna händelse sparken Detta är den metod som kommer att få kallas så om jag kommer hit till min storyboard och köra det, Även om det är laddar vi kan se vad det gör. På min skärm har jag 2 saker. Jag har den här textfältet, och jag har denna etikett. Jag säger bara jag vill texten i denna etikett att vara lika med vad användaren har skrivit in inuti textfältet. Denna nästa rad här är helt enkelt en metod som jag ringer i textfältet som säger att jag vill att du ska dölja tangentbordet. Detta är bara godtyckligt sätt som Apple har valt. Igen, innan jag gjorde något jag var tvungen att koppla upp allt, så jag först kom hit. Från View Controller jag dra över till textrutan. Jag släpper, och jag kan se här att jag kan göra detta egenskapen textfältet eftersom mer än här i View Controller har jag definierat en fastighet som är en IBOutlet i ett textfält. Det säger att jag kan koppla den här egenskapen upp till ett textfält i min UI. Nu när jag klickar på Jag kan börja skriva. Nu om jag klickar på knappen Klar detta kommer att avfyra en händelse som jag nu kan svara på. Inga händelsehanterare. Det är så jag bara svarat på den knappen Klar. Vettigt? Detta är inte en design mönster som-du aldrig kan hitta dig själv att skapa en egen protokollet, men bara vet att vissa olika iOS-komponenter registrera händelser på olika sätt. Knappar, till exempel använda dessa IBActions. Textfält, å andra sidan, kommer att använda delegater. Vi kan se och du kan se allt detta upp insidan av dokumentationen. Förresten, det finns faktiskt massor av UI saker inbyggt i iOS för dig, så till exempel, hur jag gjorde det säga gjort längst ner till höger är Jag valde detta textfält. Jag kom hit. Jag rullas ner lite tillbaka nyckel, och jag kan faktiskt göra detta till en hel massa saker, som om jag vill det vill säga nödsamtal utan jag kan göra det, vilket är helt slumpmässigt, och jag vet inte varför det finns en inbyggd nödsamtal knappen men, säger nödsamtal i riktigt små bokstäver. Där du går. Definitivt utforska alla dessa olika alternativ i iOS. Eventuella frågor om delegater? Återigen, bara en intressant design mönster som du bör vara medveten om. Okej, låt oss nästa ta en titt på bord vyer. En tabell uppfattning är i princip att lista över objekt som är överallt i iOS. När du bläddrar igenom alla dina kontakter, du tittar på inställningen sidan och den typen av lista över saker kallas tabellvy. Implementera en tabellvy i iOS är ganska enkel. Istället för att göra en klass som härstammar från det UIViewController som vi har gjort innan vi helt enkelt måste säga snarare än allt en UIViewController inte jag vill göra, Jag säger allt en UITableViewController inte jag vill göra, så att bara lägger några ytterligare saker som är helt gjort för oss. Vi måste göra mycket lite för att i princip fylla i tomrummet inuti tabellen. För att visa en tabell måste jag svara på några frågor. Den första frågan jag behöver besvara är hur många avsnitt är i tabellen? När du bläddrar igenom dina kontakter app du kommer att märka att det är typ av organiseras av As, då har du B, och du har den lilla sub rubrik. Vardera av dessa kallas ett avsnitt. Du kanske eller kanske inte behöver dessa. Det första du behöver göra är att implementera en metod heter Tableview: numberOfSectionsInTableView. Som returnerar helt enkelt hur många avsnitt du har, så detta kunde säga returnera en om du har en stor tabell vy. Nästa fråga som iOS behöver veta är hur många rader har du? Till exempel, du bläddra igenom en tabell vy. Du har ett fast antal låtar du tittar på eller ett fast antal kontakter. Om du är mig naturligtvis inte så många, och så det är hur iOS vet hur många celler som ska visas. Återigen kan detta säga något i stil tillbaka 3. Min tabellvyn har 3 rader. Slutligen måste iOS veta vad varje cell ser ut, så vad det faktiskt kommer att göra är att anropa den här metoden här nere, denna Tableview: cellForRowAtIndexPath. Det kommer att kalla denna metod på varje enskild cell inne i tabellen. Hur vet den hur många gånger att kalla det? Tja, sa ju att det inne i antalet rader i avsnittet. Vi kommer att kalla detta för alla våra celler, och insidan av detta är där du faktiskt kan göra saker som ställa texten eller berätta vad den lilla blå knappen på höger sida gör. Mönstret för att få dessa celler, kommer vi att använda denna metod kallas dequeueReusableCellWithIdentifier. Objective-C är faktiskt mycket väl känd för löjliga längden av deras metod namn, och detta är verkligen en trevlig typexempel exempel. Vad denna metod gör är det bara säger att jag vill att du ska ge mig en cell. Bara en iOS sak. Om du har något som 100.000 låtar på din iPod Vad iOS inte vill göra är att fördela 100.000 celler, för om du är på toppen av listan, behöver du verkligen att allokera minne för cellen som är 99.000 rader ner? Nej, för som du bläddrar du typ av fördela när du går längs. Detta är gjort för dig. Du behöver inte oroa dig för allt det dumma prestanda grejer. Allt du säger är att du anropar den här metoden dequeueReusableCellWithIdentifier, och detta säger, okej, om du behöver jag ska skapa en ny cell för dig. Men om du är i botten av tabellen och du har redan tilldelats vissa celler högst upp i tabellen som du verkligen inte kommer att behöva något snart Jag ska ge er ett av de tillbaka i stället för att fördela en ny, och så detta är en trevlig prestanda oro. Du behöver inte tilldela cellerna själv. Det kommer att ge dig tillbaka en cell. Det kommer att gå tillbaka till en cell objekt. När du har cellen objekt du kan göra saker på det. Du kan ställa in texten i cellen med denna egenskap kallas textetikett. Du kan lägga till att pilen till höger eller någon annan random stuff med denna andra egenskap som kallas accessoryType, och så vidare och så vidare. Låt oss ta en titt på faktiskt genomföra en tabellvy nu. När jag skapade detta projekt istället för att säga samma vy ansökan kom jag faktiskt hit till master-detalj ansökan och så i princip motsvarar detta programmet E-post på iPad med tabellen syn på vänster och sedan innehållet till höger. På iPod eller iPhone detta kommer att motsvara en enda tabell vy. Det är där jag fick mina starter kod. Låt oss först ta en titt på storyboard. Allt detta skedde för mig, i princip skapas. Denna navigeringsfältet visade mig vad ett exempel cell skulle kunna se ut, och jag kan dubbelklicka på det, ändra titeln. Alla andra UI problem jag kan hantera det. Rubriken filen ser väldigt enkelt. I stället för att säga detta är UIViewController vi nu säger att detta är en TableViewController, så vi vet att vi vill kalla alla dessa bord metoder. Nästa Jag vill skapa en egenskap som kommer att representera saker inuti mitt bord. Denna tabell kommer att godtyckligt visa En förteckning över frukt, så jag måste skapa lite array där jag kan sätta frukt. Insidan av min genomförandet fil det första jag vill göra är jag vill se till att jag initiera arrayen. Jag sa Alloc init, skapade min frukt array, och jag lägger 4 saker till den, varav en är mycket mer kontroversiellt än de andra 3. Och nu har jag en rad storlek 4. Vi skakar det i CS50. Jag har nu en rad storlek 4. Nu ska jag börja svara på dessa frågor, och faktiskt, När jag skapade denna app allt detta redan gjort för mig. Jag behövde inte skriva ut antalet sektioner i tabellvyn. Det var redan där, och jag fyller i tomrummen. Hur många avsnitt har jag? En. Allt klart. Hur många rader har jag? Tja, jag har en rad för varje frukt, så detta räknas är en egenskap hos en array som säger hur stort är det? Det är hur många rader jag har. Slutligen måste jag säga vad varje cell ut? Jag ska säga dequeueReusableCellWithIdentifier. Återigen, detta redan skrivit för mig. Jag behövde inte göra detta själv, och jag vill komma tillbaka denna cell på den här platsen. Kom ihåg att vi kallar samma metod på varje enskild cell, och detta argument här, här indexPath argument säger vad rad jag i. Om jag säger indexPath.row här nere detta kommer att vara 0, då kommer det att vara 1, då kommer det att vara 2, och det är så jag vet vilken cell jag för närvarande är visning. Jag vill ställa texten i cellen använder denna textLabel fastighet att gå i min frukt array och få objektet som motsvarar varje rad. Om detta är en sträng, jag sätta nu egenskapen text till en sträng. Jag kan göra en annan sak. Jag kan också registrera en händelsehanterare på varje cellerna, så när jag trycker alla dessa celler Detta didSelectRowAtIndexPath, detta kommer att kallas för mig, så enkelt genom att definiera det jag kan nu hantera vad som händer När du trycker på en cell, och igen, vi passerar i vilken cell tappades så att vi kan återanvända samma händelsehanterare för alla våra celler. Återigen, detta är något som iOS gör för mig. Låt oss visa en annan irriterande popup som säger helt enkelt att du valde något där att något kommer att bli raden objektet. När jag kör detta, jag kommer att ha denna fina tabellvyn med en rad för varje av dessa frukt, och om jag trycker en det säger mig vad som hände. Vettigt? Låt oss bygga lite mer komplex av en app, så mycket som att klicka du valde tomat är. Den trevliga delen om storyboarding är det inte bara kommer att hjälpa oss att utforma skärmar individuellt, det kommer också att hjälpa oss att knyta samman hela vårt app, så att den slutliga applikationen kommer vi att bygga är denna fina sport nyhetsläsare, och så det kommer att ha flera skärmar, så jag kan faktiskt representera var och en av dessa multipla skärmar på storyboard, och jag kan zooma ut och se min app från en hög nivå. För att skapa ett nytt element insidan av min storyboard Det är verkligen enkelt inuti Interface Builder. Om jag vill lägga en annan skärm till detta, till exempel, Jag kan först zooma ut med nypa zoom som Apple älskar så mycket, och här nere innan jag söka efter en knapp och jag drar och släpper en knapp Om jag vill skapa en ny skärm kan jag faktiskt bara dra och släppa en hel View Controller, så om jag väljer det, dra det över här, hej, det finns en annan skärm, och så nu använder samma storyboard fil Jag kan ha alla skärmar insidan av min app, och jag kan zooma ut och se hur de samverkar. Dessa kommer inte interagerar ännu. Det sätt på vilket dessa 2 skärmar interagerar är du definiera relationer. Du kan i princip säga här skärmen när du trycker på den här knappen, Jag vill att du glida över till denna nya skärm. Det innebär att det finns denna typ av relation mellan  den första skärmen och den andra skärmen. Du har i grunden en pil från den knappen till den andra skärmen säger att när du trycker på den här knappen som är där jag vill gå. Precis som vi kontrollerar klickas och dras för att definiera dessa försäljningsställen vi ska göra samma sak att definiera dessa segues. Vi får se ett exempel på det, och innan vi faktiskt övergången från en skärm till en annan iOS är tillräckligt bra för att anropa den här metoden called prepareForSegue, och det är där vi kan börja skicka data från en applikation till en annan. I exemplet vi ska titta på det kommer i princip att vi att filtrera baseball team av ligor och divisioner. När jag väljer en liga, till exempel, vill jag övergången till min nästa skärm där jag kan visa alla divisioner i den liga eller alla de olika teamen. Jag måste skicka till den skärm vilka lag du ska visa. För att göra det jag ska dra nytta av denna metod här. Slutligen, bara en slumpmässig punkt på iOS. Om du vill lagra data finns denna sak kallad grundläggande uppgifter, vilket är faktiskt ganska komplicerat att arbeta med. Du kan också använda SQL för att lagra data, som, återigen, är trevligt men typ av på mer komplicerade sidan att arbeta med, men iOS stöder också dessa riktigt coola saker som kallas egendom listor, och en fastighet lista är bara en fil som representerar viktiga värdepar. Du definierar en lista med nycklar, och du säger här knappen kommer att bli en array. Denna knapp kommer att vara en sträng, och i princip allt du kan göra i JSON kan du göra inne i en fastighet lista, och så detta verkligen snyggt tillåter oss att arbeta med vissa uppgifter. Till exempel har jag här Teams.plist som jag skapat. Jag skapade en ny plist-filen, och jag kan borra ner. Detta är en ordbok, är detta en ordbok, dessa strängar, och så detta är en trevlig grafisk representation av en JSON dokument eller bara en rad viktiga värdepar, och så detta är de uppgifter som jag kommer att arbeta med insidan av min app. Låt oss först komma hit. Vi har mycket mer filer nu. Men låt oss först komma hit till storyboard. Storyboard här-om jag kan zooma ut- Vi kan nu se att detta är flödet av min app. Jag först gå att starta på den här skärmen. Jag kommer att borra ner till den här skärmen, och jag ska borra ner till den här skärmen och vi kan se här att om jag typ av flytta en av dem runt vi har dessa pilar går härifrån till hit, och hur jag definierar att pilen var om jag zooma in lite, och om jag kommer över detta synsätt controller, och här är en cell, och jag vill säga att när du trycker på en cell Jag vill att du glida över till en annan skärm. Jag kan helt enkelt hålla ner kontroll, rulla över lite, håller du ned Ctrl drar denna cell över och låt gå. Och här vi säger vad som är övergången som du vill använda? Vill du använda den bilden sak som kallas tryck? Vill du att glida upp från botten? Det kallas modal. Och när jag klickar på en av dessa, kommer det att dra denna pil för mig, och det betyder att jag faktiskt har hanterat vad som händer när jag trycker på den här knappen grafiskt. Jag har inte skriva någon kod att faktiskt glida från en skärm till nästa. Jag definierade det visuellt insidan av Interface Builder. Om jag klickar på denna pil, kan vi se att jag gav den här grejen ett namn. Jag kallade det showDivisions, och det är så att jag kan känna vilken övergång är på väg att inträffa, och vi får se varför bara en sekund. Det är så jag har trådbunden upp de olika skärmarna i min app. Om detta var en knapp, till exempel, snarare än en tabell vy, Jag kunde kontrollera klicka på knappen, dra över till nästa skärm, och det är hur jag kan göra navigeringen på det sättet. Riktigt snabbt, om vi kommer in i MasterViewController, igen, vi kommer helt enkelt att definiera en lista över saker som kommer att visas i tabellen vyn. Här jag säger att jag vill att du ska ta den plist-filen, och jag vill att du ska ladda upp den i en ordbok, och när du har den ordlista kommer jag att svara på samma frågor igen. Här är antalet sektioner. En, det finns en rad för varje liga, och texten i varje cell bör vara antingen den första, den första ligan, den andra ligan, och så vidare. Slutligen kommer jag att använda denna metod som vi bara såg called prepareForSegue, och detta är den metod som kommer att få sparken när jag klickar på en av dessa rader, och därför aktiverar denna övergång som jag satt upp med pilarna. Detta säger att jag kan ha flera relationer från en skärm till en annan. Om jag har 2 knappar och varje knapp tar dig till en annan skärm Jag kommer att ha 2 segues, 1 för varje knapp. Men detta är prepareForSegue, återigen, kommer att återanvändas för var och en av de olika relationer innebär så att jag behöver ett sätt identifiera om du trycker på första knappen eller om du trycker på den andra knappen. Kommer du ihåg när jag gav det Segue ett namn, detta showDivisions, det är hur jag vet nu att detta är Segue som aktiverades. Allt jag vill göra är att jag vill säga Jag vill ta reda på vad jag just hit, och så att få det, kan jag säga att jag vill ha indexPath för den valda raden, minns indexPath säger precis där jag bara klickade, och då vill jag säga att jag vill räkna ut var jag ska. Denna destinationViewController, det är en egenskap hos Segue. Det är skärmen jag ska, så jag vet att skärmen jag ska kallas DivisionsViewController eftersom jag skapade den klassen, och så nu om jag säger d.divisions Jag är nu sätta en egenskap hos View Controller jag är på väg att gå till. Detta är hur jag skickar data från en skärm till en annan skärm. Bara tittar på detta DivisionsViewController ni kan se här att i. h. filen Det är att egendom divisioner, och det är vad jag i grund och botten är fylla, så det är hur jag vet att jag visar divisionerna motsvarar ligan som jag klickade, och igen, den faktiska tabellvyn ser ganska mycket samma, bara svara dem 3 enkla frågor samt att identifiera vad som händer när du flyttar till nästa skärm. Bara ett par andra saker här. Du märker upptill här som istället för att säga # include Jag säger nu # importera. Detta är bara ett Objective-C sak. Importen är i grunden en trevligare version av inkluderar, och till exempel, behöver vi veta vad denna klass är, så jag kan inte bara säga DivisionsViewController. Om vi ​​inte hashtag standardio.c inne i vår. C. fil kompilatorn hade ingen aning om vad printf var. Likaså om jag inte importerar inte DivisionsViewController kompilatorn har verkligen ingen aning om vad en DivisionsViewController är. Bara se till att insidan av dina olika. M-filer du ser att importera motsvarande. h-filer så att kompilatorn vet vad som händer. Slutligen vad Apple slutligen inte visar är vissa uppgifter med hjälp av en webb vy, och så en webb vy är ett objekt som du kan bädda en liten webbläsare insidan av din app. Allt du behöver göra är att ange en URL till din webbläsare, så jag vill gå till mlb.mlb.com, och det är hur jag kan komma åt hemsidan för varje lag, och så genom att i denna URL på webben vy kan visa detta för mig, och jag kan bläddra runt, och simulator används av den. Nu kom från min plist. Om jag klickar på detta kom också från min plist, och denna glidning hanterades genom att definiera dessa segues. Jag klickar på och en mer, och nu här är min UIWebView, så bara sådär här är hemsidan för den webbadress som jag just inbäddade, och jag behövde inte hantera allt galet. Det är hur du visar en webbsida. Saker som detta bakåtknappen här ges också till mig helt gratis eftersom jag har definierat dessa relationer med segues. Några frågor? Ja. [Student] Så när du använder Alloc har du aldrig fri något? Exakt, när du ringer Alloc och init du inte att befria den. IOS kommer att hantera allt detta för dig. Det är underbart, och du inte bryta några regler. Ja. [Student] Om du skulle omfatta fler grupper som skulle kunna passa på skärmen, skulle det ha automatiskt en bokrulle alternativ, eller är det något du behöver lägga till? Exakt, om jag hade fler lag, till exempel, skulle det klara automatiskt rullningen för mig, och alla de problem prestanda med den enorma tabellen hanteras också helt för mig. Övriga frågor? Allt denna kod kommer att publiceras. Vi slags slätade över lite av de mer mindre detaljer, men saker som att ställa vissa egenskaper på webben vyn är bara saker som du kan få genom att bläddra Apples dokumentation, vilket är riktigt, riktigt snyggt ut. De har en hel del prov apps och exempel seder olika API: er, så definitivt ta del dem om du kan. Bara några användbara länkar som du kanske vill ta en titt på. Dessa är några användbara dokumentation guider. De webbadresser är massiv, så de är kortare. Denna första är hela biblioteket av dokumentation. Det finns lite sökning barer, så om du börjar skriva knapp det börjar ge dig all information om alla de saker du kan göra med en knapp. Jag har även tabellen Guide Visa programmering. Den hanterar tabellen åsikter i mer detalj, hur man gör saker som dynamiskt lägga till celler eller redigera celler eller ta bort dem. Det finns massor av prov program från Apple som visar dig hur man gör det, och slutligen, är denna sista det mänskliga gränssnittet riktlinjerna och detta är i grunden en diskussion av UI-komponenter, saker som inte gör en knapp som är 4 pixlar med 4 pixlar. Det är en dålig idé, och andra saker som Apple vill att du ska göra att främja bra utformning. Några sista frågor innan vi avslutar upp? Okej, definitivt gärna-Vi kommer att ha speciella etiketter på Diskutera. Vi kommer att ha en iOS en, så definitivt gärna utnyttja det. Om du vill arbeta med dina klasskamrater i projekt eller hjälpa räkna ut vissa slumpmässiga iOS prylar gärna kontakta mig, och definitivt granska all kod på nätet eftersom bara av intresse för tiden vi typ av slätade över de mer finkornigare uppgifter om saker. Men om inte, så lycka till på din iOS-projekt, och jag hoppas att vi har en stor tillströmning av program i App Store. [CS50.TV]