Cum să creezi o aplicaţie simplă pentru iPhone în iOS 5: Partea 2/3

Ray Wenderlich

Acest articol este de asemenea disponibil în: Chineza simplificată, Engleză, Franceză, Japoneză, Spaniolă, Arabică, Ungară, Indoneziană, Coreană

Aparent această buburuză nu este foarte înfricoşătoare!

Aparent această buburuză nu este foarte înfricoşătoare!

Actualizare 2/17/12: Complet actualizat pentru iOS 5.

Acest articol este a doua parte a seriei de trei părţi despre cum să creezi o aplicaţie iPhone simplă pentru începători. Iar în acest caz aplicaţia este despre evaluarea insectelor înfricoşătoare!

În prima parte a seriei, am creat o aplicaţie care conţinea o listă de insecte într-un tabel.

În acest al doilea articol, vom trata crearea unei interfeţe grafice detaliate pentru a putea vizualiza o poză mai mare a insectelor, a le evalua şi a le schimba pozele!

În partea a treia şi cea finală a seriei, vom trata adăugarea de insecte noi, adăugarea unei iconiţe şi a unei imagini implicite proiectului nostru şi gestionarea operaţiunilor cu timp de desfăşurare îndelungat.

Aşa că hai să facem niste insecte! La urma urmei, nu despre asta e vorba in programare? :]

Controale de vizualizare, O Doamne!

Acum că avem o listă de insecte, ar fi frumos să putem să selectăm insecta pentru a afişa un ecran unde să putem edita numele sau poza insectei şi să o evaluăm.

În cea mai mare parte a timpului în aplicaţiile iPhone, pentru fiecare ecran al aplicaţiei ai o clasă ce reprezintă controlul de vizualizare pentru acel ecran. Acum MasterViewController-ul nostru apare la pornirea aplicaţiei şi conţine un tabel. Vrem să-l configurăm în aşa fel încât atunci când selectezi o insectă să apară DetailViewController-ul care afişează informaţie suplimentară despre insectă.

Atunci când am rulat pentru prima dată şablonul, acest lucru funcţiona, dar în momentul în care am schimbat tipul obiectelor afişate în tabel (insectele noastre în loc de obiecte de tip NSDate furnizate de şablonul din XCode), selectarea rândurilor nu mai trimite obiectul corect către ecranul detaliat. Vom corecta acest lucru în curând.

Fiecare control de vizualizare poate conţine mai multe controale grafice. În controlul nostru de vizualizare tip tabel aveam un singur control grafic – tabelul. Însă în controlul nostru detaliat, vom avea nevoie de o varietate de controale grafice – vom avea nevoie de un control grafic pentru numele insectei, un control grafic pentru imagine, un cotrol grafic pentru evaluare şi încă alte câteva.

Descarcă nişte chestii!

Dacă tot veni vorba – vom avea nevoie de un control grafic de 5 stele pentru evaluare în ecranul de detalii – dar iPhoneul nu are unul gata implementat. Cu toate acestea, am scris recent un tutorial despre Cum să creezi un ecran personalizat în iOS 5: Un control grafic de evaluare de 5 stele, aşa că pur şi simplu vom folosi ecranul din acel tutorial din nou aici.

Nu-ti face griji despre parcurgerea acelui tutorial acum (doar dacă simţi nevoia să faci asta) – în schimb poţi pur şi simplu să descarci pachetul Chestii suplimentare pentru insecte înfricoşătoare pe care l-am conceput pentru acest proiect.

Mergi mai departe şi descarcă fişierul:

  • Creează un nou grup numit “Views” în Xcode şi trage fişierele RateView.h şi RateView.m în acel grup, având grijă ca opţiunea “Copy items into destination group’s folder (if needed)” să fie bifată. De asemenea asigură-te că sursa proiectului “Scary Bugs” este bifată. Acesta este codul controlului grafic de evaluare de 5 stele din tutorial.
  • Repetă paşii de mai sus pentru UIImageExtras, însă trage-le într-un grup nou numit “Helpers”. Acesta este nişte cod ajutător de care vom avea nevoie pentru a redimensiona imaginile puţin mai târziu.
  • Repetă paşii de mai sus pentru cele 3 imagini de feţe îngrozite realizate de minunata mea soţie, însă trage-le într-un grup nou numit “Art” Acestea sunt imaginile pe care le vom folosi pentru “stelele” din controlul grafic de evaluare pentru o doză de umor :]
  • Repetă paşii de mai sus pentru logo1.png, de asemenea inserereaz-o în grupul Art. Vom seta aceasta ca fiind iconiţa aplicaţiei mai târziu.

