[Powered by Google Translate] [Seminar] [iOS: Scrierea Apps Ca un Boss]
[Tommy MacWilliam] [Universitatea Harvard]
[Acest lucru este CS50.] [CS50.TV]
>> În regulă, toată lumea, bine ați venit la iOS: Scrierea Apps ca un Boss.
Acest seminar se va concentra pe scrierea aplicații pentru iPhone
și, la rândul său scris, aplicații pentru iPad, și astfel vom practic de gând să se plimbe prin
un cuplu diferite exemple de cum să faci o aplicație, un joc simplu ca Tic Tac Toe,
sau daca esti mai interesat în a face o aplicatie ca un fel de cititor de stiri
sau ceva care interacționează cu Internetul voi vorbi despre asta la fel de bine.
Iată ordinea de zi scurta noastră.
>> Aplicații IOS sunt scrise într-un limbaj numit Objective-C,
și astfel încât acesta este un pic similar cu C, dar nu într-adevăr, la toate,
asa ca vom vorbi un pic despre limba în sine
si apoi cum să construiască aplicații pentru iPhone cu ajutorul acestui program de aplicație numit XCode,
care, dacă nu l-ați descărcat încă nu ezitați să începeți descărcarea acum.
E mai multe gigabytes.
Ar trebui să fie gratuit pe App Store, așa că va trebui să aibă un Mac
execută în mod ideal, cea mai recentă versiune a OS X.
Dacă nu ești, nici o problema.
Avem Mac-uri in centru științific disponibil pentru utilizarea de către dvs.
cu XCode instalat, și așa că nu ezitați să folosească cele pentru dezvoltare.
Dacă doriți să faceți o aplicație, dar nu au un Mac, nu vă faceți griji.
Exista o multime de resurse campus pentru asta.
Și așa, atunci vom acoperi 2 exemple mai mari de aplicații diferite pe care le puteți face.
Obiectiv-C este ceea ce se numește punct de vedere tehnic un set de super-C.
Asta înseamnă că orice cod C este, de asemenea, valabilă Objective-C cod.
Asta înseamnă că am un fel de canal inregistrat pe unele caracteristici suplimentare la C.
Unele dintre aceste caracteristici nu includ fi nevoie să scrie vreodată malloc din nou, mulțumim lui Dumnezeu,
nici să vă faceți griji cu privire la aceste indicii stupide și să le dea libertatea și toate chestiile alea
ai urât despre C, si e un fel de mers în Objective-C.
>> Acum, Objective-C are, de asemenea, o bibliotecă standard mult mai mare,
deci nu e funcționalitate mult mai mult veți obține pentru interior gratuit de Objective-C.
Amintiți-vă atunci când am fost scris, PHP am constatat că ne-am dus la
acest mic limbă la biblioteca gigant din toate aceste lucruri nebunești care le puteți face.
Același lucru se întâmplă în iOS.
E obiecte pentru lucruri cum ar fi calendarul budist, și într-adevăr nimic
vă puteți gândi, eventual, de, probabil, există deja în punerea în aplicare Objective-C a lui.
Obiectivul parte din Obiectiv-C este ceva de afiliere
numita Object-Oriented Programming.
Aceasta este un fel de un concept nou, dar de fapt, cea mai mare parte am învățat
o mulțime de aceste concepte deja.
Ideea din spatele Programarea Orientata pe Obiect este că ai de gând să structureze
o mulțime de codul dumneavoastră în jurul valorii de aceste lucruri numite clase,
iar aceste clase sunt glorificați cu adevărat struct.
În interiorul unei structuri noi, practic spus aici este un lucru,
iar acest lucru poate avea membri.
De exemplu, un nod într-o listă legată ar putea avea alte lucruri
ca o valoare, un pointer la nodul următor din listă,
și împreună că indicatorul și că valoarea compus acest exemplu cea a unui struct.
Clasele sunt foarte asemănătoare, cu excepția
clase pot avea, de asemenea, funcții în interiorul lor.
Când ne-am declarat-o struct, am putea spune doar int n sau * nod următor.
>> Acum, cu Objective-C, putem pune de fapt funcții
în interiorul acestor lucruri.
Un alt lucru pe care clasele pot face este că ei pot moșteni date din alte clase.
De exemplu, vom fi uitat la o grămadă de built-in Objective-C clase.
Unul dintre ele ar putea fi clasa care reprezintă punctul de vedere pentru un ecran,
și așa mai departe prin a spune vreau să pună în aplicare opinia mea
spunem practic pe cineva de la Apple, oamenii probabil într-adevăr frumos,
a scris această clasă pentru mine, și se ocupă de lucruri cum ar fi afișarea butoanelor
sau să facă ecran, și ne-ar fi cu adevărat îndurerat
să pună în aplicare toate că funcționalitatea noi înșine, și așa mai departe prin simpla
moștenind de date putem spune tot ce ai făcut în această clasă
De asemenea, doresc interiorul clasa mea, și apoi am de gând să fac alte chestii,
pună în aplicare o aplicație anume.
Asta ce înseamnă cuvântul moștenire. Vom vedea un exemplu mai concret.
>> Și, în sfârșit, cheia cu Programarea Orientata pe Obiect este faptul că
aceasta duce la încapsulare de date.
În unele dintre probleme noastre seturi am putea avea aceste variabile mari, globale
și GLOBALS pretutindeni, și că e modul în care vom urmări de stat.
Cu clasele putem începe incapsularea informații privilegiate a unui obiect.
Dacă avem un ecran pe aplicația noastră, nu avem nevoie de a avea niciun fel de date de la
un alt ecran în interiorul aplicația noastră de faptul că,
și așa mai departe prin incapsularea lucrurile în cadrul claselor acest fapt duce
de proiectare cod mult mai bine, iar acest lucru este posibil cu unele dintre caracteristicile suplimentare
Obiectiv-C.
Va avertizez, sintaxa pentru Objective-C este banane.
Este ca și cum nimic nu am văzut până acum,
deci este un pic de o curbă de învățare obtinerea utilizate pentru a
ce naiba înseamnă?
Dar odată ce te trecut că curbă de învățare inițială este foarte, foarte buna
pentru a începe să scrieți aplicații.
>> Pentru a declara o clasa, să spun aici este clasa mea, ea există,
și, poate, aici sunt unele lucruri pe care am de gând să definească mai târziu,
Am de gând să spun @ interfață.
Am de gând să spun @ interfață. Am de gând să dea un nume clasa mea.
Și apoi mai târziu în altă parte am de gând să spun @ sfârșit,
și totul în între interfața @ și sfârșitul @
va fi clasa mea.
Care va fi ceea ce este în interiorul dosarele noastre. H.
La fel ca în C dosarele noastre. H în esență spus aici sunt unele lucruri care vor exista.
Eu nu neapărat vă spun ceea ce fac ei încă,
dar compilatorul trebuie să știe că ele există.
Mai târziu, în interiorul nostru. M. fișiere, deoarece m-pentru Objective-C
este unde vom merge de fapt, pentru a defini ceea ce fac aceste clase.
La fel ca dosarele noastre. C, am oferit o punere în aplicare pentru funcțiile.
În interiorul nostru. M. fișier vom spune aici este ceea ce toate funcțiile
interiorul clasa mea-ce toți fac.
Și, în sfârșit, în interiorul unei structuri am putea spune în interiorul acestor acolade
int, n sau nod * următor
și în Objective-C vom folosi cuvântul cheie @ proprietate,
și aceasta este ceea ce se întâmplă pentru a defini proprietățile,
sau funcțiile non-care sunt o parte din orele mele.
>> Apelarea funcțiilor în Objective-C este, de asemenea, bananele.
Când ne-am declarat funcții în C am spus ceva de genul int foo
și deschis paren și apoi a dat-o listă de argumente.
Aceasta este ceea ce declara metode sau funcții arata ca in Objective-C.
Dacă vreau să declare o funcție sau o metodă de
în cazul în care vreau să spun metodă este de fapt doar o funcție care este un membru al unei clase,
deci un fel de interschimbabile, dar nu chiar,
astfel încât interiorul metoda mea vreau să creați o nouă metodă.
O să se întoarcă nimic, asa ca va fi de tip void.
Acesta este tipul returnat de funcția mea.
Acum avem Parens aici pentru că-nu știu.
Următorul va fi numele de funcția mea,
și apoi în cele din urmă, avem un punct și virgulă la fel cum am avut-o în C.
Ce este nou aici este tipul ăsta aici.
Aceasta este de fapt necesar cratimă, și ceea ce spune aceasta este că
această metodă trebuie să fie numit aici pe o instanță a unei clase.
>> Dupa ce am declarat struct noastre, probabil, a spus ceva de genul
struct nod N, și că de fapt a creat
sau instanțiate una dintre acele struct, astfel că am putea începe de fapt de lucru
cu ceea ce este în interiorul acestuia, astfel încât această linie înseamnă că trebuie să ne
instantia clasa la fel ca noi instantiat ca struct
înainte de a putea apela această metodă pe ea.
Dacă vreau să începeți să adăugați argumente pentru a metodele mele
devine chiar mai multe banane.
Aici e numele meu metoda.
Apoi am de gând să aibă un colon, iar după această colon se spune aici vine unele argumente.
Această metodă are un singur argument.
Tipul de argumentul său este un int, iar numele acestui argument
sau variabilă pe care am de gând să începeți să utilizați interiorul metoda este am sunat.
Din nou, aceasta este metoda. Este nevoie de un singur argument.
>> Dacă doriți să începeți să adăugați mai multe argumente devine banane mai mult
în care am această colon care spune că aici vine lista mea de argumente.
Acest prim argument este un număr întreg.
Acum, acest al doilea argument este interesant.
Variabilă care am de gând să fie utilizând interiorul funcția mea
f se numește, așa interiorul funcția mea am putea spune
f + = 1 sau ceva de genul.
Acest lucru aici este de fapt un argument cheie pentru care sau parametru.
La fel cum am avut perechi de chei și valori ceva de genul JSON sau tablouri asociative
Obiectiv-C a luat decizia de a spune, bine, doar pentru ca e foarte clar
atunci când apelați o metodă de ce toate aceste parametri sunt
Sunt de fapt de gând să numi-le pe toate.
Atunci când apelați o metodă, veți spune, de fapt andFloat,
si apoi vei trece inch
>> Interesant, aceasta nu este numit, dar toate celelalte sunt parametrii,
Deci, dacă am avut un argument treia am putea spune andFloat
și un alt float și așa mai departe.
Când m-am numi aceste metode este de banane curs,
așa că, dacă am un obiect, și am definit o metoda numita foo,
și vreau să-l numesc, mai degrabă decât a spune deschis foo / Parens inchide
Am de gând să deschidă o paranteză.
Iată numele de metoda mea.
Am de gând să închidă suport, iar acest lucru este obiect am sunat-o pe.
Amintiți-vă, toate aceste metode există în clasele
deoarece clasele pot avea metode definite în interiorul ei.
>> Aici am creat un obiect arbitrar a unor clase,
și acest lucru este sintaxa pentru a face asta.
Există 2 pași pentru a crea un obiect.
Primul pas este să spun că vreau să aloce spațiu.
Acesta este echivalentul unui malloc. Noi nu trebuie să spunem mai malloc.
Am renuntat m, a făcut-o alloc, și a înlocuit c.., Cu. M..
După ceva alloc ne vom atunci trebuie să-l inițializa.
Practic, atunci când creați obiectele pe care s-ar putea dori să aibă o anumită logică
care execută atunci când acestea sunt create, astfel încât să puteți trece în unele valori implicite
sau ceva de genul asta, si asa această metodă de inițializare este ceea ce creează de fapt obiectul.
Noi aloca primul spațiu, la fel cum am făcut-o în C,
și apoi l-am inițializa, care poate sau nu poate face un întreg lot.
Apoi ne intoarcem chestia asta într-un obiect o.
E o stea aici, pentru că acesta este un pointer punct de vedere tehnic,
dar nu vă faceți griji, nu sunt indicii că mare lucru în Objective-C mai.
>> Acum ne-am instantiat această clasă numit NSObject,
și acest lucru este doar o clasă aleatoare care Apple are.
Am instanțiată asta, iar acum am o instanță a acestei clase
în acest obiect o, astfel că înseamnă că, dacă am definit
aceste metode am putea să le numesc așa.
În mod similar, în cazul în care am vrut să sun o metoda cu un singur argument,
astfel încât acesta este metoda bar, care ia un argument,
și aici este Baz: metoda qux, astfel încât aceasta durează 2 argumente.
Aceasta este o funcție de asteptare de pe acest obiect o.
Sens?
Sintaxa ar trebui să facă sens, dar un fel de te obișnuiești cu ea.
>> Bine, hai sa vorbim despre câteva lucruri care sunt construite în Objective-C
care nu au fost neapărat construit în C.
În C am un fel de avut de a face cu siruri de caractere ca aceste tablouri stupide,
și a ajuns foarte enervant.
Obiectiv-C are cele construit în toate pentru noi, și este construit în
folosind această clasă numit NSString.
Când vreau să creați un NSString avem sintaxă mai arcane.
Mai degrabă decât a spune "CS50" spunem @ "CS50"
și aceasta este doar sintaxa de declarare siruri de caractere în Objective-C.
Acest lucru este extrem de ușor să uităm, asa ca nu.
Acum, odată ce am aceasta, acesta este un sir, dar observați
e de fapt doar un obiect.
I-am spus NSString, ceea ce înseamnă că instantiat clasa
numit NSString, care altcineva a scris pentru mine,
si au fost foarte frumos despre el, și așa mai departe acum
Pot să încep de asteptare metode pe ea.
Dacă eu numesc lungimea metoda pe acest obiect e
se va întoarce la mine lungimea șirului.
Acest lucru este la fel ca în strlen C.
Acest lucru ar reveni 4.
>> În mod similar, o altă metodă s-ar putea dori să le pese de asta characterAtIndex.
Aceasta este o metodă care spune pe acest șir e
Vreau să te caracterul zero,
și astfel aceasta ar întoarce la mine caracterul c,
și există o grămadă mai multe dintre aceste metode pe care le puteți foarte ușor pe Google.
Documentația Apple este mare, iar noi vom lua o privire la faptul că într-un pic.
Acestea sunt siruri de caractere.
De asemenea, am tablouri variabile de mărime construit inch
Amintiți-vă în C atunci când ne-am declarat-o matrice
am avut să vă spun că aveți 5 elemente, sfârșitul poveștii.
Când am ajuns la JavaScript și PHP am putea începe
a face lucruri cum ar fi adăugarea de elemente sau mutarea elementelor.
Putem face același lucru în Objective-C.
Mai degrabă decât să creeze o matrice în mod normal C
avem din nou o altă clasă numită NSMutableArray.
Există, de asemenea NSArray,
și acest lucru se întâmplă pentru a îngloba practic niște matrice.
Aceasta spune primul lucru pe care vreau să fac este vreau să aloce
spațiu pentru o gamă nouă, și după ce l-am aloce
Apoi am nevoie să-l inițializa.
Din nou, de asteptare doar aceste 2 metode.
Acum, acest lucru înseamnă că în interiorul acestui obiect un
Am un array gol stând acolo.
Dacă vreau să adaug ceva la această matrice, pot apela metoda addObject.
Vreau să adăugați un obiect la o matrice, și vreau să adăugați șir CS50.
Dacă aș fi vrut să elimine invers, că pot spune că am dori să
eliminarea obiectului la primul loc pe matrice sau o opoziție.
>> Sens?
Bine, ai un fel de te obișnuiești cu acest lucru suport pătrat.
Apropo, în interiorul unui lot de biblioteci Apple veți vedea acest NS.
NS înseamnă de fapt pasul următor, care a fost una dintre primele companii de Steve Jobs,
și că este în cazul în care într-adevăr a început să scrie o mulțime de cod
ca un fel de baza pentru Mac OS X și toate alte lucruri,
și astfel această NS este un fel de această moștenire frumos striga la una dintre societățile anterioare
înapoi, atunci când Apple a fost primul incepand de afară.
E peste tot.
Să aruncăm o privire la o mai holistică Objective-C de exemplu.
Iată-mă în interiorul XCode.
Pentru a ajunge aici, am descarcat prima XCode din App Store,
a deschis-o, iar apoi m-am dus până aici la dosar,
aici la proiect nou, și apoi.
După ce am face asta am toate aceste opțiuni de ceea ce vreau pentru a crea,
și astfel vom arunca o privire la aceste opțiuni mai târziu,
dar doar pentru acest exemplu, pentru că nu suntem de fapt de gând să aibă o aplicație încă,
Am venit aici, i-am spus instrument de linie de comandă,
și aceasta este o aplicație pe care am putea fugi de la linia de comandă
la fel ca am fost difuzate de la C.
Asta e modul în care am creat acest proiect, iar asa ca acum eu sunt aici,
Deci să ne uităm mai întâi la acest dosar, iar acest lucru ar trebui să arate destul de familiar.
Am un nume int. Nu e prietenul meu argc, argv meu alte prietene.
Și astfel putem vedea că acesta este punctul de intrare pentru primul meu Objective-C aplicație.
Aici putem ignora acest lucru pentru acum.
Acest lucru este, în principiu niște chestii de management de memorie pe care într-adevăr nu va
vreodată trebuie să vă faceți griji.
>> Să ne uităm la acest bloc primul aici.
Aceasta prima linie, dacă spun Student * Alice = [[alloc pentru studenti] init] Ce e asta faci?
Acest elev prima data aici, aceasta este, probabil, o clasă.
Aceasta nu este o clasa care Apple a scris, dar este o clasa care am scris.
Primul lucru pe care vreau să fac este vreau să aloce spațiu pentru un student nou,
și apoi vreau să-l inițializați, astfel încât această dă-mi înapoi
acest obiect elev nou, iar eu stocarea asta intr-o variabila numita Alice.
În cazul în care această clasă au venit de la?
Ei bine, aici pe partea stanga toate acestea sunt de diferite fisiere din interiorul meu proiect.
Putem vedea aici am o Student.h și un Student.m.
Fișierul h.., Amintiți-vă, este locul unde am declar toate lucrurile
că va exista în cadrul clasei.
>> Să aruncăm o privire la asta.
În regulă, aici avem această interfață @, iar acest lucru spune că vine aici
declarațiile de tot ceea ce va exista în clasa mea.
Atunci am un colon. Atunci am chestia asta NSObject.
Acest lucru înseamnă că de colon pic moștenire am discutat un pic mai devreme.
Acest lucru spune totul o NSObject poate face
în cazul în care este NSObject această clasă scris de altcineva,
tot ceea ce poate face acest NSObject vreau să fie în măsură să facă acest lucru.
Prin a spune: NSObject asta înseamnă că eu practic
moștenit toate funcționalitățile de o alta clasa.
Asta chiar mi-a dat o gramada de metode diferite și proprietăți pe care le pot utiliza.
Aici jos creez 2 proprietăți.
Asta înseamnă că studentul meu, în cazul în care acest lucru ar fi o struct, acestea ar fi 2 lucruri
interiorul struct mea, astfel încât fiecare elev are un nume
că este un șir, și un student are, de asemenea, un grad,
care este un int.
>> În cele din urmă, aici am de gând să creeze o metodă de studentul meu.
L-am sunat metoda mea, initWithName, și este nevoie de un singur argument,
și că acest argument este un șir, și am numit-o numi.
Acum, să ne uităm la modul în care am implementat de fapt, această clasă.
Aici, acum sunt în interiorul dosarul meu m.,
m pentru punerea în aplicare, cred.
Am punerea în aplicare mea, partea mea, și aici este locul unde am de fapt, definirea
ceea ce face initWithName.
Am initWithName, numele parametrului meu, iar apoi acest
în cazul în care este de fapt creez un student,
și astfel încât acesta este un pic criptic, dar aceasta este un fel de șabloane
pe care doriți să le includeți în constructorilor tale.
Această funcție de inițializare aici, initWithName, este un tip de constructor.
Te construirea de fapt un obiect nou elev
și trimiterea poate unele date conținute de acesta.
Primul lucru pe care vreau să fac este vreau să sun init pe chestia asta super.
>> Amintiți-vă că atunci când am spus din nou aici, în fișierul. H
că tot ceea ce are un NSObject un student are, de asemenea.
Asta înseamnă că atunci când am crea un elev ceea ce am, de asemenea, trebuie sa faci este
asigurați-vă că NSObject că eu sunt moștenirea toate că datele de la
este, de asemenea, inițializat corect.
Ce am nevoie să spun este aceasta este, de fapt super-va pentru a face referire la clasa de mamă
că mă moștenește de la, așa că vreau să fiu sigur că inițializa
tot ceea ce am, în funcție de înainte de a începe încercarea să-l folosească.
Apoi, în cazul în care acest lucru este initializat corect la fel ca în cazul în care spune malloc
nu intoarce null atunci eu pot începe stabilirea unor proprietăți.
>> În JavaScript și PHP am acest cuvânt cheie numit aceasta,
și acest lucru face referire la instanța curentă a unei clase.
În Obiectiv-C numim acest sine.
Când spun self.name, ceea ce înseamnă că obiectul
Eu doar i-am spus atunci când a creat alloc elev init,
care este de gând să-mi dea înapoi un obiect.
Asta înseamnă că vreau să setați numele acestui obiect
pentru tot ce tocmai a trecut inch
La fel ca în C, am acces la membrii cu acest punct,
astfel self.name spune numele obiectului studentului
este acum va fi tot ceea ce tocmai a trecut inch
Și astfel în cele din urmă, pot să-l întoarcă, așa că am obține de fapt, înapoi ceva.
>> Întrebări?
Ok, deci acest sine = super-init,
dacă nu înțeleg în totalitate moștenirea lucruri nu vă faceți griji.
Doar știi că, dacă vrei vreodată să vă face propriul metoda de inițializare doar
face acest lucru, și veți fi bine să plec.
Da >> [Student]. Ce dacă medie de sine?
Acest lucru înseamnă că atunci când ne malloc ceva mereu am verificat dacă a fost egal cu zero,
și dacă a fost nulă, apoi am ieșit.
Acesta este același lucru, pentru că, dacă acest null revine, atunci, probabil, vom merge la vina seg
în cazul în care vom începe încearcă să-l manipuleze.
Asta e clasa noastră student.
Asta înseamnă că ne putem inițializa studenții noștri într-unul din cele două moduri.
Dacă eu spun alloc elev, init nu mă folosind metoda pe care am scris,
și în loc să pot spune pur și simplu alice.name,
și acum am de gând să se stabilească faptul că numele proprietății.
>> În mod similar, în cazul în care doresc să folosească această metodă initWithName
Eu pot spune pur și simplu alloc, iar apoi, mai degrabă decât a spune init
Am de gând să sun că metoda pe care am creat-o, și am de gând să treacă în Bob.
În acest moment, această Bob obiect are un nume egal cu Bob.
Bine, aici eu sunt, folosind ca NSMutableArray pe care ne-am uitat la mai devreme.
Sunt alocarea space.Then am initializarea o matrice nouă.
Am de gând să adăugați 2 lucruri la ea.
Această matrice are acum obiecte de studenți.
Observați că nicăieri nu am să spun acest lucru este o matrice de studenți.
I-am spus că e un tablou, perioadă.
Apoi am pot pune orice în interiorul acestuia pe care vreau.
Aici am 2 obiecte.
>> În cele din urmă, am aici un alt obiect, acest TF.
Peste aici, în TF.h practic același lucru.
Sunt moștenirea de la NSObject, și prin modul în care,
Atunci când creați clase care acest lucru este tot făcut pentru tine,
acest tip de interfață șabloane.
Acesta are o proprietate de studenți.
Am un cuplu de metode de aici, că nu face cu adevărat o mulțime,
și pentru ca inseamna după ce am creat acest obiect TF
Eu pot suna la acest grad metodă pe ea ca asta.
Orice întrebări cu privire la Objective-C sintaxa înainte de a ne începe să se deplasează în unele mai mult
interesant aplicații chestii de dezvoltare?
>> Bine, asa ca hai sa face de fapt, o aplicație pentru iPhone.
Clasele de bază pe care le veți folosi în interiorul app de iPhone sunt numite controlere vezi,
și un controler de vizualizare reprezintă de fapt un singur ecran
interiorul aplicația, așa că, dacă eu sunt pe app muzica, de exemplu,
un controlor vedere ar putea reprezenta punctul de vedere în care am vedea toate melodiile pe iPhone-ul meu.
Un alt controler vedere ar putea fi atunci când fac clic pe o melodie și începe să joci l
sau ca eu sunt de foraj în jos, în artiști.
Fiecare dintre aceste ecrane diferite ar putea fi reprezentat ca un controler de vedere diferit,
și un controler de vizualizare este de fapt doar o clasa care spune cum functioneaza acest ecran.
Lucrurile în interiorul unui controler de vedere, vom avea proprietăți,
asa lucruri ca un buton va fi o proprietate de controlor de punctul nostru de vedere.
>> Suntem, de asemenea, de gând să aibă metode, iar acestea sunt în esență Stivuitoare eveniment.
Această metodă spune atunci când apăsați acest buton
Vreau să fac ceva, și, în sfârșit, din nou,
vom folosi acest cuvânt cheie auto pentru a accesa instanța curentă.
Pentru a construi interfețe în iOS este de fapt foarte, foarte usor.
Ei au această tragere frumos și de interfață meniurile numit Interface Builder,
și cele 2 concepte de bază pe care sarme pana dvs. de Objective-C pentru Interface Builder
sunt IBOutlet și IBAction.
Un IBOutlet pur și simplu spune că dacă declară o proprietate care este un buton,
și doriți să-l cârlig până la ceva în UI-ul real,
ai de gând să spun că e la o priză.
În mod similar, în cazul în care doriți să reprezinte un handler eveniment
atunci ai de gând să spun că e o acțiune.
>> Pentru a firului de fapt up această reprezentare grafică
și codul e foarte, foarte simplu.
Dacă doriți să atașați o IBOutlet, tot ce trebuie sa faci este sa te controleze clic,
și vom vedea un exemplu în acest sens foarte repede.
Tu controlezi faceți clic acolo unde se spune View Controller.
Ai de gând să trageți în interfața, sau invers,
dacă doriți să cârlig până o rutină de tratare eveniment ai de gând să trageți de interfața
în altă direcție.
Să aruncăm o privire la un exemplu foarte simplu iOS.
>> Să creăm un nou proiect.
Am de gând să vin până aici la aplicare,
și am de gând să faceți clic pe Aplicație View Single.
Am de gând să faceți clic pe Următorul. Eu voi da proiectul meu un nume.
Voi numi Buna ziua.
Interesant, Apple a presupune ce te crearea unui produs
astfel încât să puteți să-l vândă și ei pot face bani.
Aici am de gând să spun că aceasta este o aplicație pentru iPhone.
Aveți posibilitatea să creați o aplicație iPad, sau dacă doriți să creați unul dintre aceste aplicații
care acceptă ambele dispozitive pe care le puteți face și acest lucru.
Acestea sunt ceea ce vrei checkmarks dvs. să arate ca.
>> Doriți să utilizați scenarii, pe care le vom vedea mai târziu,
si cu siguranta ai doriți să utilizați numărare automată de referință,
care este o caracteristică frumos care vă împiedică să vă fi nevoie să spun malloc și gratuit.
Cu excepția cazului în care doriți să apelați malloc și liber, aș părăsi această Checked.
Voi faceți clic pe Următorul, și în cele din urmă, acest lucru este de gând să mă întrebe unde vreau să-l salveze.
Voi crea lovit, și aici vom merge.
Am creat un nou proiect.
Aici pe stânga sunt toate fișierele care sunt în interiorul de proiectul meu,
și observați că am o grămadă, și eu nici măcar nu am făcut nimic.
IOS este mare.
>> De exemplu, aici în această ViewController.h,
acest lucru se întâmplă pentru a reprezenta controler mea prima vedere,
astfel primul ecran interiorul aplicația mea.
Acum știm ce se spune.
Noi spunem asta te-am sunat ViewController clasă,
și o ViewController face tot ceea ce face un UIViewController,
și aceasta, din nou, este un clasa care Apple a scris că are o mulțime de lucruri la îndemână pentru noi
Vrei afișați ecranul.
Aici este locul unde pot incepe de fapt, definirea a ceea ce controler opinia mea nu,
și se pare că într-adevăr nu au nevoie de nimic din toate acestea.
Acest lucru este cod șabloane pe care Apple mi-o dă pe gratis.
Am făcut-o nevoie de prima linie, sau eu nu am o clasă,
astfel încât să putem scăpa de faptul că și a scăpa de acest lucru.
Ok, deci aceasta este ecranul meu gol.
>> Acum, haideți să faceți clic pe această MainStoryboard.storyboard,
și acest lucru este în cazul în care începe să devin interesante.
Aceasta reprezintă primul ecran pe aplicația mea.
Dacă vreau să adăugați un buton, în HTML am avut de a crea o etichetă buton.
În Android va trebui să creați o etichetă buton,
dar în iOS, dacă vin doar aici la dreapta jos
si daca dau click pe asta treilea aici, unde se spune Obiecte,
și pot defila în jos, sau pot începe să căutați butonul.
Și uite, un buton, deci, dacă am trage de fapt și plasați acest drept acolo,
Am adăugat doar un buton pentru a prezenta pe ecran aplicația mea.
Dacă vreau să modificați textul, am posibilitatea să faceți clic dublu-l,
spune ceva de ispititoare ca "mă apasă."
Bine, acum, dacă am alerga această aplicație, așa că am compila,
astfel încât să-l rulați fac clic pe butonul de redare, în stânga sus, și nu e aplicația mea.
N-am făcut nimic, și am primit o aplicatie pentru iPhone dulce cautati.
Dacă vreau să-l opresc, aveți posibilitatea să faceți clic pe butonul de oprire
pentru că e mult mai distractiv.
>> Să spunem că vreau de fapt să se întâmple ceva atunci când am apăsați acest buton.
Pentru a face ca ceea ce am nevoie să faceți este să creați am nevoie
un handler eveniment nou sau o acțiune.
Asta înseamnă că am nevoie pentru a crea o metoda pe care vreau să fie numit
atunci când am apăsați butonul, așa că hai să creeze o nouă metodă.
Sunt interiorul ViewController.h.
Am nevoie să spun că există o metodă.
Am nevoie de o cratimă început, pentru că am de gând să fie de asteptare acest lucru pe controler vedere.
Am nevoie pentru a da acest tip.
Tipul de acest lucru este mergi la a fi chestia aia pe care IBAction am văzut mai devreme.
Acesta este un handler eveniment, așa că va returna un IBAction,
și acest lucru este un indiciu pentru a XCode să spun că
acest lucru este ceva ce vreau să firului de ceva.
Pot să dau un nume, cum ar fi virgula buttonPressed,.
>> Acum am declarat-o nouă metodă interiorul clasa mea.
Am spus această metodă trebuie să existe.
Acum, haideți să vină în ViewController.m,
și să spunem că ceea ce această metodă poate face.
Dacă aș începe să tastați, de exemplu, (void) buttonPressed
Notă XCode este foarte frumos și autocompletes pentru mine.
Asta e într-adevăr minunat.
Observați aici că în interiorul fișierului. M. pot să spun, de asemenea, anulate,
și acest lucru este pentru că nu IBAction este de fapt un tip.
Este de fapt hashtag definite undeva pentru a fi un vid,
și, din nou, aceasta este doar o aluzie la XCode care spune
Vreau ca acest lucru să fie o rutină de tratare eveniment, și vom vedea de ce, în doar o secundă.
Cand acest buton este apăsat am de gând să fac ceva enervant
Vrei afișa un pop-up.
>> Pentru a face acest lucru pot crea o nouă instanță a acestei clase numite UIAlertView,
și aceasta este o clasa care Apple a scris ca se va afișa ferestre pop-up enervant.
Vom numi această alertă pop-up, si am 2 pasi, amintiți-vă, pentru a crea acest obiect.
Primul lucru pe care am nevoie să faceți este să aloce spațiu.
Vreau un UIAlertView.
Vreau să aloce spațiu. Asta e metoda mea prima.
Metoda mea este urmatoarea vreau să-l inițializa,
și așa am această metodă de mare, lung numit initWithTitle.
Asta e, practic ceea ce va controla acest pop-up spune.
Titlul de pop-up mea poate fi salut.
Mesajul a acestui popup poate fi "Aceasta este iOS."
Delegat lucru, nu știu ce e asta.
Să zicem că nu e nimic.
Acum, butonul care va apărea poate spune ceva de genul "Sigur că este,"
si nu vreau într-adevăr orice alte butoane, așa că hai să ștergeți că și închideți suportul.
>> Bine, am creat una în plus. Acolo mergem.
Acesta este modul în care pot crea un pop-up nou.
Dacă vreau să arate de fapt, pop-up vreau să sun metoda de spectacol.
Pentru a face acest lucru pot spune de alertă și spectacol,
și din nou, completarea automată a fost super frumos.
Dacă am uitat ce-a fost, dacă am tastat în s,
Pot parcurge aici să dau seama ce a fost,
și-l filtrează frumos.
Acum am creat acest pop-up nou.
Ne vom întoarce la ceea ce înseamnă delegat mai târziu,
si acum vreau sa spun ca am dori această metodă să fie concediat
atunci când am apăsați butonul, așa că am de gând să vină înapoi la rezumat meu,
și vreau să atașați acum acest IBAction.
Primul lucru pe care doriți să faceți este să faceți clic pe butonul.
Când apăsați acest buton vreau să se întâmple ceva.
Eu nu am de gând să țineți apăsată tasta de control.
Am de gând să faceți clic și trageți de butonul
la peste aici, în cazul în care se spune View Controller.
Putem vedea că-l frumos aprinde.
>> Dacă te las merg cu mouse-ul meu am acum acest pop-up pe aici, unde am câteva opțiuni.
Una dintre acestea este evenimentele pe care le pot înregistra.
Acestea sunt toate aceste metode am declarate în dosarul meu h ca IBActions.
Acesta este modul în care ar trebui să știe ce XCode apar în această listă mică,
așa că e doar un indiciu.
Dacă aș faceți clic pe butonul apăsat, am înregistrat acum de tratare a evenimentului.
În JavaScript am avut de spus am unele cod care a înregistrat de tratare a evenimentului.
În Obiectiv-C a fost într-adevăr așa de ușor.
Dacă aș rula acest nou
acum, când apăs pe butonul de tratare meu eveniment se va foc,
și am de gând pentru a obține acest pop-up.
Super, super-simplu acolo.
>> Dacă doriți vreodată să vedeți toate evenimentele care se întâmplă să fie înregistrate
pe o componentă, dacă fac clic pe acest buton
și am venit aici pentru a dreapta
primul puteți vedea aici pot face lucruri cum ar fi tipul de buton,
deci, dacă doriți ca unul dintre cei despre I sau butonul de contact add
sau orice altceva.
Dacă vreau să văd toate evenimentele care sunt pe acest buton
dacă aș veni tot drumul până aici în partea dreaptă
putem vedea aici, la evenimentele pe care le am toate aceste evenimente diferite.
Pot să apăsați butonul, când am dat drumul din buton, atunci când am dublu robinet sau orice altceva,
și cea pe care am înregistrat doar este acest eveniment numit Touch Up Inside,
și acest lucru spune că de îndată ce degetul meu vine de pe butonul de
acest caz, este de gând să foc, și că este exact ceea ce sa întâmplat.
Aceasta este un fel de eveniment apăsat butonul implicit.
>> Orice întrebări până acum?
Bine, asta e modul în care putem începe să firului de lucruri în codul nostru
în lucruri din interiorul interfata noastra.
Amintiți-vă primul lucru am avut de a face a fost să găsească codul,
și apoi am cablat la interfața cod,
și nu există app prima noastră.
Bine, asta a fost foarte misto, si am creat acest buton.
Ce dacă nu facem doriți să aveți pentru a crea un buchet de proprietăți
reprezentând aceste butoane?
De exemplu, în Tic Tac Toe am 9 butoane,
și că ar fi super, super-enervant trebui să drag and drop de 9 ori
sau în cazul în care am avut de a face Tic Tac Toe cu 81 în loc de 9
și a trebuit să drag and drop 81 de ori, și asta e patetic.
Ce putem face în schimb este mai mult ca un HTML
când am avut lucruri, cum ar fi ID-uri și nume și putem căuta lucruri
prin ID-ul lor, există o noțiune similară în iOS numit tag-uri.
>> O etichetă este pur și simplu un identificator unic numeric pentru o componentă.
Dacă eu spun acest lucru are o etichetă de la 0, de exemplu,
dacă am crea un buton și să îi dați o etichetă de la 0, și vom vedea cum se face că, în doar o secundă,
dacă doriți să obțineți acel buton pot spune pur și simplu, vreau să sun
, viewWithTag metoda pe obiect aici
self.view, care reprezintă ecranul curent, de exemplu.
Dacă aș numi această metodă viewWithTag, am de gând să se retragă cu tag-ul butonul 0.
Să aruncăm o privire la acest lucru prin construirea Tic Tac Toe.
În primul rând, acest lucru este storyboard mea.
Am creat aceste 10 butoane UI.
Observați că sunt toți de aceeași mărime.
Dacă aș faceți clic pe unul dintre acestea și mă voi întoarce aici pe partea asta dreapta
veți vedea am ajustat fontul chiar aici, așa că am făcut fontul un pic mai mare,
dar ceea ce am făcut a fost, de asemenea, am stabilit această etichetă.
I-am spus că acest lucru are o etichetă de 1, si asta e din stânga sus.
>> Acum, dacă fac clic pe alt buton, ca aceasta secundă,
Acum veți vedea că tag-ul meu este 2.
Fiecare dintre aceste butoane are doar o etichetă unică,
și așa mai târziu acest lucru este cum am de gând să înceapă interacțiunea
cu aplicația mea.
Acest lucru este tot în interiorul de controlor de vedere unul,
dar aici este ceea ce avem.
Avem 3 proprietăți aici.
Prima și ultima sunt de gând să reprezinte starea de placa mea.
Practic aceasta Prima dintre ele este o matrice care reprezintă în cazul în care Xs, și în Os sunt.
Aceasta celălalt aici ne spune cărei rândul său, acesta este.
Veți observa că am, de asemenea, aceste lucruri aici.
Înainte de a atunci când am declarat proprietățile le-am dat un nume și un tip.
Ne poate da, de asemenea, le unele informații suplimentare aici.
Acest lucru spune prima nonatomic, și ce spune
este, în principiu un singur lucru va fi niciodată încercarea de a accesa această variabilă la un moment dat.
Ai putea face aplicații mai complexe, care sunt multi-threaded,
și așa mai departe înapoi în Scratch am avut fire diferite,
si sprites diferite ar putea face lucruri diferite în același timp.
>> În cazul în care nu e cazul, ceea ce nu este în ceva care vom fi uitat la,
dacă spunem că de fapt nonatomic va face lucrurile un pic mai repede.
Avem, de asemenea, acest lucru numit atribuie, puternic, sau slab.
Acest atribui doar spune că acesta este un tip standard.
Acest lucru nu este un obiect sau un pointer, deoarece aceasta este doar o bool,
astfel bool este construit în Objective-C.
Acest lucru spune nu încercați să faceți nimic fantezie, cu indicatori aici.
E o scala regulat vechi.
Puternic și slab, slab aceasta spune că, de fapt
Doresc ca acest lucru să fie îndreptată spre ceva în controlerul vedere.
Eu nu am de gând să aloce în mod efectiv sau init asta de unul singur.
Generatorul de interfață, atunci când am alerga app, este de gând să se ocupe de tot ceea ce inițializare.
Dacă eu spun slab, care spune că altcineva va fi crearea acestui.
Dacă eu spun puternic, aceasta spune că am de gând să fie un
care a creat acest obiect de bord,
și așa mai departe aici, am mai multe metode aici,
de exemplu, o acțiune atunci când butonul este apăsat joc nou,
o acțiune atunci când oricare dintre celelalte butoane sunt apăsate,
și et cetera.
>> Nu vom intra în prea mult logica de Tic Tac Toe,
desi este foarte interesant, dar haideți să aruncăm o privire la
unele dintre lucrurile pe care le putem face în interiorul iOS.
Această metodă nou joc va fi concediat
ori de câte ori am apăsați butonul joc nou.
Pentru a conecta ca pana vin pur și simplu pe la storyboard-mi.
Am dat click pe joc nou.
Dacă eu vin aici să am dreptate se poate vedea că
Atingeți în interiorul este cablat la metoda newGame.
De aceea, acest lucru se întâmplă pentru a fi concediat.
Metoda newGame este de gând să facă un anumit set up.
O să spun că vreau să ștergeți starea de bord.
Aceasta este o metodă de frumos pe mutabile tablouri.
Acest lucru este de gând să spun că acum este rândul lui X,
și acum am de gând să profite de acest lucru viewWithTag.
>> Știu că butoanele mei au etichetele 1-9,
și asta e ceva ce am ales arbitrar.
Dacă vreau să setați textul fiecărui buton pentru a fi gol
pentru că am început doar un joc nou si nu vreau nici o
Xs sau Os să fie lăsat peste Eu pot face asta.
Eu pot să spun că vreau opinia cu tag-ul, 1, 2, 3, 4 et cetera.
Acest lucru va trage un buton diferit de fiecare dată.
Aici am de gând să-l arunce la UIButton.
La fel cum am putea arunca Ints la flotoare și viceversa
aceasta spune că vreau să arunc acest la un UIButton.
Asta înseamnă că tipul de acest lucru va fi un * UIButton
din cauza indicii, dar nu vă faceți griji, ei nu sunt mai înfricoșător.
>> Odată ce am acest buton pe voi pentru a apela o metodă pe ea.
Această metodă se numește setTitle forState, și astfel această spune
Vreau să setați textul buton pentru a fi șir gol,
și vreau să fie șir gol atunci când nu este apăsat.
Dacă eu sunt, folosind aceasta metoda, pot schimba textul butonului
de îndată ce cineva se lovește, dar vrem să spunem atunci când butonul este doar stând acolo
Doresc textul să fie gol.
În cele din urmă, vom inițializa placa mea,
și am de gând să spun că totul este în prezent la 0,
astfel încât acest program membri imuabil este o matrice mutabil,
ceea ce înseamnă că pot apela metoda addObject și la doar o interiorul 0 din ea.
Asta e ceea ce se întâmplă atunci când creez un joc nou.
>> Să aruncăm o privire la alta.
Această metodă este aici IBAction care va fi apăsat
de fiecare dată când unul dintre aceste patrate este apăsat.
Acum avem niște Tic Tac Toe logica aici.
Ne dăm seama cărei rândul său, aceasta este,
și se bazează pe faptul că ne-am stabilit, fie un X sau un O,
dar am observat că suntem reutilizarea acest handler aceluiași eveniment
pentru fiecare dintre aceste butoane.
Asta înseamnă că nu am o metodă pentru butonul din stânga sus,
o metodă diferită pentru butonul din dreapta jos, deși am fi putut face asta.
Asta nu ar fi foarte bun design.
Ceea ce fac eu aici este de fapt am de gând să determine
ce eticheta a butonului care a fost apăsat este.
Ai observat că această metodă joc are un singur argument.
Se numește expeditor, și ceea ce se expeditor se expeditor este de gând să
reprezintă exact ceea ce a fost luat de acțiune asupra.
Dacă apăs pe un buton, această expeditor va fi faptul că UIButton
că de fapt am apăsat, astfel încât înseamnă că UIButton
are o etichetă pentru că am creat o etichetă.
>> Dacă vreau să ajungem la tag-ul pot spune pur și simplu,
Vreau tag expeditor,
și din nou, tocmai l-am turnat într-o UIButton.
I se întâmplă să știu că expeditorul va fi un UIButton.
Aceasta nu trebuie să fie întotdeauna un UIButton.
Am putea, de exemplu, inregistreaza-te tratare a aceluiași eveniment
pentru unul pentru un buton, unul pentru un slider.
În acest caz, eu știu că sunt toate butoanele, așa că am de gând să spun
Vreau să fie un buton, iar apoi pot obține eticheta,
si de la tag-ul Acum știu unde mă aflu în interiorul bord.
Atunci pot seta pur și simplu, fie X sau O, se poate răsturna rândul său,
verifica cine a câștigat, et cetera.
>> Orice întrebări cu privire la acest lucru până acum?
Bine, tot codul am postat on-line-ne, nu vreau să intru în prea multe
a logicii Toe Tic Tac, dar acum puteți vedea că într-adevăr
Tot ce facem este suntem looping peste acest tablou,
așa că avem un cuplu de bucle de aici, iar noi suntem doar compararea a vedea
avem un meci în toate rândurile, un meci într-o coloană sau ceva de genul asta.
Pentru a rula această aplicație, de fapt, dacă am apăsați pe unul dintre aceste butoane
această metodă jocul a fost concediat, si asta inseamna ca doar setat
butonul pentru a fi un X, asa ca acum acest buton va fi un O, și așa mai departe,
și așa că e modul în care vom începe să interacționeze cu această aplicație singură pagină.
>> Vom posta codul, deci nu ezitați să ia cunoștință faptul că,
dar hai sa vorbim acum despre unele aplicații, care sunt mai mult decât o singură pagină.
La fel de interesant ca Tic Tac Toe a fost, o mulțime de aplicații în interiorul iOS
acestea sunt un fel de detaliere lucrurile cu mai multe ecrane.
Primul concept pe care vom avea nevoie să vorbim despre protocoalele sunt,
și un protocol este pur și simplu un set de metode
pe care le poate promite să definiți.
Dacă am crea acest nou protocol cu ​​2 metode, aceasta în primul rând,
dacă tipul de retur este nul, l-am numit foo.
Este nevoie de nici un argument. Am o altă metodă.
Aceasta returneaza un int. Am numit-o bara, si este nevoie de un singur argument.
Toate acest protocol este că se numește SomeProtocol aici,
Acesta este un set de lucruri pe care cineva poate pune în aplicare.
Nu am interiorul acestui protocol a spus ceea ce face foo.
În schimb, spun doar ați putea defini foo, dacă doriți să.
Dacă am crea un controler de vizualizare sau pentru crearea unei clase
Pot interiorul clasei care promit să pună în aplicare
unele dintre aceste metode, astfel încât, de exemplu, în cazul în care spun
asta acum spune că fac o promisiune pentru a vă că în interiorul
din această clasă controler vedere, voi avea definiții atât pentru foo și bar.
>> De ce este faptul că folositoare?
O mulțime de componente din interiorul iOS să profite de această
model de design numit delegat, precum și ceea ce spune delegația
este faptul că, de exemplu, în cazul în care am o casetă de text
și există unele evenimente care ar putea fi înregistrate interiorul casetei de text meu,
mai degrabă decât crearea de evenimente separate, ce pot face este să pot spune
delegat al acestei casete de text va fi un obiect.
Când spun că acest lucru este un delegat acum că înseamnă că
ori de câte ori un eveniment ar fi fost concediat, în caseta de text
, mai degrabă decât a fi nevoie să-l înregistrați sau ceva de genul asta
este doar de gând să apela o metoda pe delegatul.
De exemplu, în interiorul casetei text mea am o metodă de când am apăsați
care face buton pe dreapta jos,
și așa mai departe, mai degrabă decât înregistrarea de tratare a evenimentelor ce pot să spun este
casetă text, aici este un obiect pe care vreau să-l suni pe o metodă de
de fiecare dată apasă butonul Done cineva,
iar acest lucru înseamnă că obiectul trebuie să pună în aplicare unele protocol
care spune promit pentru a defini această acțiune buton făcut,
pentru că dacă nu definește această metodă și apăsați făcut,
atunci va fi confuz.
>> Să aruncăm o privire la un exemplu.
Aici am pur și simplu, o casetă de text,
și una dintre proprietățile din această casetă de text de aici de pe acest partea dreapta este delegat.
Aceasta este o proprietate a clasei.
Ce am făcut eu aici este apasat controla, și am târât din acest loc de aici
la controler vedere, și care spune acum delegat al acestei casete de text
va fi controler de vedere.
Asta înseamnă că, atunci când unele acțiuni se întâmple, mai degrabă decât înregistrarea
Stivuitoare separate, eveniment care vreau să le trimită la delegat.
Acum, haideți să aruncăm o privire la controler punctul meu de vedere.
In interiorul fișierului. H. Am facut o promisiune.
Am promis să pună în aplicare unele metode în interiorul acestui protocol
numit UITextFieldDelegate, și, din nou,
aceasta este doar o lista de unele lucruri pe care le pot alege să pună în aplicare.
>> Dacă vin aici, în mea. M. dosar, am pus în aplicare o metodă de astfel de.
Am numit-o textFieldShouldReturn
pentru că asta e ceea ce a fost numit in interiorul protocolului.
Și acum ori de câte ori am apăsați butonul interiorul făcut din câmp text
aceasta este ceea ce se întâmplă să se numeste, asa ca nu am înregistra o tratare a evenimentului.
Am conectat delegat, ori de câte ori și acest eveniment este concediat
aceasta este metoda care va fi numit, așa că, dacă vin aici pentru a-mi storyboard și rulați-l-
în timp ce se încarcă putem vedea ce face asta.
Pe ecranul meu am 2 lucruri.
Am acest câmp de text, și am această etichetă.
Eu pur și simplu spun eu vreau textul această etichetă
să fie egal cu orice utilizator introdus în interiorul câmpul de text.
Această linie următor aici este pur și simplu o metodă care te-am sunat
pe câmpul de text care spune că vreau să ascundeți tastatura.
Acesta este doar metoda arbitrară că Apple a ales.
>> Din nou, înainte de a-am făcut nimic am avut pentru a firului totul, așa că am venit prima dată aici.
Din View Controller-am trageți pe la caseta de text.
Am dat drumul, iar eu pot vedea aici că pot face acest proprietate câmpul de text
deoarece aici, în vederea controlerul am definit o proprietate
că este un IBOutlet a unui câmp de text.
Aceasta spune că eu pot vira această proprietate în sus
într-un câmp de text în UI mea.
Acum, când fac clic pe aceasta am puteți începe să tastați.
Acum, dacă fac clic pe butonul făcut acest lucru se întâmplă la foc
un eveniment care pot răspunde acum la.
Niciun eveniment care operează.
Asta e modul în care am răspuns la acel buton făcut.
Sens?
>> Acesta nu este un model de proiectare pe care-ar putea să nu găsiți vreodată
crearea de protocol ta, dar știu doar că unele
componente diferite evenimente iOS inregistreaza-te în moduri diferite.
Butoane, de exemplu, folosesc aceste IBActions.
Câmpuri de text, pe de altă parte, se va folosi de delegați.
Putem vedea și vă puteți uita toate că în interiorul unor documentației.
Apropo, există de fapt o grămadă de lucruri UI construit în iOS pentru tine,
astfel, de exemplu, modul în care am făcut că spune făcut la dreapta jos
Am selectat este acest câmp de text.
Am venit aici.
Am defilat în jos un pic pentru a reveni cheie,
si eu pot face de fapt aceasta o grămadă de lucruri, cum ar fi dacă vreau să spun că
apel de urgență în loc să pot să fac asta, ceea ce este complet aleatoare,
și nu știu de ce există un built-in butonul de apel de urgență,
dar există, se spune de apel de urgență cu litere foarte mici.
Acolo te duci.
>> Explora cu siguranta toate aceste opțiuni diferite în iOS.
Orice întrebări cu privire la delegați?
Din nou, doar un model de design interesant care ar trebui să fie conștienți de.
Bine, haideți să aruncăm o privire la următoarea opinii de masa.
O vizualizare tabel este, în principiu faptul că lista de elemente care este peste tot locul în iOS.
Când sunteți flipping prin toate contactele, te uiți la
pagina de setare, și că un fel de listă de lucruri se numește o vizualizare tabel.
Punere în aplicare a unui tabel în vizualizare iOS este destul de simplu.
În loc de a face o clasă care coboară de la care UIViewController
ca și cum am făcut înainte de a ne pur și simplu trebuie să spunem, mai degrabă decât
tot ceea ce un UIViewController nu vreau să fac,
Eu spun tot ceea ce un UITableViewController nu vreau să fac,
astfel încât adaugă pur și simplu unele lucruri suplimentare care sunt total făcut pentru noi.
Avem nevoie de a face foarte puțin pentru a umple golurile, practic, în interiorul tabelului.
>> În scopul de a afișa un tabel am nevoie pentru a răspunde la câteva întrebări.
Prima întrebare trebuie să răspundă este cât de multe secțiuni sunt în tabelul?
Când sunteți flipping prin aplicația Dvs. de contacte vă veți observa că e un fel de
organizat de Ca, atunci aveți B, și că aveți antet putin sub.
Fiecare dintre cei care se numește o secțiune.
Tu poate sau nu poate avea nevoie de astea.
Primul lucru ce trebuie să faceți este să pună în aplicare o metodă de
numit tableView: numberOfSectionsInTableView.
Care pur și simplu se întoarce cât de multe secțiuni aveți,
astfel încât aceasta ar putea întoarce într-o spune, dacă aveți o vizualizare tabel mare.
Următoarea întrebare pe care trebuie să știe iOS este câte rânduri aveți?
De exemplu, te flipping printr-o vizualizare tabel.
Aveți un număr fix de melodii pe care îl căutați la sau un număr fix de contacte.
Daca esti mine, desigur, nu că mulți,
și pentru ca e modul iOS știe cât de multe celule pentru a afișa.
>> Din nou, acest lucru ar putea spune ceva de genul retur 3.
Punctul meu de vedere tabelul are 3 rânduri.
În cele din urmă, iOS trebuie să știe ce fiecare celulă arata ca,
Deci, ce este de fapt de gând să faceți este să numim această metodă în jos aici,
acest tableView: cellForRowAtIndexPath.
Se va apela la această metodă fiecare celula in interiorul tabelului.
Cum se știe cum de multe ori să-l sun?
Ei bine, ai spus interiorul numărului de rânduri din secțiunea.
Vom numi acest lucru pe fiecare dintre celulele noastre,
și în interiorul acest lucru este în cazul în care puteți face de fapt lucruri, cum ar fi
seta textul sau să vă spun ce butonul mic albastru pe partea dreapta nu.
Model pentru obtinerea acestor celule, vom folosi această metodă
numit dequeueReusableCellWithIdentifier.
>> Objective-C este, de fapt foarte bine cunoscut pentru lungimea ridicol numelor metoda lor,
și acest lucru este într-adevăr un caz frumos în punctul de exemplu.
Ce face această metodă este asta spune doar vreau să-mi dai o celulă.
Doar un lucru iOS.
Dacă aveți ceva de genul 100000 melodii de pe iPod
ce iOS nu vrea să faceți este să aloce 100.000 de celule,
pentru că dacă ești la partea de sus a listei, ai într-adevăr nevoie pentru a aloca memorie
pentru celula care e 99,000 rânduri în jos?
Nu, pentru că așa cum ești derulând poți fel de aloce ca te duci de-a lungul.
Acest lucru se face pentru tine.
Nu trebuie să vă faceți griji cu privire la toate chestiile astea de performanță prost.
Tot ce spui te numim această metodă dequeueReusableCellWithIdentifier,
și acest lucru spune, bine, dacă aveți nevoie să am de gând să creeze o celulă nou pentru tine.
>> Dar daca esti la partea de jos a tabelului și le-ați alocat deja unele celule
la partea de sus a tabelului pe care îl într-adevăr nu avea nevoie de prea curand
Am de gând să vă dau unul dintre cei din spate în loc de a aloca unul nou,
și astfel aceasta este o preocupare de performanță frumos.
Nu trebuie să aloce celule tine.
Asta o să te dea înapoi o celulă.
O să se întoarcă la tine un obiect celulă.
Odată ce au obiect de celule care le puteți face lucruri la ea.
Puteți seta textul de celula cu această proprietate numita etichetă de text.
Puteți adăuga că săgeata de pe dreapta sau de alte chestii aleatoare
cu această proprietate alte numit accessoryType, și așa mai departe și așa mai departe.
>> Să aruncăm o privire la punerea în aplicare a de fapt o vizualizare tabel acum.
Când am creat acest proiect
mai degrabă decât a spune aplicarea singur punct de vedere, de fapt am venit aici
la master-detaliu aplicație, și așa mai practic aceasta corespunde aplicația e-mail
pe iPad cu vedere tabelul de pe partea stângă și apoi conținutul de pe dreapta.
Pe iPod sau iPhone acest lucru se întâmplă pentru a corespunde la o vizualizare singur tabel.
Asta e atunci când am luat codul meu Starter.
>> Să aruncăm o privire la storyboard.
Toate acestea au fost făcute pentru mine, practic a creat.
Aceasta bara de navigare din ceea ce mi-a arătat-o ​​celulă de exemplu ar putea arăta,
și pot să faceți dublu clic pe aceasta, schimba titlul.
Orice alte preocupări UI mă pot descurca acolo.
Fișier header pare foarte simplu.
, Mai degrabă decât a spune acest lucru este UIViewController suntem acum spun acest lucru este un
TableViewController, astfel încât știm că vrem să numim toate aceste metode de masă.
Următorul Vreau să creați o proprietate care va reprezenta
lucrurile din interiorul masa mea.
Acest tabel se va afișa arbitrar
o listă de fructe, și așa că am nevoie pentru a crea unele matrice
în care pot insera fructe.
Interiorul dosarul meu punerii în aplicare primul lucru pe care vreau să fac
este că doriți să vă asigurați că a inițializa această matrice.
>> I-am spus alloc init, creat matrice mea de fructe,
si eu sunt adăugarea de 4 lucruri la ea, dintre care unul este mult mai controversată decât alte 3.
Și acum am o serie de marimea 4.
Noi îl tremura în CS50.
Am acum o serie de marimea 4.
Acum am de gând să înceapă răspunde la aceste întrebări, și, de fapt,
atunci când am creat această aplicație toate acestea au fost deja făcut pentru mine.
Nu am avut să tastați în numărul de secțiuni, având în vedere tabelul.
Acesta a fost deja acolo, și eu sunt de umplere în spațiile libere.
Câte secțiunile am?
Unul. Toate terminat.
Câte rânduri am?
Ei bine, am un rând pentru fiecare fruct, astfel încât acest număr
este o proprietate de orice matrice care spune cat de mare este?
Asta e cât de multe rânduri am.
În cele din urmă, am nevoie să spun ceea ce nu fiecare celulă arata?
Am de gând să spun dequeueReusableCellWithIdentifier.
>> Din nou, acest lucru a fost deja scris pentru mine.
Nu am avut de a face acest lucru singur, și vreau să mă întorc
această celulă de la această locație.
Amintiți-vă că suntem de asteptare aceeași metodă pe fiecare celulă unică,
și acest argument aici, acest argument indexPath,
spune ce am intrat rând
Dacă eu spun indexPath.row aici
acest lucru va fi 0, atunci acesta va fi 1, atunci acesta va fi de 2, iar acest lucru este atât de stiu
ce celula Eu sunt în prezent afișarea.
Vreau să setați textul celulei folosind această proprietate textLabel
pentru a merge în interiorul meu matrice de fructe și de a lua
corespunzătoare pentru fiecare rand obiect.
Dacă aceasta este un șir, eu sunt acum de stabilire
proprietatea textului într-un șir.
Eu pot face un alt lucru.
Eu pot înregistra, de asemenea, o rutină de tratare eveniment pe fiecare dintre celule,
așa că atunci când am apăsați pe fiecare dintre aceste celule
acest didSelectRowAtIndexPath, acest lucru se întâmplă să fie numit pentru mine,
așa pur și simplu prin definirea acestei mă pot descurca acum ce se întâmplă
când atingeți o celulă, și, din nou, ne trece în celula care a fost lovit
astfel încât să putem reutiliza acest handler eveniment aceeași pentru toate celulele noastre.
>> Din nou, acest lucru este ceva iOS face pentru mine.
Să afișeze un alt tip pop-up enervant
care pur și simplu spune-ai ales ceva în cazul în care ceva
va fi obiectul rând.
Când am rula acest, am de gând să aibă acest punct de vedere tabel frumos
cu un rând pentru fiecare dintre acestea fructe, și dacă am apăsați unul
ea mi-a spus ce sa întâmplat.
Sens?
Să construim un pic mai complexă a unei aplicații,
la fel de mult ca și făcând clic pe care ai ales-roșii este.
Parte frumos despre storyboarding
este nu este doar de gând să ne ajute să ecrane de proiectare individual,
este, de asemenea, o să ne ajute lega împreună aplicația întreaga noastră,
astfel încât aplicația finală vom fi clădirii este acest frumos sport stiri cititor,
și așa că o să aibă mai multe ecrane, și așa că am poate reprezenta, de fapt
fiecare dintre aceste ecrane multiple pe rezumat,
si eu pot depărta și a vedea aplicația mea de la un nivel ridicat.
>> În scopul de a crea un interior nou element de storyboard meu
e foarte simplu în interiorul Generatorul de interfață.
Dacă vreau să adăugați un alt ecran de la acest lucru, de exemplu,
Pot zoom prima cu zoom pinch că Apple iubește atât de mult,
și aici jos înainte de a mă căuta un buton
si eu drag and drop un buton
dacă doriți să creați un ecran nou pot de fapt, drag-and-drop
un controler vedere întreg, așa că, dacă am alege acest lucru, trage pe dreapta aici,
hei, există un alt ecran, și așa mai departe acum folosind acest fișier rezumat aceeași
Pot avea toate ecranele din interiorul aplicația mea, și eu pot micșora
și a vedea modul în care acestea interacționează.
Acestea nu vor interacționa încă.
Modul în care aceste 2 ecrane interacționa este că definiți relații.
Vă pot spune practic acest ecran, când apăsați acest buton,
Vreau să alunece pe la acest ecran nou.
Asta înseamnă că e un fel de relație între
primul ecran și al doilea ecran.
Vei avea practic o săgeată de la acel buton pentru a al doilea ecran
spunând că atunci când apăsați acest buton pe asta în cazul în care vreau să merg.
La fel cum am făcut clic controlului și târât de a defini aceste puncte de vânzare
am de gând să faci același lucru pentru a defini aceste segues.
>> Vom vedea un exemplu pentru că, de fapt, și înainte de a ne tranziție
de la un ecran la altul iOS este destul de frumos pentru a apela aceasta metoda
numit prepareForSegue, și acest lucru este în cazul în care putem porni
trimiterea datelor de la o aplicație la alta.
În exemplul de mai suntem pe cale să se uite la ea va permite practic ne
pentru a filtra echipe de baseball de ligile și divizări.
Când m-am selectați o ligă, de exemplu, vreau să tranziției
la ecran urmatorul meu unde pot afișa toate diviziile
în liga sau toate echipele diferite.
Am nevoie pentru a trimite la ecranul ce echipele ar trebui să afișeze.
Pentru a face asta am de gând să profite de această metodă aici.
>> În cele din urmă, doar cu un punct aleatoriu pe iOS.
Dacă doriți pentru a stoca date există lucrul numit de date de bază,
care este de fapt un fel de complicat de a lucra cu.
Puteți folosi, de asemenea, SQL pentru a stoca date,
care, din nou, este frumos, dar un fel de pe partea mai complicat de a lucra cu,
dar sprijină, de asemenea iOS aceste lucruri cu adevărat interesante numite liste de proprietate,
și o listă de proprietate este doar un fișier care reprezintă perechi de chei de valoare.
Puteți defini o listă de chei, iar tu spui această cheie va fi o matrice.
Această cheie este de gând să fie un șir, și practic tot ce se poate face
în JSON puteți face în interiorul unei liste de proprietate,
și așa mai departe acest adevăr frumos ne permite să lucrăm cu unele date.
De exemplu, am avea acest Teams.plist pe care am creat-o.
Am creat un fișier nou plist, și eu pot drill jos.
Acesta este un dictionar, aceasta este un dictionar, acestea sunt siruri de caractere,
și astfel aceasta este o reprezentare grafică a placut unui document JSON
sau doar un set de perechi de valori-cheie,
și astfel acest lucru este de date pe care voi fi de lucru cu interiorul aplicația mea.
>> Să vină aici primul. Avem mult mai multe fișiere acum.
Dar hai să vină întâi aici în rezumat.
Storyboard-aici, dacă pot micșora-
putem vedea acum că aceasta este fluxul de aplicația mea.
Am de gând să înceapă primul pe acest ecran.
Am de gând să detalia la acest ecran,
și am de gând să detalia la acest ecran, și putem vedea aici că, dacă am un fel de
muta în jurul valorii de una dintre acestea, am aceste săgeți merge de aici până aici,
și modul în care am defini ca sageata era dacă am mări un pic,
și dacă am venit pe la acest controler vedere,
și aici e o celulă, și vreau să spun că, atunci când atingeți o celulă
Vreau să alunece pe la un alt ecran.
Eu pot doar să țineți apăsată de control,
defila peste un pic, țineți apăsată tasta de control, trageți această celulă de peste si da drumul.
>> Și aici ne spune ce e de tranziție pe care doriți să o utilizați?
Nu doriți să utilizați acel lucru diapozitivul care se numeste împingere?
Vrei să alunece de la partea de jos?
Asta se numește modală.
Și odată ce am faceți clic pe una dintre acestea, se va desena această săgeată pentru mine,
și asta înseamnă că l-am manipulat de fapt, ceea ce se întâmplă atunci când am apăsați acest buton grafic.
Nu am scris nici un cod de a aluneca de fapt, de la un ecran la următorul.
Am definit acest punct de vedere vizual interiorul Generatorul de interfață.
Dacă aș faceți clic pe această săgeată, putem vedea că i-am dat acest lucru un nume.
Am numit-o showDivisions, iar acest lucru este astfel încât să pot cunoaște
ce tranziția este pe cale să apară, și vom vedea de ce, în doar o secundă.
Asta e modul în care m-am cablat ecrane diferite în aplicația mea.
Dacă acest lucru ar un buton, de exemplu, mai degrabă decât o vizualizare tabel,
Aș putea controla faceți clic pe butonul, glisați peste la ecranul următor,
și că e modul în care pot face navigarea în acest fel.
>> Foarte repede, dacă am intra în MasterViewController,
din nou, vom merge pur și simplu pentru a defini o listă de lucruri
care vor fi afișate în vizualizare tabel.
Aici vreau să spun că vreau să iei acel fișier plist,
și vreau să-l încărcați până într-un dicționar,
și o dată ce ați că dicționarul, am de gând să răspundă la aceste întrebări aceleași din nou.
Aici este numărul secțiunilor.
Unul, nu există un rând pentru fiecare liga, iar textul a fiecărei celule
ar trebui să fie primul, prima liga, liga a doua, și așa mai departe.
În cele din urmă, am de gând să folosească această metodă pe care tocmai l-am văzut sunat prepareForSegue,
și aceasta este metoda care va fi concediat atunci când am clic pe
pe unul dintre aceste rânduri și, prin urmare, că activarea tranziție
că am înființat cu săgeți.
Aceasta spune că nu pot avea mai multe
Relațiile de la un ecran la altul.
Dacă am 2 butoane și fiecare buton vă va duce la un alt ecran
Am de gând să aibă 2 segues, 1 pentru fiecare buton.
Dar acest prepareForSegue este, din nou, va fi refolosite
pentru fiecare dintre relații diferite, astfel că înseamnă că am nevoie de o modalitate de
de a identifica dacă apăsați butonul prima sau apasati al doilea buton.
>> Amintiți-vă atunci când i-am dat ca Segue un nume, acest showDivisions,
asta e cum am acum știu că acest lucru este segue care a fost activat.
Tot ce vreau sa fac este vreau să spun
Vreau să dau seama ce am lovit,
și astfel pentru a obține că, pot spune vreau indexPath pentru rândul selectat,
amintiți indexPath spune doar în cazul în care am dat click,
și apoi vreau să spun că vreau să dau seama unde mă duc.
Acest destinationViewController, asta e o proprietate de Segue.
Asta e ecranul am de gând să,
așa că știu că ecranul am de gând să se numeste DivisionsViewController
pentru că am creat această clasă,
și așa mai departe acum, dacă spun d.divisions
Sunt setarea acum o proprietate a operatorului vedere sunt pe cale de a merge la.
Acesta este modul în care eu voi trimite date de la un ecran la un alt ecran.
>> Doar se uită la acest DivisionsViewController
puteti vedea aici că, în dosarul. h
există este că diviziuni de proprietate, și asta e ceea ce am practic popularea,
asa ca asta e modul în care știu că mă afișarea diviziunile corespunzătoare
liga care am dat click, și, din nou,
vizualizare tabel reală pare destul de mult la fel, răspunzând doar pe cele
3 întrebări simple, precum și identificarea
ceea ce se întâmplă atunci când vă deplasați la următorul ecran.
Doar câteva alte lucruri aici.
Ai observat la partea de sus aici, că, mai degrabă decât a spune # include
Eu acum spun # import.
Acesta este doar un lucru Objective-C.
De import este de fapt o versiune mai frumos de includ,
și, de exemplu, trebuie să știm ce este această clasă,
asa ca nu pot spune doar DivisionsViewController.
Dacă nu am hashtag interiorul standardio.c de fișier nostru c..
compilatorul nu a avut nici o idee ce a fost printf.
În mod similar, dacă nu importa DivisionsViewController
compilatorul nu are într-adevăr nici o idee ce este DivisionsViewController.
Doar asigurați-vă că interiorul fișierelor diferite. M. vă asigurați-vă că pentru a importa
fișierele corespunzătoare. h, astfel încât compilatorul știe ce se întâmplă.
>> În cele din urmă, în cele din urmă ceea ce Apple nu este afișa unele date folosind o vedere de web,
și astfel o vedere de web este un obiect în care puteți încorpora
un browser web pic interiorul aplicația.
Tot ce trebuie să faceți este să furnizeze o adresă URL în browser-ul dvs. de web,
asa ca vreau sa merg la mlb.mlb.com,
și acesta este modul în care pot accesa pagina de start pentru fiecare echipă,
și astfel prin trecerea în această adresă URL
Vizualizare web poate afișa asta pentru mine, și eu pot naviga în jurul valorii de,
si simulator este în uz de asta.
Acum, aceasta a venit de la plist meu.
Dacă am faceți clic pe acest acest lucru a venit de la plist mea, iar acest lucru a fost manipulat de alunecare
prin definirea acestor segues.
Am faceți clic pe acest lucru și mai mult una,
iar acum aici este UIWebView mea, asa ca genul asta
aici e site-ul pentru URL-ul pe care tocmai am încorporat,
si nu am avut nimic să se ocupe de nebun.
Acesta este modul de a afișa o pagină web.
Lucruri ca acest buton pe aici sunt, de asemenea, dat la mine
complet gratuit pentru ca am definit aceste relații folosind segues.
>> Alte întrebări? Da.
[Student] Deci, atunci când utilizați alloc, nu va trebui să ceva gratis?
Exact, atunci când apelați alloc și init nu trebuie să-l elibereze.
IOS este de gând să se ocupe de toate astea pentru tine.
E minunat, și tu nu ești a rupe orice norme. Da.
[Student] Dacă ar fi să includă mai multe echipe, care ar putea încăpea pe ecran,
ar avea în mod automat o opțiune de parcurgere, sau e ceva ce trebuie să adăugați?
Exact, dacă aș fi avut mai multe echipe, de exemplu, s-ar ocupa în mod automat
defilare pentru mine, și toate preocupările de performanță
cu masă mare sunt, de asemenea, manipulate în totalitate pentru mine.
>> Alte întrebări?
Toate acest cod va fi postat.
Am un fel de glosat peste un pic de detalii minore mai,
dar lucruri de genul stabilirea unor proprietăți pentru vizualizarea web
sunt doar lucruri pe care le puteți obține prin navigarea documentația Apple,
care este foarte, foarte frumos expus.
Ei au o mulțime de exemple de aplicatii si exemplu uzanțele
de API-uri diferite, deci cu siguranta citi cu atenție cele dacă poți.
Doar cateva link-uri utile pe care le-ar putea dori să aruncăm o privire la.
Acestea sunt câteva ghiduri de documentare.
URL-urile sunt masive, așa că scurtat.
Aceasta este prima biblioteca intreaga de documentare.
Nu e baruri mici de căutare, așa că, dacă începeți să tastați butonul
acesta va începe oferindu-vă toate informațiile despre toate lucrurile pe care le pot face cu un buton.
Am inclus, de asemenea, de programare Tabelul Vizualizare Ghid.
Se ocupa de masă vizualizări în detaliu mult mai mult,
cum să faci lucruri de genul adăuga dinamic celule sau celule edita sau a le elimina.
>> Există o mulțime de exemple de aplicatii de la Apple, care vă va arăta cum să faci asta,
și, în final, aceasta este ultima liniile directoare Human Interface,
și acest lucru este de fapt o discuție de componente UI,
lucruri ca să nu fac un buton care este 4 pixeli de 4 pixeli.
Asta-i o idee rea, și alte lucruri pe care Apple vrea să faci
pentru a încuraja design bun.
>> Orice întrebări ultimele înainte de a ne termina?
În regulă, simti cu siguranta liber să-Mergem să aibă etichete speciale pe Discuss.
Vom avea o iOS una, astfel încât simti cu siguranta liber pentru a utiliza asta.
Dacă doriți să lucrați cu colegii dvs. pe proiecte
sau ajuta dau seama unele chestii aleatoare iOS
nu ezitați să-mi e-mail, și ia cunoștință cu siguranta tot on-line, deoarece codul
doar în interesul timp am un fel de glosat peste mai mult
detalii fine grained de lucruri.
Dar dacă nu, atunci noroc bun pe proiectele dumneavoastră iOS, și sper că vom avea
un aflux mare de aplicații în App Store.
[CS50.TV]