[Powered by Google Translate] [Seminari] [iOS: Escriptura d'aplicacions Like a Boss] [Tommy MacWilliam] [Harvard University] [Aquesta és CS50.] [CS50.TV] Molt bé, tots, benvinguts a iOS: Escriptura d'aplicacions com un cap. Aquest seminari se centrarà en l'escriptura d'aplicacions per l'iPhone i alhora escriure aplicacions per l'iPad, i pel que estem bàsicament va a caminar a través de un parell d'exemples diferents de com fer una aplicació, un joc tan simple com Tic Tac Toe, o si vostè està més interessat en fer una aplicació com una mena de lector de notícies o alguna cosa que interactua amb l'Internet parlaré d'això també. Aquí està la nostra agenda breu. Aplicacions IOS estan escrits en un llenguatge anomenat Objective-C, pel que aquest és una mica similar a C, però en realitat no en tots, pel que anem a parlar una mica sobre el llenguatge en si mateix i després com construir aplicacions per l'iPhone usant aquest programa aplicació anomenada XCode, que si no ho has descarregat encara no dubti a iniciar la descàrrega ara mateix. És diversos gigabytes. Ha d'estar lliure en l'App Store, així que vostè haurà de tenir un Mac idealment executant l'última versió d'OS X. Si no és així, cap problema. Comptem amb equips Mac al centre de la ciència disponible per al seu ús amb XCode instal · lat, de manera que no dubti en utilitzar els de desenvolupament. Si vols fer una aplicació, però no tenen una Mac, no et preocupis. Hi ha un munt de recursos del campus per això. I llavors anem a cobrir dos grans exemples d'aplicacions diferents que vostè pot fer. Objective-C és tècnicament el que es diu un superconjunt de C. Això vol dir que qualsevol codi C és també vàlid Objective-C codi. Això vol dir que tipus de conducte fes en algunes característiques addicionals a C. Algunes d'aquestes característiques inclouen no haver d'escriure sempre malloc nou, gràcies a Déu, sense haver de preocupar sobre els punters estúpides i alliberar-los i tot això que odiava de C, i és una mena de passat en Objective-C. Ara, Objective-C també té una biblioteca estàndard molt més gran, de manera que hi ha molta més funcionalitat que et passa per dins lliures de Objective-C. Recordes quan estàvem escrivint PHP ens vam adonar que hem passat de aquest petit llenguatge per a la biblioteca gegant de totes aquestes coses boges que pot fer. El mateix succeeix en iOS. Hi ha objectes per coses com el calendari budista, i res realment que possiblement pot pensar probablement ja existeix en l'aplicació de Objective-C. La part objectiva de Objective-C fa referència a alguna cosa anomenat Programació orientada a objectes. Això és una mica d'un concepte nou, però en realitat hem après en la seva majoria molts d'aquests conceptes ja. La idea darrere de Programació orientada a objectes és que vostè va a estructurar una gran part del seu codi entorn d'aquestes coses anomenades classes, i aquestes classes són realment glorificat estructures. A l'interior d'una estructura que bàsicament diu aquí és una cosa, i això pot tenir membres. Per exemple, un node en una llista enllaçada podria tenir altres coses com un valor, un punter al següent node a la llista, i junts aquest punter i el valor que compon aquesta instància d'una estructura. Les classes són molt similars, excepte classes també poden tenir funcions dins d'ells. Quan declarem una estructura, només podríem dir int n o * següent node. Ara amb Objective-C es pot posar realment les funcions dins d'aquestes coses. Una altra cosa que pots fer és classes poden heretar d'altres classes de dades. Per exemple, estarem buscant en un munt de classes incorporades de Objective-C. Una d'elles podria ser la classe que representa la visió d'una pantalla, i així, dient que vull aplicar el meu propi punt de vista que bàsicament diu a algú a Apple, la gent probablement molt agradable, escriure aquesta classe per a mi, i maneja les coses com mostrar botons o la prestació de la pantalla, i que seria molt dolorosa aplicar tota la funcionalitat que nosaltres mateixos, i així simplement heretant dades podem dir tot el que vas fer en aquesta classe Jo també vull dins de la meva classe, i després em vaig a fer algunes altres coses, és a dir, implementar una aplicació. Això és el que significa la paraula herència. Anem a veure un exemple més concret. I, finalment, la clau de programació orientada a objectes és que que condueix a la encapsulació de dades. En alguns dels nostres butlletins de problemes que podríem tenir aquestes grans variables globals, i globals a tot arreu, i així és com ens agradaria portar un registre d'estat. Amb les classes podem començar encapsular informació dins d'un objecte. Si tenim una pantalla en la nostra aplicació, que en realitat no necessita tenir cap dada de altra pantalla a l'interior de la nostra aplicació que, pel que al encapsular les coses dins de les classes d'aquesta realitat condueix per disseny de codi molt millor, i això és possible amb algunes de les característiques addicionals de Objective-C. Avís previ, la sintaxi per Objective-C és el banano. Això s'assembla a res que hàgim vist abans, pel que és una mica d'una corba d'aprenentatge per acostumar Què diables vol dir això? Però una vegada que passes aquesta corba d'aprenentatge inicial és molt, molt suau per començar a escriure aplicacions. Per declarar una classe, per no dir aquesta és la meva classe, existeix, i potser aquí hi ha algunes coses que vaig a definir més endavant, Vaig a dir @ interface. Vaig a dir @ interface. Vaig a donar la meva classe un nom. I més tard en un altre lloc vaig a dir @ end, i tot enmig de la interfície i l'extrem @ @ serà la meva classe. Això serà el que hi ha dins dels nostres arxius. H. Igual que en C els arxius. H bàsicament va dir aquí hi ha algunes coses que existiran. No estic dient necessàriament el que fan, però, el compilador necessita saber que ells existeixen. Més tard, a l'interior de la nostra. Arxius m-m perquè per Objective-C és on estem en realitat definirà el que aquestes classes ho fan. Igual que els nostres arxius. C, proporcionem una implementació per les funcions. Dins de la nostra. M fitxer que anem a dir aquí és el que totes les funcions dins de la meva classe-el que tots fan. I, finalment, a l'interior d'una estructura que podríem dir dins de les claus int, n o node següent * i en Objective-C que utilitzarem la paraula clau @ property, i això és el que definirà les propietats, o les funcions no-que són una part de les meves classes. Trucar a funcions en Objective-C és també plàtans. Quan declarem funcions en C que deia alguna cosa així com int foo i obert parin i després li va donar una llista d'arguments. Això és el que declara els mètodes o funcions es veu com en Objective-C. Si vull declarar una funció o un mètode on jo estic dient mètode és en realitat una funció que és un membre d'una classe, tan amable de intercanviables, però no realment, tan dins del meu mètode que voleu crear un nou mètode. Es tornarà cap valor, així que serà de tipus void. Aquest és el tipus de retorn de la meva funció. Ara tenim parèntesi aquí perquè-no ho sé. A continuació serà el nom del meu funció, i, finalment, tenim un punt i coma igual que vam tenir en C. El que és nou aquí és que aquest tipus aquí. Aquest guió és realment necessari, i és el que aquest diu que Aquest mètode ha de ser cridat aquí a una instància d'una classe. Després declarem nostres estructures és probable que deia alguna cosa així com n struct node, i que en realitat va crear o instàncies d'una d'aquestes estructures per tal que jo podia començar a treballar amb el que hi ha dins d'ella, de manera que aquest guió significa que hem de instància de la classe de la mateixa manera que nosaltres instància que struct abans de poder trucar a aquest mètode en ell. Si vull començar a afegir arguments als meus mètodes es torna encara més plàtans. Aquí està el meu nom de mètode. Llavors em vaig a tenir dos punts, i després d'això que diu aquí dos punts ve alguns arguments. Aquest mètode pren un argument. El tipus del seu argument és un enter, i el nom d'aquest argument o la variable que vaig a començar a utilitzar dins del mètode es diu i. Un cop més, aquest és el mètode. Pren un argument. Si vols començar a afegir més arguments es posa més bananes en què tenim aquest còlon que diu aquí ve la meva llista d'arguments. Aquest primer argument és un nombre enter. Ara bé, aquest segon argument és interessant. La variable que vaig a utilitzar dins del meu funció es diu f, tan dins del meu funció que podria dir f + = 1 o alguna cosa així. Aquesta cosa aquí és, bàsicament, una clau perquè l'argument o paràmetre. Igual que hem tingut parells de clau-valor i una mica com JSON o arrays associatius Objective-C va prendre la decisió de dir, bé, només perquè sigui realment transparent quan es crida a un mètode que tots aquests paràmetres són De fet vaig a anomenar-los tots. Quan es crida a un mètode, que realment dirà andFloat, i llavors et passarà polz Curiosament, aquest no s'anomena, però són tots dels altres paràmetres, pel que si teníem un argument tercer que pogués dir andFloat i un altre flotador i així successivament. En trucar a aquests mètodes és de plàtans dels cursos, pel que si tinc un objecte, i es defineix un mètode anomenat foo, i vull dir-, en lloc de dir foo obrir / tancar parèntesi Vaig a obrir un suport. Aquest és el nom del meu mètode. Vaig a tancar el suport, i aquest és l'objecte, sóc a engegar. Recordeu, tots aquests mètodes existeixen dins de les classes ja que les classes poden tenir mètodes definits dins d'ells. Aquí he arbitràriament creat un objecte d'una classe, i aquesta és la sintaxi per fer-ho. Hi ha dos passos per crear un objecte. El primer pas és dir que vol assignar l'espai. Aquest és l'equivalent d'un malloc. No hem de dir malloc mai més. Ens va deixar la m, va fer Alloc, i substituir al c. Con M. Després d'alguna cosa Alloc que llavors hagi de inicialitzar. Bàsicament, quan es creen objectes potser voldreu tenir una mica de lògica que s'executa quan es crea, pel que pot passar en alguns valors per defecte o alguna cosa així, de manera que aquest mètode init és el que realment crea l'objecte. En primer lloc, assignar l'espai, tal com ho vam fer en C, i després inicialitzar, que pot o no pot fer molt. Llavors estem tornant aquesta cosa en un objecte o. Hi ha una estrella aquí perquè això és tècnicament un punter, però no et preocupis, els punters no són gran cosa en Objective-C més. Ara hem instància aquesta classe anomenada NSObject, i això és només una classe a l'atzar que Apple té. Hem instància això, i ara tinc una instància d'aquesta classe en aquest efecte o, el que significa que si es defineix aquests mètodes els podia dir així. De la mateixa manera, si volia trucar a un mètode amb un argument, de manera que aquest és el mètode de bar, que pren un argument, i aquí hi ha el baz: Mètode qux, de manera que això pren 2 arguments. Això s'anomena una funció d'aquest o d'objectes. Té sentit? La sintaxi ha de tenir sentit, però quin tipus de acostumar-se a ell. Bé, anem a parlar d'algunes coses que es construeixen en Objective-C que no necessàriament es van construir en C. En C que d'alguna manera havia de bregar amb aquestes cadenes com a matrius de caràcters estúpids, i es va posar molt molest. Objective-C té tots els construïts en per a nosaltres, i està construït en ús d'aquesta classe NSString anomenat. Quan vull crear un NSString tenim sintaxi més arcà. En comptes de dir "CS50", diem @ "CS50" i això és només la sintaxi per declarar cadenes en Objective-C. Això és molt fàcil d'oblidar, així que no ho facis. Ara, un cop que tinc això, això és una cadena, però noti no deixa de ser un objecte. Vaig dir NSString, el que significa que una instància de la classe anomenat NSString, que algú va escriure per a mi, i que era molt agradable sobre ell, i per això ara Puc començar a cridar als mètodes en ell. Si crido a la longitud d'aquest mètode s objecte que tornarà a mi la longitud de la cadena. Això és igual que strlen en C. Retorna 4. Així mateix, un altre mètode que pot ser que vulgui tenir en compte és aquesta characterAtIndex. Aquest és un mètode que diu en aquesta cadena es Vull que per obtenir el caràcter zero, de manera que aquest tornés a mi el caràcter c, i hi ha un munt més d'aquests mètodes que vostè pot buscar a Google amb molta facilitat. Documentació d'Apple és gran, i anem a fer una ullada a això en un moment. Els que són cadenes. També hem arrays de mida variable construït endins Recordi que en C quan declarem un arranjament que havíem de dir 5 elements, fi de la història. Quan vam arribar a JavaScript i PHP podríem començar fer les coses com l'addició d'elements o elements mòbils. Podem fer el mateix en Objective-C. En lloc de crear una matriu en la forma normal de C tenim de nou una altra classe anomenada NSMutableArray. També hi ha NSArray, i això va a encapsular bàsicament alguns matriu. Això ens diu que el primer que vull fer és que vull assignar espai per a una nova matriu, i després que s'assignin Llavors necessitem per inicialitzar. Un cop més, només cridar a aquests dos mètodes. Ara bé, això vol dir que dins d'aquest objecte un Tinc una matriu buida assegut allà. Si vull afegir alguna cosa a aquesta matriu, em pot trucar al mètode AddObject. Vull afegir un objecte a la matriu a, i vull afegir la cadena CS50. Si volgués eliminar el contrari, que puc dir que em vols eliminar l'objecte en primer lloc en la matriu o un objecte. Té sentit? Està bé, quin tipus d'acostumar a això claudàtors. Per cert, a l'interior d'una gran quantitat de biblioteques d'Apple veurà aquesta DR. El NS realment significa per al pas següent, que era una de les primeres empreses Steve Jobs, i aquí és on realment vaig començar a escriure un munt de codi com una mena de base per a Mac OS X i totes les altres coses, pel que aquest tipus de NS és aquest llegat agradable cridar a una de les empreses anteriors volta quan Apple estava començant. Està a tot arreu. Fem una ullada a un enfocament més holístic Objective-C exemple. Aquí estic dins XCode. Per arribar fins aquí, el primer que XCode descarregat de l'App Store, el va obrir, i després vaig pujar aquí a l'expedient, aquí a nou projecte, i després. Després de fer això tinc totes aquestes opcions del que vull crear, pel que anem a fer una ullada a aquestes opcions més endavant, però només per aquest exemple, perquè no estem realment tindrà una aplicació, però, Vaig venir aquí i em va dir eina de línia de comandes, i aquesta és una aplicació que podria córrer en la línia d'ordres igual que hem estat fugint de C. Així és com he creat aquest projecte, i per això ara que sóc aquí, així que anem a veure per primera vegada en aquest arxiu, i això hauria de ser bastant familiar. Tinc un nom int. Aquí està el meu amic argc, argv meu altre amic. I així podem veure que aquest és el punt de partida del meu primer Objective-C de l'aplicació. Aquí podem ignorar això per ara. Això és bàsicament una mica de matèria de gestió de memòria que es vol en realitat no mai ha de preocupar. Fem una ullada a aquest primer bloc aquí. Aquesta primera línia, si dic Estudiant * alice = [[Estudiant Alloc] init] què fa això? Aquest estudiant per primera vegada aquí, aquesta és probablement una classe. Això no és una classe que Apple va escriure, però és una classe que vaig escriure. El primer que vull fer és que vull assignar espai per a un nou estudiant, i després vull que l'iniciï, així que això em dóna l'esquena aquest objecte nou estudiant, i estic emmagatzemar això en una variable anomenada Alice. D'on va venir aquesta classe ve? Bé, aquí al costat esquerre són tots els arxius diferents a l'interior del meu projecte. Podem veure aquí tinc un Student.h i Student.m a. L'arxiu. H, recordi, és on jo declaro totes les coses que hi ha dins de la classe. Anem a fer una ullada a això. Molt bé, aquí tenim aquesta interfície @, i això diu que aquí ve les declaracions de tot el que existeix dins de la meva classe. Llavors tinc dos punts. Llavors tinc aquesta cosa NSObject. Això vol dir que dos punts bit d'herència que estàvem discutint una mica abans. Això ens diu tot el que un NSObject pot fer on NSObject és aquesta classe escrita per algú més, tot això es pot fer NSObject Vull ser capaç de fer això. En dir: NSObject que significa que, bàsicament, heretat tota la funcionalitat d'una altra classe. Això em va donar un munt de diferents mètodes i propietats que es poden utilitzar. Aquí sota estic creant dues propietats. Això vol dir que el meu estudiant, si es tractés d'una estructura, aquestes serien les 2 coses dins del meu estructura, de manera que cada estudiant té un nom que és una cadena, i l'estudiant també té un grau, que és un int. Finalment, aquí vaig a crear un mètode per a mi estudiant. Vaig trucar al meu mètode, initWithName, i es necessita un argument, i aquest argument és una cadena, i em va cridar de tot. Ara donem una ullada a la forma en què realment implementat aquesta classe. Aquí, ara estic dins del meu. Arxiu m, m per a la implementació, suposo. Tinc la meva aplicació, el meu cap, i aquí és on realment estic definint initWithName ho fa. Tinc initWithName, el nom del meu paràmetre, i llavors aquest és on en realitat estic creant un estudiant, pel que aquest és una mica críptic, però això és una mica repetitiu que voleu incloure en els seus constructors. Aquesta funció d'inicialització aquí, initWithName, és un tipus de constructor. Bàsicament, s'està construint un objecte nou estudiant i potser l'enviament d'algunes dades dins de la mateixa. El primer que vull fer és que vull cridar a init en aquesta cosa super. Recordeu que quan li vaig dir de nou aquí al expedient. H que tot el que un estudiant té una NSObject també ho ha fet. Així doncs, quan crec un estudiant que també ha de fer és assegureu-vos que el NSObject que estic heretant totes les dades de També s'ha inicialitzat correctament. Què he de dir és que aquest súper és en realitat farà referència a la classe pare que estic heretant de, així que vull assegurar-me que inicialitzar tot el que estic depenent d'abans de començar a tractar d'usar-lo. Després, si aquest inicialitzat correctament és com dir si malloc no va tornar nul llavors puc començar a configurar algunes propietats. En JavaScript i PHP havíem aquesta paraula clau es diu això, i això fa referència a la instància actual d'una classe. En Objective-C anomenem a això mateix. Quan dic self.name, que significa que l'objecte Acabo de crear quan vaig dir Alloc estudiant init, que em tornarà un objecte. Això vol dir que desitja establir el nom d'aquest objecte al que m'acaba de passar polz Igual que en C, tenim accés als membres d'aquest punt, així self.name diu el nom de l'objecte d'estudiant ara serà el que acaba de passar polz I així, per fi, puc tornar així que en realitat recuperar alguna cosa. Preguntes? Bé, de manera que aquest acte = super init, si vostè no entén totalment les coses herència no es preocupi. Només sé que si mai vols fer el teu propi mètode init només fer això, i vostè estarà llest per sortir. Si. >> [Estudiant] Què significa si mateix? Així doncs, quan malloc una cosa que sempre es comprova si era igual a null, i si era nul, llavors sortim. Aquesta és la mateixa cosa, perquè si això retorna null, llavors probablement serà culpa seg si comencem a tractar de manipular. Aquesta és la nostra classe estudiantil. Això vol dir que podem iniciar els nostres alumnes en una de dues maneres. Si dic Alloc estudiant init no estic fent servir aquest mètode que acabo d'escriure, i en comptes de puc dir alice.name, i ara em posaré aquest nom de propietat. De la mateixa manera, si vull utilitzar aquest mètode initWithName Simplement puc dir Alloc, a continuació, en lloc de dir init Vaig a trucar a aquest mètode que acabeu de crear, i ho vaig a passar a Bob. En aquest punt, aquest objecte Bob té un nom igual a Bob. Bé, aquí estic fent servir que NSMutableArray que vam veure anteriorment. Estic assignant space.Then Estic inicialitzar una nova matriu. Vaig a afegir dues coses a la mateixa. Aquesta matriu té ara objectes estudiantils. Tingueu en compte que enlloc he de dir que és un conjunt d'estudiants. He dit que és una matriu, i punt. Llavors puc posar el interior del que jo vull. Aquí tinc dos objectes. Finalment, tinc un altre objecte aquí, aquest TF. Aquí a TF.h bàsicament la mateixa cosa. Estic heretant de NSObject, i per cert, en crear classes de tot això és fet per tu, aquest tipus d'interfície repetitiu. Té una propietat dels estudiants. Tinc un parell de mètodes que aquí realment no fan molt, i pel que significa que després de crear aquest objecte TF Em pot trucar a aquest mètode de grau sobre el mateix d'aquesta manera. Teniu alguna pregunta respecte sintaxi de Objective-C abans de començar a passar a alguna cosa més coses interessants desenvolupament d'aplicacions? Està bé, així que anem a fer realitat una aplicació per l'iPhone. Les classes principals que vostè va a utilitzar dins de la seva aplicació per l'iPhone s'anomenen controladors de vista, i un controlador de vista representa bàsicament una sola pantalla dins de la seva aplicació, de manera que si estic en l'aplicació de música, per exemple, un controlador de vista podria representar la vista en què puc veure totes les cançons en el meu iPhone. Un altre controlador de vista podria ser quan faig clic a una cançó i començar a jugar o com m'estic aprofundint en els artistes. Cadascuna d'aquestes pantalles diferents pot ser representada com un controlador de vista diferent, i un controlador de vista és en realitat una classe que diu com funciona aquesta pantalla. Les coses a l'interior d'un controlador de vista, tindrem propietats, així que coses com un botó que serà una característica del nostre controlador de vista. També anem a disposar de mètodes, i aquestes són, bàsicament, els controladors d'esdeveniments. Aquest mètode diu que quan es prem aquest botó Vull fer alguna cosa, i finalment, de nou, utilitzarem aquesta paraula clau acte per accedir a la instància actual. Per construir interfícies en iOS és realment molt, molt fàcil. Tenen aquesta drag drop interfície agradable i va cridar Interface Builder, i els 2 conceptes bàsics que cablejar seu Objective-C a Interface Builder són IBOutlet i IBAction. Un IBOutlet simplement diu que si es declara una propietat que és un botó, i desitja connectar a alguna cosa en la interfície d'usuari actual, diràs que és una sortida. De la mateixa manera, si es vol representar un controlador d'esdeveniments llavors vostè va a dir que és una acció. Per cablejar en realitat aquesta representació gràfica i el seu codi és molt, molt simple. Per adjuntar un IBOutlet, tot el que has de fer és controlar clic, i anem a veure un exemple d'això molt ràpid. Vostè controla clic on diu View Controller. Vostè va a arrossegar a la interfície, o per contra, si voleu connectar un controlador d'esdeveniments que va a arrossegar des de la interfície en l'altra direcció. Fem una ullada a un exemple iOS realment simple. Crearem un nou projecte. Vaig a venir aquí a l'aplicació, i jo vaig a feu clic en Aplicació de vista simple. Vaig a fer clic a Següent. Vaig a donar el meu projecte un nom. Vaig a trucar Hola. Curiosament, Apple dóna per fet que crearà un producte de manera que vostè pot vendre i que poden guanyar diners. Aquí sota us diré que es tracta d'una aplicació per l'iPhone. Podeu crear una aplicació per l'iPad, o si voleu crear una d'aquestes aplicacions que suporta tant perifèrics que pot fer això també. Això és el que vostè vol que els seus marques de verificació perquè sembli. Vostè voleu utilitzar guions gràfics, que veurem més endavant, i que ha d'utilitzar el recompte de referències automàtica, que és una bona funció no implementada haver de dir malloc i lliure. Llevat que vulguis cridar malloc i lliure, em deixa seleccionada. Vaig a fer clic a Següent i, finalment, aquest em va a preguntar on vol guardar. Vaig a colpejar crear, i aquí anem. He creat un nou projecte. Per aquí a l'esquerra hi ha tots els arxius que hi ha dins del meu projecte, i noti que tinc un munt, i jo ni tan sols fer res. IOS és gran. Per exemple, aquí aquesta ViewController.h, això va a representar el meu controlador de vista en primer lloc, de manera que la primera pantalla dins del meu app. Ara sabem el que això està dient. Estem dient, sóc a aquest ViewController classe, i un ViewController fa tot el que fa un UIViewController, i això, de nou, és una classe que Apple va escriure que fa un munt de coses útils per a nosaltres agradaria mostrar la pantalla. Aquí és on realment pot començar a definir el que el meu controlador de vista fa, i resulta que jo realment no necessita res d'això. Això és codi repetitiu que Apple em dóna de forma gratuïta. Em feia falta aquesta primera línia, o no tinc una classe, perquè puguem desfer-nos d'això i lliurar d'això. Bé, aquesta és la meva pantalla en blanc. Ara farem clic en aquest MainStoryboard.storyboard, i aquí és on comença a posar-se interessant. Això representa la primera pantalla en el meu aplicació. Si voleu afegir un botó, en HTML que vaig haver de crear una etiqueta de botó. En Android has de crear una etiqueta de botó, però en iOS si només vénen aquí a la cantonada inferior dreta i si faig clic a aquesta tercera aquí on diu objectes, i que pot desplaçar-se cap avall, o puc iniciar la recerca de botó. I mira, un botó, així que si realment arrossegar i deixar anar és aquí, He afegit un botó per aquesta pantalla del meu app. Si vull canviar el text, pot fer doble clic, dir alguna cosa temptador com "Press em". Bé, ara si em quedo aquesta aplicació, de manera que compilar, de manera que per executar faig clic al botó de reproducció en la part superior esquerra, i aquí està la meva aplicació. Jo no he fet res, i em van donar un dolç mirar aplicació iPhone. Si vull aturar-lo, pot fer clic al botó de parada perquè és més divertit. Diguem que jo realment vull que passi alguna cosa en prémer aquest botó. Per fer això el que he de fer és el que necessito per crear un nou controlador d'esdeveniments o una acció. Això vol dir que he de crear algun mètode que jo vull ser anomenat quan es pressiona el botó, així que anem a crear un nou mètode. Jo estic dins d'ViewController.h. He de dir que hi ha un mètode. Necessito un guió primer, perquè vaig a estar trucant a això al controlador de vista. He de donar a aquest un tipus. El tipus d'aquest serà aquesta cosa IBAction que hem vist anteriorment. Es tracta d'un controlador d'esdeveniments, de manera que va a tornar un IBAction, i això és un indici per XCode dir que això és una cosa que vull connectar alguna cosa. Puc donar-li un nom, com a punt i coma buttonPressed,. Ara he declarat un nou mètode dins de la classe. Ho he dit mètode ha d'existir. Ara entrarem en ViewController.m, i diguem que el que aquest mètode pot fer. Si em poso a escriure, per exemple, (void) buttonPressed Avís XCode és realment agradable i completa automàticament per a mi. Això és realment meravellós. Noteu aquí que dins de l'arxiu. M També puc dir nul · la, i això és perquè IBAction no és realment un tipus. De fet, és hashtag definit en algun lloc que un buit, i de nou, això és només un suggeriment per XCode que diu Jo vull que això sigui un controlador d'esdeveniments, i veurem per què en tan sols un segon. Quan es prem aquest botó Vaig a fer alguna cosa molest vol mostrar una finestra emergent. Per a poder crear una nova instància d'aquesta classe anomenada UIAlertView, i aquesta és una classe que Apple va escriure que va a mostrar popups molestos. Anomenarem a aquesta alerta emergent, i tinc 2 passos, recorda, a la creació d'aquest objecte. El primer que cal fer és assignar l'espai. Vull un UIAlertView. Vull assignar espai. Aquest és el meu primer mètode. El meu mètode següent és que vull inicialitzar, i pel que tinc aquest mètode gran i llarga anomenada initWithTitle. Això és bàsicament el que va a controlar aquesta emergent diu. El títol de la meva finestra emergent es pot saludar. El missatge d'aquesta finestra emergent pot estar "Aquesta és iOS." El delegat, no sé què és això. Diguem que no és res. Ara el botó que apareixerà pot dir alguna cosa així com "És clar que ho és", i jo realment no vull cap altre botó, així que anem a esborrar això i tancar el parèntesi. Bé, he creat un extra. Aquí anem. Així és com puc crear una nova finestra emergent. Per mostrar la finestra emergent en realitat vull cridar al mètode xou. Per fer el que puc dir d'alerta i mostrar, i una altra, Autocomplete era súper agradable. Si em vaig oblidar del que era, si m'acaba d'escriure en s, Puc recórrer aquí per saber el que era, i es filtra molt bé. Ara he creat aquesta nova finestra emergent. Tornarem al que significa delegat després, i ara vull dir que estimo aquest mètode per ser acomiadat quan es pressiona el botó, així que vaig a tornar al meu storyboard, i vull fixar ara aquesta IBAction. El primer que vull fer és fer clic al botó. En prémer aquest botó, vull que passi alguna cosa. Jo no vaig a mantenir premuda la tecla Control. Vaig a fer clic i arrossegar amb el botó cap aquí on diu View Controller. Podem veure que bé s'encén. Si et deixo anar amb la meva ratolí ara tinc aquesta finestra per aquí on tinc algunes opcions. Un d'ells són els esdeveniments que es poden registrar. Aquests són tots els mètodes declarats jo en el meu arxiu com IBActions h. Així és com XCode sap el que ha d'aparèixer en aquesta llista poc, així que això és només un suggeriment. Si faig clic al botó pressionat, ara he registrat el controlador d'esdeveniments. En JavaScript vam dir que tinc una mica de codi que registra el controlador d'esdeveniments. En Objective-C és realment tan fàcil. Si em trobo de nou Ara en prémer el botó del meu controlador d'esdeveniments es va a acomiadar, i em vaig a posar aquesta emergent. Super, super simple allà. Si mai vols veure tots els esdeveniments que estan registrats en un component si faig clic en aquest botó i vinc aquí a la dreta primer que pots veure aquí el que puc fer coses com el tipus de botó, així que si vols un d'aquests jos o el botó de Afegir contacte o el que sigui. Per veure tots els esdeveniments que estan en aquest botó si jo vaig tot el camí fins aquí a la dreta podem veure aquí en els esdeveniments que tenen tots aquests esdeveniments. Em pot pressionar el botó, quan em va deixar anar el botó, quan faig doble toc o el que sigui, i el que m'acabo de registrar aquest esdeveniment és anomenat Touch Up Inside, i aquest diu que tan aviat com el meu dit surt el botó aquest esdeveniment va a foc, i això és exactament el que acaba de succeir. Aquest és el tipus d'esdeveniment de botó predeterminat pressionat. Qualsevol pregunta fins ara? Bé, així és com podem començar a cablejar les coses en el nostre codi en les coses dins la nostra interfície. Recordeu que el primer que havia de fer era trobar el codi, i després fins al cable d'interfície al codi, i aquí està la nostra primera aplicació. Bé, això va ser realment genial, i hem creat aquest botó. I si no ho fem vull haver de crear un munt de propietats representant aquests botons? Per exemple, en Tic Tac Toe Tinc 9 botons, i que seria super, super molest haver de arrossegar i deixar anar 9 vegades o si hagués de fer tres en ratlla amb 81 en lloc de 9 i vaig haver arrossegar i deixar anar 81 vegades, i això és coix. El que podem fer en el seu lloc és com un HTML quan teníem coses com identificadors i noms i podem buscar les coses per la seva ID, hi ha un concepte similar a iOS trucades etiquetes. Una etiqueta és simplement un identificador numèric únic per a un component. Si dic això té una etiqueta de 0, per exemple, si crec un botó i donar-li una etiqueta de 0, i veurem com fer això en un segon, si vol aconseguir que el botó que es pot dir simplement vull cridar la, viewWithTag mètode en l'objecte aquí la self.view, que representa la pantalla actual, per exemple. Si dic a aquest mètode viewWithTag, em vaig a estirar el botó amb l'etiqueta 0. Anem a fer una ullada a aquest edifici per Tic Tac Toe. En primer lloc, aquest és el meu storyboard. He creat aquests 10 botons d'interfície d'usuari. Tingueu en compte que són tots de la mateixa mida. Si faig clic a un d'aquests i torno per aquí en aquest costat dret veuràs d'ajustar el tipus de lletra aquí, així que vaig fer la font una mica més gran, però el que jo també vaig fer va ser establir aquesta etiqueta. Li vaig dir que això té una etiqueta d'1, i aquesta és la part superior esquerra. Ara bé, si faig clic en un altre botó, com aquest segon aquí, ara veuràs que el meu etiqueta és 2. Cada un d'aquests botons només té una etiqueta única, pel que aquesta tarda es com vaig a començar a interactuar amb la meva aplicació. Tot això està dins d'un controlador de vista, però això és el que tenim. Tenim 3 propietats aquí. El primer i l'últim es va a representar l'estat del meu taula. Bàsicament, aquest primer és una matriu que representa a la Xs i Os ho són. Aquest altre aquí ens diu a qui toca. Es donarà compte de que jo també tinc aquestes coses aquí. Abans, quan declarem propietats que els va donar un nom i un tipus. També se'ls pot donar alguna informació addicional aquí. La primera diu que no atòmica, i el que diu aquest és, bàsicament, una sola cosa cada vegada s'intenta accedir a aquesta variable alhora. Vostè podria fer aplicacions més complexes que són multi-fil, i així de nou en Scratch teníem diferents fils, i sprites diferents podrien estar fent coses diferents a la vegada. Si aquest no és el cas, la qual cosa no és res del que estarem mirant, si diem que no atòmica en realitat farà les coses una mica més ràpid. També tenim aquesta cosa anomenada assignació, fort o feble. Aquesta assignar només diu que es tracta d'un model estàndard. Això no és un objecte o un punter, perquè això és només un bool, així bool està integrat en Objective-C. Aquest diu que no es tracta de fer una mica de fantasia amb punters aquí. És un habitual escalador d'edat. Fort i feble, tan feble diu que en realitat Vull que això s'apunta a alguna cosa al controlador de vista. Jo no vaig a assignar init real o jo mateix. El constructor d'interfície, en executar l'aplicació, es va a manejar tot el que la inicialització. Si dic feble, que diu que algú més serà la creació d'aquest. Si dic fort, això diu que jo seré el que que està creant aquest objecte bord, i aquí tinc alguns altres mètodes aquí, per exemple, una acció per quan el botó es prem nou joc, una acció de quan qualsevol dels altres botons es pressionen, i etcètera. No entrarem en massa de la lògica de Tic Tac Toe, encara que és molt emocionant, però anem a fer una ullada a algunes de les coses que podem fer dins de iOS. Aquest mètode nou joc serà acomiadat cada vegada que premi el botó de nou joc. Per connectar fins que jo simplement venir al meu storyboard. He fet clic a nou joc. Si vinc aquí a la dreta puc veure que Toqueu a l'interior està connectat amb el mètode newGame. És per això que això serà acomiadat. El mètode newGame farà una mica de posada a punt. Va a dir que vull que esborrar l'estat de la junta. Aquest és un bon mètode de matrius mutables. Això dirà ara és el torn de X, i ara em vaig a prendre avantatge d'això viewWithTag. Sé que els meus botons tenen les etiquetes 1-9, i això és una cosa que arbitràriament escollit. Si voleu ajustar el text de cada botó que està buit perquè acabo de començar un nou joc i jo no vull Us X o quedar més del que puc fer això. Puc dir que desitja que la vista amb l'etiqueta, 1, 2, 3, 4 et cetera. Això farà que un botó diferent cada vegada. Aquí em vaig a fer fora UIButton. Igual que podríem fer fora INT carrosses i viceversa això diu que em vol fer fora un UIButton. Això vol dir que el tipus d'aquest serà un * UIButton perquè de punters, però no et preocupis, no és por mai més. Quan tinc aquest botó Vaig a trucar a un mètode en ell. Aquest mètode es diu setTitle forState, i així ho diu Vull configurar el text del botó a ser la cadena buida, i jo vull que sigui una cadena buida quan no està pressionat. Si estic fent servir aquest mètode, pot canviar el text del botó tan aviat com algú ho copeja, però volem dir quan el botó està allà assegut Vull que el text en blanc. Finalment, anem a iniciar el meu taula, i jo vaig a dir que tot està en 0, de manera que aquest els membres del consell immutable és una matriu mutable, el que significa que pot trucar al mètode AddObject i un interior 0 de ell. Això és el que passa quan es crea una nova partida. Fem una ullada a un altre. Aquest mètode aquí és la IBAction que serà pressionat cada vegada que un d'aquests quadrats es pressiona. Ara tenim una mica de lògica Tic Tac Toe aquí. Hem d'esbrinar qui li toca, i sobre la base que, o bé establir una X o una O, però ens adonem que estem reutilitzant el mateix controlador d'esdeveniments per a cada un d'aquests botons. Això vol dir que no tenen un mètode per al botó de dalt a l'esquerra, un mètode diferent per al botó de baix a la dreta, tot i que podria haver fet. Això no seria realment un bon disseny. El que estic fent aquí és que estic realment va a determinar el que l'etiqueta del botó que s'ha premut és. T'adones que aquest mètode de reproducció pren un argument. Es diu remitent, remitent i el que s'està remitent serà representar exactament el que es va prendre acció sobre. Si es pressiona un botó, aquest remitent serà que UIButton que realment pressionat, el que significa que aquesta UIButton té una etiqueta perquè he creat una etiqueta. Si vull arribar a l'etiqueta simplement puc dir Vull que l'etiqueta del remitent, i de nou, acabo de casted a una UIButton. M'he assabentat que el remitent serà un UIButton. No sempre ha de ser un UIButton. Podria, per exemple, registrar el mateix controlador d'esdeveniments  per a un per un botó, una per a un control lliscant. En aquest cas, sé que estan tots els botons, així que vaig a dir Jo vull que això sigui un botó, i llavors puc obtenir l'etiqueta, i de l'etiqueta que ara sé on sóc dins de la taula. Llavors només ha de fixar bé la X oa la O, pot voltejar alhora, comprovar que ha guanyat, etcètera. Teniu alguna pregunta respecte això fins ara? Bé, tot el codi que publiquen en línia-no vull entrar en massa de la lògica del dit del peu de Tic Tac, però ara es pot veure que realment tot el que estem fent és que estem recórrer aquest array, així que tenim un parell de bucles per aquí, i estem comparant per veure tenim un partit en totes les files, un partit en una columna o alguna cosa així. Per executar aquesta aplicació en realitat, si em toca en un dels botons que el mètode de joc va ser acomiadat, el que significa que acaba d'establir el botó per ser un X, de manera que ara aquest botó serà un O, i així successivament, i així és com estem començant a interactuar amb aquesta aplicació única pàgina. Anem a publicar el codi, així que si fóssiu lliure per llegir que, però ara anem a parlar d'algunes aplicacions que són alguna cosa més que una pàgina. Tan emocionant com Tic Tac Toe va ser, un munt d'aplicacions dins de iOS són una espècie d'aquests drill down coses amb múltiples pantalles. El primer concepte que haurem de parlar són els protocols, i un protocol és simplement un conjunt de mètodes que et puc prometre de definir. Si crec aquest nou protocol amb 2 mètodes, aquest primer, si el tipus de retorn és nul, el vaig trucar foo. Això no té arguments. Tinc un altre mètode. Es torna un int. Vaig trucar Bar, i es necessita un argument. Tot aquest protocol és que es diu SomeProtocol aquí, Aquest és un conjunt de coses que algú pot implementar. No he dins d'aquest protocol, va dir que foo fa. En el seu lloc, només estic dient que podríem definir foo si així ho desitja. Si jo estic creant un controlador de vista o la creació d'una classe Jo interior pot d'aquesta promesa classe per implementar alguns d'aquests mètodes, així que per exemple, si dir això ara diu que estic fent una promesa a vostè que dins de d'aquesta classe de controlador de vista tindré definicions per ambdós foo i bar. Per què és útil? Una gran quantitat de components interns de iOS aprofitar aquesta patró de disseny anomenat delegació, i el que diu la delegació és que, per exemple, si tinc un quadre de text i hi ha alguns fets que podrien ser registrats dins del meu caixa de text, en lloc de crear esdeveniments separats el que puc fer és el que puc dir el delegat d'aquesta caixa de text serà d'algun objecte. Quan dic que això és un delegat que vol dir que ara sempre que algun succés hauria estat acomiadat en el quadre de text en lloc d'haver de registrar ni res d'això que només va a trucar a un mètode en el delegat. Per exemple, a l'interior del meu caixa de text tinc un mètode per quan pols que realitza botó a la part inferior dreta, pel que en lloc de registrar controlador d'esdeveniments el que puc dir és quadre de text, aquí és un objecte que vull que trucar a un mètode en cada vegada que algú pressiona el botó Acceptar, i això vol dir que aquest objecte ha d'implementar algun protocol que diu que em compromet a definir que l'acció del botó fet, perquè si no defineix aquest mètode i premeu Fet, llavors serà confús. Fem una ullada a un exemple. Aquí només tinc un quadre de text, i una de les propietats d'aquesta caixa de text d'aquí d'aquest costat dret és el delegat. Aquesta és una propietat de la classe. El que he fet aquí és que el control es fa clic, i arrossegar des d'aquest punt d'aquí per al controlador de vista, i això diu ara el delegat d'aquesta caixa de text serà el controlador de vista. Així doncs, quan algunes accions ocorren, en lloc de registrar controladors d'esdeveniments independents que volen que els enviï al delegat. Ara anem a fer una ullada al meu controlador de vista. Dins de l'expedient. H He fet una promesa. He promès implementar alguns mètodes dins d'aquest protocol UITextFieldDelegate anomenat, i de nou, això és només una llista d'algunes coses que puc decideixi implementar. Si vinc aquí al meu. M arxiu, he implementat un mètode. Els he demanat que textFieldShouldReturn perquè això és el que es diu dins del protocol. I ara cada vegada que premi el botó interior fet que el camp de text això és el que serà anomenat, pel que no es va registrar un controlador d'esdeveniments. He connectat el delegat, i sempre que aquest esdeveniment es dispara aquest és el mètode que es dirà, de manera que si vinc aquí al meu storyboard i executar- mentre que es carrega podem veure el que fa. A la pantalla del meu tinc 2 coses. Tinc un camp de text, i tinc aquesta etiqueta. Simplement estic dient que desitja que el text d'aquesta etiqueta a ser igual al que l'usuari va escriure a l'interior del camp de text. Aquesta línia ve aquí és simplement un mètode que anomeno en el camp de text que diu que vull que vostè oculti el teclat. Això és només el mètode arbitrari que Apple va triar. Un cop més, abans que fes qualsevol cosa que vaig haver cablejar tot, així que vaig venir per primera vegada aquí. Des del controlador de vista que arrossegar la caixa de text. Et deixo anar, i puc veure aquí que jo puc fer això propietat text del camp des d'aquí al controlador de vista que he definit una propietat que és un IBOutlet d'un camp de text. Això diu que puc connectar a aquesta propietat fins a un camp de text en la meva interfície d'usuari. Ara, quan faig clic en això puc començar a escriure. Ara bé, si faig clic al botó Fet això va a disparar un esdeveniment que ara puc respondre. No hi ha controladors d'esdeveniments. Així és com m'acaba de respondre a aquest botó fet. Té sentit? Això no és un patró de disseny que-que mai podria trobar la creació del seu propi protocol, però només sé que alguns diferents components iOS registrar esdeveniments de diferents maneres. Botons, per exemple, utilitzar els IBActions. Els camps de text, d'altra banda, s'utilitzarà delegats. Podem veure i es pot veure tot això dins de la documentació. Per cert, en realitat hi ha un munt de coses d'interfície d'usuari integrada en iOS per a vostè, així per exemple, la manera com diuen que vaig fer fa a la part inferior dreta es He escollit aquest camp de text. Jo vaig venir aquí. Em desplaçat una mica per tornar clau, i que en realitat es pot fer d'aquest un munt de coses, com si volgués dir que trucada d'emergència en lloc d'això pot fer, que és totalment a l'atzar, i jo no sé per què hi ha un botó d'emergència integrat en l'anomenada, però, diu trucada d'emergència en lletres molt petites. Aquí ho tens. Definitivament explorar totes aquestes diferents elements en iOS. Teniu alguna pregunta respecte els delegats? Un cop més, només un patró de disseny interessant que vostè ha de tenir en compte. Bé, anem a fer una ullada al costat de les vistes de taula. En vista de taula és bàsicament la llista d'articles que està per tot el lloc en iOS. Quan vostè està mirant tots els seus contactes, vostè està buscant en la pàgina de configuració, i aquest tipus de llista de les coses que es diu una vista de taula. La implementació d'una vista de taula en iOS és bastant simple. En lloc de fer una classe que baixa que UIViewController com ho hem fet abans simplement hem de dir més aviat que tot el que un UIViewController és el que vull fer, Jo dic tot el que un UITableViewController és el que vull fer, de manera que es limita a afegir algunes coses addicionals que són totalment fet per nosaltres. Hem de fer molt poc per cobrir bàsicament els espais en blanc dins de la taula. Per tal de mostrar una taula que he de respondre a algunes preguntes. La primera pregunta que ha de respondre és com les seccions que hi ha a la taula? Quan vostè està mirant la seva aplicació contactes t'adonaràs que és una mena de organitzat per l'As, llavors vostè té la B, i vostè té aquesta capçalera sub poc. Cada un dels que s'anomena una secció. Vostè pot o no pot necessitar aquests. El primer que has de fer és posar en pràctica un mètode anomenat tableView: numberOfSectionsInTableView. Això simplement retorna quantes seccions té, pel que aquesta podria dir tornar un si té una vista de taula gran. La següent pregunta que iOS ha de saber és quantes files té? Per exemple, vostè hojeando una vista de taula. Vostè té un nombre fix de les cançons que estàs veient o un nombre fix dels seus contactes. Si ets com jo, per descomptat, no és que molts, i així és com iOS sap quantes cèl · lules que es vegi. Un cop més, això podria dir alguna cosa així torni 3. La meva opinió taula té 3 files. Finalment, iOS ha de saber el que cada cèl · lula s'assembla, així que el que en realitat farà és cridar a aquest mètode aquí baix, aquest tableView: cellForRowAtIndexPath. Es dirà a aquest mètode en cada cèl · lula dins de la taula. Com sap quantes vegades l'hi diu? Bé, el que s'ha dit a l'interior del nombre de files de la secció. Anem a trucar a aquest en cadascuna de les nostres cèl · lules, i dins d'aquest és on realment es pot fer coses com establir el text o li dirà què aquest petit botó blau a la part dreta fa. El patró per obtenir aquestes cèl · lules, utilitzarem aquest mètode anomenat dequeueReusableCellWithIdentifier. Objective-C és en realitat molt coneguda per la longitud dels seus noms ridículs mètodes, i això és realment un bon cas en l'exemple de punt. El que aquest mètode no es tracta simplement diu que vull que em facis un cel · la. Només una cosa iOS. Si vostè té una mena 100.000 cançons en el seu iPod el que iOS no vol fer és assignar 100.000 cèl · lules, perquè si vostè està a la part superior de la seva llista, el que realment necessita per assignar memòria per a la cèl · lula que és 99.000 files cap avall? No, perquè el que et puguis desplaçar tipus d'assignar a mesura que avança. Això es fa per a vostè. Vostè no ha de preocupar-se per totes aquestes coses estúpides rendiment. Tot el que diuen és que criden a aquest mètode dequeueReusableCellWithIdentifier, i això ho diu, està bé, si cal vaig a crear una nova cel · la per a vostè. Però si vostè està a la part inferior de la taula i ja ha assignat algunes cèl · lules a la part superior de la taula que no estàs realment va a necessitar en el curt termini Jo et donaré un dels de tornada en lloc d'assignar una nova, pel que aquest és un problema de funcionament agradable. No ha d'assignar a les cèl · lules a tu mateix. Això et tornarà una cel. Va a tornar a vostè un objecte mòbil. Un cop tingueu l'objecte de cèl · lula que pot fer coses per a ella. Podeu definir el text de la cel · la amb aquesta propietat anomenada etiqueta de text. Vostè pot afegir que la fletxa de la dreta o d'algun altre material atzar amb aquesta altra propietat anomenada accessoryType, i així successivament i així successivament. Anem a fer una ullada a l'aplicació real d'una vista de taula ara. Quan vaig crear aquest projecte en lloc de dir la aplicació única vista que en realitat vaig venir aquí de l'aplicació principal-detall, de manera que, bàsicament, el que correspon a l'aplicació de correu en l'iPad amb la vista de la taula de l'esquerra i llavors el contingut de la dreta. En l'iPod o iPhone que això va a correspondre a una visió única taula. Aquí és on jo tinc el meu codi d'arrencada. Primer donem una ullada al guió gràfic. Tot això va ser fet per mi, en el fons creat. Aquesta barra de navegació em va mostrar el que una cèl · lula exemple podria ser similar, i fer doble clic, canviï el títol. Qualsevol preocupació d'IU altres que puc manejar allà. L'arxiu de capçalera es veu molt simple. En lloc de dir això és UIViewController ara estem dient que això és una TableViewController, així que sabem que volem cridar a tots els mètodes de la taula. Ara vull crear una propietat que representarà les coses dins de la meva taula. Aquesta taula es mostrarà arbitràriament una llista de fruites, i per això necessitem crear alguns matriu en la qual pot inserir fruita. Dins del meu arxiu d'implementació, el primer que vull fer és que vull assegurar-me que inicialitzar aquesta matriu. Vaig dir Alloc init, vaig crear el meu arsenal de fruita, i jo estic afegint 4 coses a ell, un dels quals és molt més controvertit que els altres 3. I ara tinc una matriu de mida 4. Ho estem sacsejant a CS50. Ara tinc una matriu de mida 4. Ara vaig a començar a respondre aquestes preguntes, i de fet, quan vaig crear aquesta aplicació d'aquest ja estava fet per a mi. No vaig haver d'escriure el nombre de seccions en vista de taula. Ja estava allà, i jo estic omplint els espais en blanc. Quantes seccions tinc? Una. Tot fet. Quantes files tinc? Bé, tinc una fila per a cada fruita, de manera que aquest recompte és una propietat de qualsevol matriu que diu com és de gran? Aquest és el nombre de files que tinc. Finalment, he de dir el que té cada cèl · lula sembla? Vaig a dir dequeueReusableCellWithIdentifier. De nou, això ja estava escrit per a mi. Jo no havia de fer això per mi mateix, i vull tornar aquesta cel · la en aquesta ubicació. Recordeu que estem cridant a aquest mateix mètode en totes les cèl · lules, i aquest argument aquí, aquest argument indexPath, diu quina fila estic dins Si dic indexPath.row aquí aquest serà 0, llavors serà 1, llavors serà 2, i això és el que sé què cel · Actualment estic mostrant. Vull configurar el text de la cel · la utilitzant aquesta propietat textLabel anar dins del meu matriu fruita i obtenir l'objecte que correspon a cada fila. Si això és una cadena, ara estic establint la propietat de text en una cadena. Puc fer una altra cosa. També pot registrar un controlador d'esdeveniments en cadascuna de les cèl · lules, així que quan em toqui a cadascuna d'aquestes cèl · lules aquest didSelectRowAtIndexPath, això serà anomenat per mi, per la qual cosa simplement definint aquesta ara puc manejar el que succeeix en tocar en una cel · la i, de nou, estem passant a la cel · la que va ser aprofitat perquè puguem tornar a utilitzar aquest mateix controlador d'esdeveniments per a totes les nostres cèl · lules. Un cop més, això és una cosa iOS està fent per mi. Anem a mostrar una altra popup molest que simplement diu que va escollir alguna cosa quan aquesta cosa serà l'objecte de fila. Quan executo això, jo vaig a tenir aquest punt de vista bonica taula amb una fila per a cada una d'aquestes fruites, i si em toca una em diu el que va passar. Té sentit? Anem a construir una mica més complex d'una aplicació, tant com fer clic a que vostè va escollir tomàquet és. La part agradable sobre el storyboard és que no és només ajudarà a les pantalles de disseny individual, també ens ajudarà a unir la nostra aplicació completa, de manera que l'aplicació final que serà aquest edifici és bonic esport lector de notícies, i pel que tindrà diverses pantalles, així que pot representar en realitat cadascuna d'aquestes pantalles múltiples en l'storyboard, i puc allunyar la imatge i veure la meva aplicació d'un alt nivell. Per tal de crear un nou element a l'interior del meu storyboard és molt simple dins d'Interface Builder. Si vull afegir una altra pantalla per això, per exemple, La primera vegada que es pot reduir amb el zoom de pessic que Apple vol molt, i aquí baix abans de cercar un botó i arrossegar i deixar anar un botó si voleu crear una nova pantalla que en realitat es pot simplement arrossegar i deixar anar un controlador de vista completa, de manera que si agafo aquest, estireu-lo per aquí, hey, hi ha una altra pantalla, de manera que ara està utilitzant aquest arxiu de storyboard mateix Puc tenir totes les pantalles dins del meu app, i puc allunyar i veure com interactuen. Aquests no van a interactuar amb tot. La manera com aquestes 2 pantalles interactuen és definir les relacions. És, bàsicament, es pot dir d'aquesta pantalla, en prémer aquest botó, Vull que llisqui cap a aquesta nova pantalla. Això significa que aquest tipus de relació entre  la pantalla primera i la segona pantalla. Vas a tenir bàsicament una fletxa d'aquest botó a la segona pantalla dient que quan es prem aquest botó, que és on vull anar. Igual que hem fet clic i arrossegament de controls per definir els punts de venda farem el mateix per definir aquests Segues. Anem a veure un exemple d'això, i abans que realment la transició d'una pantalla a una altra iOS és prou agradable per trucar a aquest mètode anomenat prepareForSegue, i aquí és on podem començar a l'enviament de dades des d'una aplicació a una altra. En l'exemple que estem a punt de veure, bàsicament, ens permetrà per filtrar els equips de beisbol de les lligues i divisions. Quan selecciono una lliga, per exemple, vull fer la transició al meu següent pantalla on pugui mostrar totes les divisions en aquesta lliga o tots els equips diferents. He de trametre a la pantalla el que els equips que es mostrin. Per això vaig a prendre avantatge d'aquest mètode aquí. Finalment, només un punt a l'atzar en iOS. Per emmagatzemar les dades que hi ha aquesta cosa anomenada dades bàsiques, que és en realitat una mica complicat treballar amb ells. També pot utilitzar SQL per emmagatzemar dades, que, de nou, és agradable, però una mica en el costat més complicat de treballar, però també és compatible amb iOS aquestes coses molt interessants trucades llistes de propietats, i una llista de propietats és un arxiu que representa els parells clau-valor. Es defineix una llista de claus, i li dic clau serà una matriu. Aquesta clau serà una cadena, i bàsicament qualsevol cosa que vostè pot fer en JSON es pot fer dins d'una llista de propietats, pel que aquesta realment bé ens permet treballar amb algunes dades. Per exemple, tinc aquest Teams.plist que he creat. He creat un arxiu plist nou, i puc veure els detalls. Aquest és un diccionari, això és un diccionari, es tracta de cadenes, i pel que aquesta és una representació gràfica agradable d'un document JSON o simplement un conjunt de parells de valors clau, i per tant aquests són les dades que estaré treballant amb l'interior del meu aplicació. Primer anem a venir aquí. Tenim arxius molt més ara. Però primer anem a venir aquí al guió gràfic. El guió aquí, si puc allunyar- ara podem veure que això és el flux de la meva app. Estic primer anem a començar en aquesta pantalla. Vaig a aprofundir en aquesta pantalla, i vaig a aprofundir en aquesta pantalla, i podem veure aquí que si quin tipus de moure un d'aquests en tot hem aquestes fletxes anar des d'aquí fins aquí, i la manera com defineixen aquesta fletxa va ser si puc ampliar una mica, i si em vénen a aquest controlador de vista, i aquí hi ha una cel · la, i vull dir que en tocar en una cel · la Vull que llisqui cap a una altra pantalla. Simplement, pot mantenir premut el control, desplaçar-se al llarg d'una mica més, premeu la tecla Control, arrossegueu la cel · la una i deixar anar. I aquí podem dir quina és la transició que voleu utilitzar? Vols utilitzar aquesta cosa que es diu diapositiva empenta? Vols que llisqui cap amunt des de la part inferior? Això es diu modal. I una vegada que feu clic en un d'ells, que va a treure aquesta fletxa per a mi, i això vol dir que he manejat en realitat el que succeeix quan pressiono aquest botó gràficament. Jo no he escrit cap codi per lliscar en realitat d'una pantalla a la següent. He definit aquesta visualment dins d'Interface Builder. Si faig clic a aquesta fletxa, podem veure que em va donar aquesta cosa un nom. Em va cridar showDivisions, i això és perquè jo pugui saber transició el que està per passar, i veurem per què en tan sols un segon. Així és com m'he connectat a les diferents pantalles de la meva aplicació. Si això fos un botó, per exemple, en lloc d'una vista de taula, Que podia controlar fes clic al botó, arrossegament a la següent pantalla, i així és com puc fer la navegació d'aquesta manera. Molt ràpidament, si entrem a la MasterViewController, de nou, estem simplement definirà una llista de les coses que es mostrarà a la vista de taula. Aquí estic dient que vull que prenguis aquest arxiu plist, i jo vull que el carregui en un diccionari, i una vegada que tens aquest diccionari, vaig a contestar les mateixes preguntes de nou. Aquí és el nombre de seccions. Un, hi ha una fila per cada lliga, i el text de cada cel · la hauria de ser la primera, la primera lliga, la lliga segon, i així successivament. Finalment, vaig a utilitzar aquest mètode que acabem de veure es diu prepareForSegue, i aquest és el mètode que serà acomiadat quan faig clic a en una de les files i per tant l'activació de la transició que vaig amb les fletxes. Això és a dir que pot tenir múltiples relacions d'una pantalla a una altra. Si tinc 2 botons i cada botó et porta a una altra pantalla Vaig a tenir 2 Segués, 1 per a cada botó. Però aquesta prepareForSegue és, de nou, serà reutilitzat per a cadascuna de les diferents relacions, el que significa que necessito una manera d'identificar si es prem el primer botó o prémer el segon botó. Recordes quan et va donar aquesta segue un nom, aquest showDivisions, això és el que ara sé que aquest és el segue que va ser activat. Tot el que vull fer és que vull dir Vull entendre el que m'acaba de colpejar, i així aconseguir això, puc dir que vull el indexPath per la fila seleccionada, Recordo la indexPath només diu on acaba de fer clic, i llavors vull dir que vull saber on vaig. Aquesta destinationViewController, això és una propietat de la segue. Aquesta és la pantalla que vaig a, així que sé que la pantalla em s'anomena DivisionsViewController perquè he creat aquesta classe, i per això ara si dic d.divisions Ara estic establint una propietat del controlador de vista que vaig a anar. Així és com jo estic enviant dades d'una pantalla a una altra pantalla. Amb només mirar aquesta DivisionsViewController vostè pot veure aquí que en l'expedient. h no és que les divisions de propietat, i això és el que estic bàsicament poblar, de manera que és com sé que estic mostrant les divisions corresponents a la lliga que vaig fer clic i, de nou, la vista de taula real es veu més o menys el mateix, només responent als 3 preguntes simples, així com la identificació de el que passa quan es mou a la següent pantalla. Només un parell de coses aquí. Es nota en la part superior aquí que en lloc de dir # include Ara estic dient # import. Això és només una cosa de Objective-C. La importació és bàsicament una versió més amable d'incloure, i per exemple, hem de saber el que aquesta classe és, així que no puc dir DivisionsViewController. Si no hashtag dins del nostre standardio.c. Arxiu c el compilador no tenia idea del que era printf. De la mateixa manera, si no m'importi el DivisionsViewController el compilador realment no té idea del que és un DivisionsViewController. Només assegureu-vos que dins dels seus arxius m diferents. Vostè, assegureu-vos d'importar els arxius corresponents h. perquè el compilador sap el que està passant. Finalment, en última instància, el que Apple fa és mostrar algunes dades utilitzant una web d'opinió, i així una visió web és un objecte que es pot incrustar un navegador web petit dins de la seva aplicació. Tot el que necessites fer és proporcionar un URL en el seu navegador web, així que vull anar a mlb.mlb.com, i així és com puc accedir a la pàgina d'inici per a cada equip, i així passant en aquest URL la vista web pot mostrar això per a mi, i puc navegar, i el simulador està en ús perquè un. Ara bé, això ve del meu plist. Si fa clic en aquest això també ve del meu plist, i aquest lliscament es manegen mitjançant la definició dels Segues. Faig clic en aquest i un més, i ara aquí està la meva UIWebView, de manera que igual que aquí està la pàgina web per a la direcció URL que acabo incorporat, i jo no havia de manejar cap bogeria. Aquesta és la forma de mostrar una pàgina web. Coses com aquesta el botó de tornada aquí també es donen a mi totalment gratis, perquè he definit aquestes relacions utilitzant Segues. Alguna pregunta? Si. [Estudiant] Així que quan vostè utilitza Alloc, vostè no haurà de alguna cosa gratis? Exactament, quan es diu a Alloc i init vostè no ha de alliberar. IOS va a manejar tot això per a vostè. És meravellós, i vostè no està trencant cap regla. Si. [Estudiant] Si s'inclourà més equips que podrien cabre a la pantalla, el tenen automàticament una opció de desplaçament o és que alguna cosa ha de afegir? Exactament, si tingués més equips, per exemple, automàticament s'ocuparia de el desplaçament per a mi, i tots els problemes de rendiment amb l'enorme taula també són manejats totalment per mi. Altres preguntes? Tots aquests programes serà publicat. És com que passa per alt una mica dels detalls més petits, però coses com establir algunes propietats a la vista web són coses que vostè pot aconseguir explorar la documentació d'Apple, que és molt, molt ben dissenyada. Ells tenen un munt d'aplicacions d'exemple i l'exemple usos d'APIs diferent, així que sens dubte llegir aquests si pots. Només alguns enllaços útils que vostè pot ser que vulgui fer una ullada a. Aquestes són algunes de les guies de documentació a mà. Les URL són enormes, de manera que estem escurçat. Aquest primer és tota la biblioteca de documentació. Hi ha petits bars de recerca, de manera que si el botó d'inici escrivint que començarà a donar-li tota la informació sobre totes les coses que pots fer amb un botó. També he inclòs el Table View Programming Guide. S'ocupa de les vistes de taula en molt més detall, com fer coses com afegir de forma dinàmica o cèl · lules editar o eliminar-los. Hi ha un munt d'aplicacions d'exemple d'Apple que li mostrarà com fer-ho, i, finalment, aquest últim és el Human Interface Guidelines, i això és bàsicament una discussió dels components d'interfície d'usuari, coses com no fer un botó que és de 4 píxels per 4 píxels. Aquesta és una mala idea, i altres coses que Apple vol que facis fomentar el disseny correcte. Les últimes preguntes abans d'acabar? Bé, definitivament no dubti en-tindrem etiquetes especials a discutir. Tindrem un iOS, així que sens dubte no dubti en utilitzar això. Per treballar amb els seus companys de classe en projectes o ajudar a entendre algunes coses a l'atzar iOS no dubti en enviar-me un correu electrònic, i sens dubte llegir tot el codi en línia perquè només en interès de la classe de temps que passa per alt el més de gra més fi detalls de les coses. Però si no, llavors bona sort en els seus projectes per iOS, i espero que tinguem una gran afluència d'aplicacions en l'App Store. [CS50.TV]