Proiectarea controlului grafic detaliat cu editorul grafic Storyboard

Bine – acum suntem în sfârşit gata de treabă! Deschide MainStoryboard.storyboard, şi dacă parcurgi ecranul până în partea sa cea mai din dreapta vei vedea Detail View Controller-ul pe care şablonul l-a creat pentru noi în mod implicit, care conţine o etichetă cu mesajul “Conţinutul controlului grafic detaliat se inserează aici”:

Controlul grafic detaliat în editorul grafic Storyboard

Editorul grafic Storyboard dispune de un mod vizual de a construi interfaţa ta grafică în Xcode. Tragi si plasezi elementele grafice pe interfaţa grafică, le setezi proprietăţile asa cum îţi doreşti şi poţi chiar să conectezi elementele cu proprietăţi din clasele de tip control grafic View Controller.

Cel mai uşor mod de a înţelege este să încerci! Mai întâi, dă click pe controlul grafic şi alege opţiunea EditorCanvasShow Bounds Rectangles – aceasta iţi va face mai uşor să vezi cum sunt dispuse controalele pe ecran.

Şterge eticheta cu mesajul “Detail view content goes here” – nu vom avea nevoie de ea!

Apoi în panoul din dreapta, pe partea de jos, ai grijă ca a treia opţiune să fie selectată pentru biblioteca de obiecte. Trage un UITextField, un UIImageView, şi un UIView pe ecran şi aranjează-le ca mai jos (controlul grafic de tip text este deasupra):

 Controlul grafic detaliat în editorul grafic Storyboard

Apoi selectează UITextField-ul şi în secţiunea de deasupra a barei laterale, asigură-te că a patra opţiune (Inspectorul de atribute Attributes Inspector) este selectat, pentru a putea schimba nişte proprietăţi.

Setează fontul la valoarea CustomHelveticaBoldSize 18.0, alinierea textului pe centru, comportamentul butonului de ştergere la valoarea “Appears While Editing” şi majusculele la valoarea “Words” ca în imaginea de mai jos:

Setarea atributelor controlului grafic de tip text

Apoi treci la Inspectorul de dimensiune Size Inspector dând click pe a patra opţiune şi setează atributele de autodimensionare ca în imaginea de mai jos:

Atributele de autodimensionare

Acestea vor face ca atunci când interfaţa noastră grafică se va roti pe orizontală, controlul grafic de tip text se întinde pe ecran pentru a deveni mai lat.

În continuare hai să setăm UIImageView-ul nostru În a patra opţiune (Inspectorul de atribute Attributes Inspector) setează modul la “Aspect Fit”, iar în a patra opţiune (Inspectorul de atribute Attributes Inspector) şi a cincea opţiune (Inspectorul de dimensiune Size Inspector) setează atributele de autodimensionare ca în imaginea de mai jos:

Atributele de autodimensionare

Aceasta face ca controlul grafic de tip imagine să se mărească sau reducă pentru a umple spaţiul disponibil păstrând marginile la aceeaşi distanţă de la marginea ecranului în orice condiţii şi scalează imaginea pentru a se potrivi cât mai bine în acest spaţiu păstrând proporţiile imaginii.

Pentru UIView, du-te la a treia opţiune (Inspectorul de identitate Identity Inspector) şi setează proprietatea Class Identity (Identitate de clasă) la valoarea “RateView” pentru ca controlul nostru grafic de evaluare de 5 stele să apară acolo. Apoi în a cincea opţiune (Inspectorul de dimensiune Size Inspector), setează atributele de autodimensionare ca în imaginea de mai jos:

 Atributele de autodimensionare

Aceasta îl face să se întindă de la stânga la dreapta, dar să aibă întotdeauna aceeaşi înălţime.

Până acum, toate bune! Mai departe trebuie să adăugăm încă câteva controale pe ecran pentru ca utilizatorul să poată apăsa pe regiunea din jurul UIImageView-ului pentru a schimba imaginea.

Există câteva moduri prin care putem face asta, însă o modalitate simplă este să creăm un buton invizibil deasupra UIImageView-ului şi să îl setăm astfel încât să obţinem un răspuns atunci când butonul este apăsat. Putem de asemenea să adăugăm o etichetă de tipul UILabel sub imagine cu mesajul “Apasă pentru a schimba poza” dacă nu este nici o imagine setată.

Deci trage un buton dreptunghiular rotund de tipul Round Rect Button din bibliotecă şi redimensionează-l pentru a avea exact aceeaşi mărime şi poziţie ca şi UIImageView-ul. Pentru a îl face invizibil, în a patra opţiune (Inspectorul de atribute Attributes Inspector) schimbă tipul la valoarea Custom. Apoi în a cincea opţiune (Inspectorul de dimensiune Size Inspector) setează atributele de autodimensionare ca în imaginea de mai jos:

 Atributele de autodimensionare

În sfârşit, trage o etichetă de tipul UILabel din bibliotecă, plasează-l în mijlocul UIImageView-ului şi dă dublu click pentru a edita textul, schimbându-l cu “Apasă pentru a schimba poza”. Apoi schimbă alinierea textului pe centru. De asemenea, trage eticheta în sus câteva poziţii în XIB pentru a fi în spatele UIImageView-ului (lista este ordonată de jos în sus):

Setează eticheta pentru a apărea în spate

Apoi în a cincea opţiune (Inspectorul de dimensiune Size Inspector) setează atributele de autodimensionare ca în imaginea de mai jos:

Atributele de autodimensionare

Înainte să mergi mai departe, poţi să verifici dacă ai setat corect toate atributele de autodimensionare selectând controlul grafic detaliat Detail View Controller şi schimbând orientarea de pe verticală pe orizontală în a patra opţiune (Inspectorul de atribute Attributes Inspector):

Testarea funcţionării corecte a atributelor de autodimensionare şi schimbările de orientare în editorul grafic Storyboard
Dacă ceva nu este în regulă, nu-ti face griji – pur şi simplu treci înapoi pe verticală şi verifică încă o dată setările.

În sfârşit! Am adăugat toate controalele de care avem nevoie, deci tot ce avem de făcut acum este să conectăm totul cu variabilele specifice din clasa noastră.

Pentru a face asta, mai întâi selectează Editorul de asistenţă (al doilea buton în secţiunea “Editor” din bara de instrumente de sus) şi asigură-te că e setat la AutomaticDetailViewController.h:

Selectarea editorului de asistenţă

Apoi ţine apăsată tasta Ctrl, dă click pe UITextField şi trage mouseul spre DetailViewController.h, chiar înainte de @end. O fereastră va apare şi îţi va permite să conectezi UITextField-ul la o proprietate din clasa ta. Numeşte-o titleField şi dă click pe Connect.

Conectarea controlului grafic de tip text la o proprietate

Repetă asta pentru controlul grafic de tip imagine (dar conectează-l la o variabilă numită imageView) şi pentru Rate View (dar conectează-l la o variabilă numită rateView).

De asemenea, vrem să facem în aşa fel încât atunci când butonul este apăsat o metodă este apelată în clasa noastră. Pentru a face asta, ţine apăsată tasta Ctrl, fă click şi trage mouseul chiar până înainte de @end, aşa cum ai procedat când ai conectat celelalte controale. De data aceasta selectează Action pentru tipul conexiunii, numeşte-o addPictureTapped şi dă click pe Connect.

Conectarea unui buton la o metodă în editorul Storyboard

Observă cum în mod implicit este selectat evenimentul “Touch Up Inside” pentru noi. Aceasta este bine deoarece înseamnă că atunci când degetul utilizatorului este ridicat de pe buton (deci butonul a fost apăsat) metoda noastră va fi apelată.

Poţi de asemenea conecta şi alte acţiuni cu metode de răspuns. De exemplu, există o acţiune asociată controlului grafic de tip text atunci când textul se schimbă şi vrem să primim un răspuns atunci când acest lucru se întâmplă.

Pentru a face asta, ţine apăsată tasta Ctrl, fă click şi trage mouseul de la UITextField chiar până înainte de @end şi de asemenea setează tipul de conexiune la valoarea Action. Evenimentul este setat în mod implicit la valoarea Editing Did End – schimbă asta cu Editing Changed. Numeşte metoda titleFieldTextChanged şi dă click pe Connect.

Ultimul lucru pe care îl avem de făcut este să setam clasa noastră ca şi delegatul controlului grafic de tip text. Uneori primirea răspunsurilor în urma acţiunilor executate asupra unui control grafic nu este suficient – ele pot avea şi alte informaţii de comunicat, iar controlul grafic de tip text este un exemplu în acest sens.

Pentru a face asta, , ţine apăsată tasta Ctrl, fă click pe controlul grafic de tip text, trage cu mouseul o linie de la cercul mic din dreapta valorii “delegate” până la controlul grafic detaliat şi dă drumul la mouse.

Setează delegatul controlului grafic de tip text

În acest moment, fişierul tău DetailViewController.h ar trebui să arate astfel:

 
#import <UIKit/UIKit.h>
 
@interface DetailViewController : UIViewController
 
@property (strong, nonatomic) id detailItem;
 
@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (weak, nonatomic) IBOutlet UITextField *titleField;
@property (weak, nonatomic) IBOutlet RateView *rateView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
- (IBAction)addPictureTapped:(id)sender;
- (IBAction)titleFieldTextChanged:(id)sender;
 
@end

S-ar putea să observi nişte tipuri ciudate mai sus IBOutlet şi IBAction. Acestea sunt “cuvinte magice” pe care editorul grafic Storyboard le caută pentru a ne permite să asociem controalele grafice pe care le adăugăm în constructorul de interfeţe grafice cu proprietăţi din clasa noastră. În principiu dacă punem atributul IBOutlet sau IBAction langă o proprietate sau metodă, constructorul de interfeţe grafice Interface Builder îl va detecta şi astfel îl vom putea conecta mai târziu.

Prin crearea acestora cu editorul grafic Storyboard, acesta a conectat deja proprietăţile cu controalele grafice în mod automat pentru noi, însă poţi vedea conexiunile ţinând apăsată tasta Ctrl şi făcând click pe una dintre ele în Detail View Controller. Apropo, aceste lucruri se numesc “outlets”.

Trebuie să facem nişte mici modificări asupra controlului nostru grafic: implementarea protocoaleleor specifice delegaţilor, adăugarea unei proprietăţi pentru un selector de imagini şi modificarea lui detailItem pentru a specifica că este de tipul ScaryBugDoc, deoarece acesta este elemental detaliat pe care îl vom afişa. Deci modifică următoarele:

 
#import <UIKit/UIKit.h>
#import "RateView.h"
 
@class ScaryBugDoc;
 
@interface DetailViewController : UIViewController <UITextFieldDelegate, RateViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate>
 
@property (strong, nonatomic) ScaryBugDoc * detailItem;
@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (weak, nonatomic) IBOutlet UITextField *titleField;
@property (weak, nonatomic) IBOutlet RateView *rateView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) UIImagePickerController * picker;
 
- (IBAction)addPictureTapped:(id)sender;
- (IBAction)titleFieldTextChanged:(id)sender;
 
@end

Bine în sfârşit am terminat cu setarea interfeţei grafice şi a fişierului asociat de tip header – hai să mergem la implementare!

Implementarea controlului nostru grafic detaliat

Vom face o serie de modificări în fişierul DetailViewController.m. Este foarte mult cod aici, deci îl vom parcurge bucată cu bucată.

1) Importă fişierele de care vei avea nevoie

 
// La începutul fişierului
 
#import "ScaryBugDoc.h"
#import "ScaryBugData.h"
#import "UIImageExtras.h"
 
// Adaugă în secţiunea de sintetizare
 
@synthesize picker = _picker;

Ar trebui să fii un expert la asta de acum!

2) Setează controlul grafic de evaluare

 
// Înlocuieşte conţinutul lui configureView cu următoarele:
 
- (void)configureView
{
 
// Actualizează interfaţa grafică cu utilizatorul pentru elementul detaliat.
 
 self.rateView.notSelectedImage = [UIImage imageNamed:@"shockedface2_empty.png"];
   self.rateView.halfSelectedImage = [UIImage imageNamed:@"shockedface2_half.png"];
    self.rateView.fullSelectedImage = [UIImage imageNamed:@"shockedface2_full.png"];
    self.rateView.editable = YES;
    self.rateView.maxRating = 5;
    self.rateView.delegate = self; 
 
}

În metoda configureView(ce este apelată din metoda viewDidLoad) setăm proprietăţile controlului grafic de evaluare RateView. Pentru mai multe detalii, uită-te peste tutorialul Cum să creezi un ecran personalizat în iOS 5: Un control grafic de evaluare de 5 stele

3) Activează autorotaţia

 
// Înlocuieşte instrucţiunea de returnare din shouldAutorotateToInterfaceOrientation cu:
 
return YES;

În metoda shouldAutorotateToInterfaceOrientation returnăm YES deoarece am setat deja toate atributele de autodimensionare în constructorul de interfeţe grafice Interface Builder! Aceasta va permite utilizatorului să rotească interfaţa grafică de la o orientare la alta, iar controalele noastre se vor redimensiona în funcţie de atributele de autodimensionare pe care le-am setat.

4) Setează starea iniţială a interfeţei grafice cu utilizatorul

 
// Adaugă la sfârşitul lui configureView
 
if (self.detailItem) {
 
    self.titleField.text = self.detailItem.data.title;
    self.rateView.rating = self.detailItem.data.rating;    
    self.imageView.image = self.detailItem.fullImage;
 
}

Aici pur şi simplu configurăm interfaţa grafică cu utilizatorul pe baza insectei ce a fost selectată.

5) Gestionarea controlului grafic de tip text şi de tip evaluare

 
- (IBAction)titleFieldTextChanged:(id)sender {
    self.detailItem.data.title = self.titleField.text;
}
 
#pragma mark UITextFieldDelegate
 
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}
 
#pragma mark RateViewDelegate
 
- (void)rateView:(RateView *)rateView ratingDidChange:(float)rating {
    self.detailItem.data.rating = rating;
 
}

Setăm ca metoda titleFieldValueChanged să fie apelată de fiecare dată când utilizatorul schimbă valoarea controlului grafic de tip text, deci actualizăm de asemenea şi modelul ori de câte ori aceasta se modifică.

Metoda textFieldShouldReturn se apelează atunci când utilizatorul apasă pe tasta de revenire de pe tastatură. Apelăm metoda resignFirstResponder pentru ca tastatura să dispară de pe ecran atunci când acest lucru se întâmplă.

Metoda rateView:ratingIsChanged este apelată atunci când utilizatorul alege o nouă evaluare deoarece ne-am setat ca şi delegatul controlului grafic de tip evaluare RateView, aşa că atunci când acest lucru se întâmplă actualizăm modelul nostru.

În caz că te întrebai, directivele #pragma sunt doar instrucţiuni speciale pe care XCode le poate interpreta pentru a seta separatori în lista de funcţii a editorului din punct de vedere organizaţional:

Utilizarea directivei pragma pentru organizarea codului în XCode

6) Afişează selectorul de imagini şi prelucrează rezultatele

 
- (IBAction)addPictureTapped:(id)sender {
    if (self.picker == nil) {   
        self.picker = [[UIImagePickerController alloc] init];
        self.picker.delegate = self;
        self.picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        self.picker.allowsEditing = NO;    
    } 
    [self.navigationController presentModalViewController:_picker animated:YES];    
}
 
#pragma mark UIImagePickerControllerDelegate
 
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissModalViewControllerAnimated:YES];
}
 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {    
 
    [self dismissModalViewControllerAnimated:YES];
 
    UIImage *fullImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage]; 
    UIImage *thumbImage = [fullImage imageByScalingAndCroppingForSize:CGSizeMake(44, 44)];
    self.detailItem.fullImage = fullImage;
    self.detailItem.thumbImage = thumbImage;
    self.imageView.image = fullImage;
}

Noi setăm ca metoda addPictureTapped să fie apelată de fiecare dată când utilizatorul apasă pe butonul invizibil de deasupra imaginii UIImage, deci aici creăm selectorul de imagini UIImagePicker (dacă nu există deja) şi setăm sursa pozelor ca fiind biblioteca de poze (poţi de asemenea alege şi alte surse ca de exemplu camera foto). Ne setăm ca şi delegat pentru a putea primi răspuns atunci când utilizatorul a terminat de selectat fotografia. În final, afişăm selectorul de imagini ca şi un control grafic modal, ceea ce înseamnă că va ocupa întreg ecranul.

În final implementăm protocolul selectorului de imagini, adică metodele de selecţie a unei imagini de către utilizator şi de anulare a selecţiei. În oricare din aceste situaţii, închidem controlul modal. Dacă utilizatorul a ales imaginea, obţinem întreaga imagine şi de asemenea o versiune redusă a ei (pe care o redimensionăm cu clasa UIImageExtras pe care am adăugat-o mai devreme) şi actualizăm atât modelul cât şi interfaţa grafică.

O Doamne – presupun că te-ai săturat de scris cod acum nu? Nu-ţi face griji – suntem aproape gata, mai trebuie doar să conectăm ecranul creat în aplicaţie!

Integrarea ecranului nostru detaliat

Această operaţiune ar trebui să fie destul de rapidă. Mai întâi, deschide MainStoryboard.storyboard şi selectează celula tabelului în Master View Controller. Ţine apăsată tasta Ctrl, dă click şi trage mouseul de la acea celulă până la Detail View Controller şi o fereastră va apare care te va întreba dacă vrei să realizezi o conexiune de tipul Push, Modal sau Custom. Alege Push şi ar trebui să vezi o săgeată conectând controalele grafice:

Conectarea controalelor grafice cu o tranziţie de tipul push

Acum trebuie doar să îl facem să arate insecta corectă în controlul grafic detaliat atunci când un rând din tabel este selectat. Pentru a face asta, deschide fişierul MasterViewController.m şi fă următoarele modificări:

 
//Adaugă la începutul fişierului
#import "DetailViewController.h"
 
// Adaugă la sfârşitul lui viewWillAppear
 
[self.tableView reloadData];
 
// Adaugă la sfârşitul fişierului
 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    DetailViewController *detailController =segue.destinationViewController;
    ScaryBugDoc *bug = [self.bugs objectAtIndex:self.tableView.indexPathForSelectedRow.row];
    detailController.detailItem = bug;
 
}

Mai întâi, observă că în metoda viewWillAppear reîncărcăm datele din tabel. Aceasta se întâmplă deoarece atunci când utilizatorul se află în interfaţa grafică detaliată s-ar putea să schimbe numele sau poza insectei şi noi vrei ca numele şi imaginea actualizate să apară în tabel atunci când se revine acolo. O modalitate uşoară de a face asta este să se reîncarce întregul tabel, deci facem asta aici.

Apoi, aminteşte-ti că setăm lucrurile în editorul grafic de interfeţe grafice Storyboard în aşa fel încât de fiecare dată când un rând este selectat, Detail View Controller-ul va fi pus pe stivă. Atunci când aceasta se întâmplă, se apelează metoda prepareForSegue, deci avem o ocazie de a trimite controlului grafic detaliat orice informaţie de care are nevoie. În acest caz, pur şi simplu trimitem insecta selectată pentru a fi afişată.

În sfârşit, suntem gata! Compilează şi rulează proiectul tău şi dacă totul funcţionează bine ar trebui să poţi acum să deschizi controlul grafic detaliat pentru o insectă, să schimbi numele insectelor, să le schimbi pozele, să le evaluezi şi chiar să îl roteşti către orice orientare!

Exemplu de control grafic detaliat

Unde să mergi de aici?

Iată un proiect model ce conţine întreg codul sursă pe care l-am dezvoltat până acum în acest tutorial.

Te rog să mă informezi dacă orice am discutat mai sus este confuz sau dacă ţi-ar place să tratez oricare aspect mai detaliat.

În ultima parte din această serie de tutoriale, vom trata adăugarea şi ştergerea de insecte noi, adăugarea unei iconiţe şi a unei imagini implicite proiectului nostru şi gestionarea corectă a operaţiunilor cu timp de desfăşurare îndelungat.

Ray Wenderlich

Ray is an indie software developer currently focusing on iPhone and iPad development, and the administrator of this site. He’s the founder of a small iPhone development studio called Razeware, and is passionate both about making apps and teaching others the techniques to make them.

When Ray’s not programming, he’s probably playing video games, role playing games, or board games.

Comentariile utilizatorului

0 Comment

Other Items of Interest

Buletinul de ştiri lunar online al lui Ray

Înregistrează-te pentru a primi un buletin de știri lunar cu siteurile mele de dezvoltare preferate și primești un tutorial amplu gratuit ca și bonus!

Fă reclamă cu noi!

Hang Out With Us!

Every month, we have a free live Tech Talk - come hang out with us!


Coming up in May: Procedural Level Generation in Games with Kim Pedersen.

Sign Up - May

Coming up in June: WWDC Keynote - Podcasters React! with the podcasting team.

Sign Up - June

Vote For Our Next Book!

Help us choose the topic for our next book we write! (Choose up to three topics.)

    Loading ... Loading ...

Cărțile noastre

Echipa noastră

Echipa de tutoriale

  • Kyle Richter
  • Dani Arnaout
  • Julian Meyer

... 55 în totalitate!

Echipa editorială

... 22 în totalitate!

Code Team

  • Orta Therox

... 1 în totalitate!

Echipa de traducători

  • Heejun Han
  • Victor Grushevskiy

... 38 în totalitate!

Experți în materie de subiecte

... 4 în totalitate!