You are on page 1of 521

Az iPhone SOK programozsa Objective-C nyelven

Wei -Me ng Lee

2011

Az. iPhone SDK programozsa Objective-C nyelven Eeginning iPhone SDK Programming with Objective-C Wei-Meng Lee

Copyright 2010 by Wiley Publishing, Inc., Indianapolis, Indiana Origirral English language edition published by John Wiley & Sons International Rights, Inc. Ali rights reserved. Ths translation published under license. Magyar fordts (Hungarian translation) SZAK Kiad 2011. A2 eredeti angol nyelv kiads jogainak tulajdonosa a Wiley Publishing, Inc. A magyar fordts a Wiley Publishing, Inc. engedlyvel jelenik meg. Fordtotta a SZAK Kiad fordtcsoportja: Balask Attila, Domoszlai Lszl, Dzurdzik dm, Herczeg Gza, Juhsz Gergely, Losonczy Gerg, Neuhauser Mrk, Srosi dm, Ti ber Melinda, Varga Pter A fordtst szakmailag ellenrizte: Forstner Bertalan

ISB

978-963-9863-19-4

A knyv fordtsa a Kilgray Kft. MemoQ (http:/ /www.memoqtm.com) program segtsgvel kszlt.

Minden jog fenntartva. Jelen knyvet, illetve annak rszeit a kiad engedlye nlkl tilos reproduklni, adatrgzt rendszerben trolni, brmilyen formban vagy eszkzzel elektronikus ton vagy ms mdon kzlni.

SZAK Kiad Kft. Az 1795-ben alaptott Magyar Knyvkiadk s


Knyvterjesztk

Egyeslsnek a tagja 2060 Bicske, Difa u. 3. www.szak.hu e-mail:

Tel.: 36-22-350-209 Fax: 36-22-565-311


Fszerkeszt:

info@szak.hu Kiadvezet: Kis dm, e-mail: adam.kis@szak.hu Kis Balzs, e-mail: balazs.kis@szak.hu

Csaldomnak: Kiiszonm a megrtst s a tmogatst, ame!Jet a kf!JV ksiftse sorn t/etek kaptam. 5 zeretfek benneteket/

Tartalomjegyzk
A szerzrl ........................................................... xvii

, as .. .. Koszonet ny1t van1't, ............................................... . xix


Bevezets ........................................................... . xxi
Kinek sz l ez a knyv? ................................................................................ xx Mivel foglalkozik ez a knyv? .................................................................... xx Hogyan pl fel ez a knyv? ........................................................................ xxv
Mi szksges a knyv hasznlathoz? ........................................................ xxv

Jellsek ....................................................................................................... xxv Forrskd .................................................................................................... xxvi Hibajegyzk ............................................................................................... xxvii

p2p.wrox.com ........................................................................................... xxviii

l. rsz: Bevezets
1. Bevezets az i Phone programozsba ....................... 3
A:z iPhone SDK beszerzse .............................................................................. 4 A:z iPhone SDK rszei ...................................................................................... S

Xcode .................................. ......................................................................................... 6 iPh one Simulator ........................................................................................................ 8 Mire kpes az iPhone Simulato r? ....................................................................... 9 Alkalmazsok eltvoltsa az iPhone Sirnulatorbl... ..................................... 11 Interface Builder ....................................................................................................... 12 Instrurnents ............................................................................................................... 12
A:z iPhone OS felptse ................................................................................ 14

Nhny tovbbi hasznos tudnval ............................................................... 17


Az iPhone OS verzii .............................................................................................. 18 Tesztels tnyleges eszkzkn ............................. ................................................. 19 Kpernyfelbonts ................................................................................................... 19 Egyablakos alkalmazsok ......................................................................................... 20 Httrben fut alkalmazsok nlkl ....................................................................... 20 Kls felek alkalmazsaira vonatkoz korltozsok ............................................ 21

Tartalomjegyzk

2.

Az

els

Hello World! alkalmazs megirsa ................ 23

Ismerkeds az Xcode-dal .............................................................................. 24 Az Interface Builder hasznlata .............................................................................. 28 A kpernytjols megvltoztatsa......................................................................... 31 Az elemek trendezse ........................................................................................... .. 33 Programkd rsa ...................................................................................................... 35

Az alkalmazs ikonjnak testre szabsa ....................................................... 37

3.

Kivezetsek, mveletek s nzetvezrlk ............... 41


A kd s a felhasznli fellet
egyttmkdsnek

az alapjai.. .................. .42

XIB-fjlok szerkesztse ............................................................................................ 45 Delegcik .......... ................................................................................................. 46 zetvezrlk ..................................................................................................... 47 A View ablak megtervezse .............................................................................. 48 Kivezetsek s mveletek ltrehozsa ............................................................. 50 A nzetvezrl kapcsolata a mvelethez s a kivezetshez .......................... 57 Kivezetsek exponlsa tulajdonsgokknt .................................................... 60 A mvelet leprogramozsa ............................................................... ................. 61 Egy sszetettebb plda ............................................................................................. 62 A mveletek s kivezetsek meghatrozsa .................................................... 62 A mveletek s kivezetsek sszektse ......................................................... 64 A mveletek megvalstsa ............................................................................... 64
Nzetvezrlk

................................................................................................ 66

hozzadsa ......................................................................................... 67 A nzet szemlyre szabsa ............................................................. ....................... ... 70

zetvezrl

4.

Az elemek megismerse ...................................... 75


Az elemek hasznlata .................................................................................... 76
Az Alert elem hasznlata ......................................................................................... 77 Az Action tbla hasznlata ...................................................................................... 81 A Page vezrlelem s az Image elem ................................................................... 84 Elemek csoportostsa szegmentlt vezrlelemrnel ........................................... 91 A Web View hasznlata ........................................................................................... 95

Elemek dinamikus hozzadsa programkd hasznlatval.. ....................... 98

Az elemek hierarchija ................................................................................ 102


Vlts a nzetek kztt ................................................................................ 103 A vlts animlsa ................................................................................................... 111 Adatok tadsa nzetek kztt ............................................................................. 113

viii

Tartalomjegyzk

5.

Bevitel a
A

billentyzetrl. ...................................

119

billentyzet

hasznlata ............................................................................. 120

A beviteli lehet sgek szemlyre szabsa ......................................... .......... 122 A A A


billentyzet billentyzet

eltntetse ................................................. ...................................... 124 tlltsa szrnbillentyzette .......... ............................................... 127 billentyzet automatikus megjelentse az elem betltsekor. ...................... 132 jelenltnek rzkelse ............................................................ 133

Billentyzet

6.

kperny

forgatsa ........................................ 145

Reagls az eszkz forgatsra ................................. .................................. 145


Klnbz kpernytjolsok .............................................................................. 149 A forgats kezelse .............................................. ................................................... 150 willAnmateFirstHalfOfRotationTolnterfaceOrientation: ......................... 150 willAnmateSecondHalfO fRotationFromlnterfaceOrientation: ........ ........ 151 willRotateTolnterfaceOrientation: ................................................................. 151 willAnmateRotationTolnterfaceOrientation: .............................................. 152

kperny

programozott forgatsa ............................................................ 157

Forgats programfuts kzben ....................... ................................ ...................... 157 A nzet adott tjols megjelentse a betltskor.. ........................................... 158

ll. rsz: iPhone-alkalmazsok kszitse


7. Elemvezrlk .................................................. 163
Ablakalap alkalmazs ltrehozsa ............................................................. 164
Elemvezrl
Mveletek

programozott hozzadsa ............................................................... 171 ltrehozsa s sszekapcsolsa ................... ....................................... 175

V l ts msik nzetre .................................................................................... 178 A nzetvltsok animlsa ............................................................................ 181

8.

Eszkzsv- s navigcis alkalmazsok .................. 187


Eszkzsv-alkalmazsok ............................................................................. 189 Elemek elhelyezse az eszkzsvon ..................................................................... 193 Hogyan jelentsk meg az eszkzsv-alkalmazsokat a klnbz tjolsoknl? ............................................................................... 199 Navigcialap alkalmazsok ..................................................................... 202 avigls msik elemre .......................................................................................... 207

ix

Tartalomjegyzk

9. Segdprogramok.............................................. 215
Segdprogramok ksztse .......................................................................... 216 tmenetstlusok ........................................................................................... 221 j elem hozzadsa a segdprogramhoz .................................................... 222

lll. rsz: Adatok megjelenitse s trolsa


10. A Tablenzet hasznlata ................................... 233
Egyszer

Tab le nzet .................................................................................. 234

Fejlc s lblc hozzadsa .............................. ...................................................... 240 Kp hozzadsa ...................................................................................................... 241 Kijellt elem megjelentse .................................................................................... 242 Behzs .................................................................................................................... 245

Szakaszok megjelenitse ............................................................................. 245


Indexels ...................................................................................................... ............ 254 Keressi lehetsg .................................................................................................. 254 Rszletek s pipk.. ....................... ............... ........................................................... 265

11. Alkalmazsbellitsok ....................................... 269


Alkalmazspreferencik ltrehozsa ........................................................... 271 A belltsok rtkeinek programozott elrse ........................................... 279
A bellitsok rtkeinek betltse ........................................................................ 286 A bellitsok rtkeinek alaphelyzetbe llitsa .................................................... 288 A bellitsok rtkeinek az elmentse ................................. ................................. 289

12. Fjlkezels .................................................... 293


Az alkalmazsmappk megismerse .......................................................... 294 A Documents s a Library mappk hasznlata ................................................... 295 Fjlok trolsa az ideiglenes mappban .......................................... ......... ............ 299

Tulajdonsglistk hasznlata ...................................................................... 300

13. Adatbzis-trols az SQLite3 hasznlatval ............ 311


Az SQLite3 hasznlata ................................................................................. 312

Adatbzis ltrehozsa s megnyitsa .......................................................... 314


A ltrehozott adatbzis vizsglata ......................................................................... 316 Tbla ltrehozsa .................................................................................................... 316

Tartalomjegyzk

Rekordok beszrsa ......................................... ...................................................... 318 Vltozk sszekapcsolsa ...................................................................................... 320 Rekordok beolvassa .............................................................................................. 322

IV. rsz: Fej lett i Phone-programozsi mdszerek


14. Tbbrintses alkalmazsok programozsa ............ 329
rintsek rzkelse .................................................................................... 330 Tbbes rints rzkelse ........................................................................... 336

A csptetsgesztus megvalstsa .......................................................................... 340 A hzsgesztus megvalstsa .......................... ..................................................... 346

15.

Egyszer

animcik .......................................... 349

Az N STirner osztly hasznlata .................................................................. 349

A vizulis vltoztats animlsa ............................................................................ 356


Nzetek transzformlsa ............................................................................. 356

Eltols ...................................................................................................................... 358 Forgats .................................................................................................................... 359 tmretezs ............................................................................................................. 361


Kpsorozat animlsa .................................................................................. 361

16. Abepitett alkalmazsok elrse ........................ 365


E-mailek kldse ......................................................................................... 366

A Sa fari meghvsa ................................................................................................. 369 A Phone alkalmazs meghvsa ............................................................................ 369 Az SMS alkalmazs meghvsa .............................................................................. 370
A Carnera s a Photo Library elrse .......................................................... 371

A Photo Library alkalmazs elrse ..................................................................... 371 A Carnera alkalmazs elrse ................................................................................. 377
A Contacts alkalmazs elrse .................................................................... 381

vjegy hozzadsa ................................................... ............................................. 386 vjegy trlse ........................................................................................................ 388

xi

Tartalomjegyzk

17. Hozzfrs a hardverhez................................... 391


A
gyorsulsmr

hasznlata ........................................................................ 391

A rzs szlelse az iPhone OS2 s a korbbi verzikban .......................... 396 A Shake API hasznlata a rzs szlelshez az OS 3.0 alatt ..................... 396
Mvelet

vgrehajtsa az eszkz rzsa kzben .......................................... 403

Helyalap szolgltatsok ............................................................................. 404 Trkpek megjelentse ..................... ..................................................................... 409

V. rsz: Fggelkek
A fggelk: A gyakorlatok megoldsai ........................ 417
A 2. fejezet feladatainak a megoldsa ......................................................... 417 Vlasz az 1. krdsre .............................................................................................. 41 7 Vlasz a 2. krdsre ................................................................................................ 41 7 A 3. fejezet feladatainak a megoldsa ......................................................... 418 Vlasz az 1. krdsre ..................................................................... ......................... 418 Vlasz a 2. krdsre ................................................................................................ 418 A 4. fejezet feladatainak a megoldsa ......................................................... 418 Vlasz az 1. krdsre .............................................................................................. 418 Vlasz a 2. krdsre .... ............................................................................................ 419 Vlasz a 3. krdsre ...................................................... .......................................... 41 9 Az 5. fejezet feladatainak a megoldsa ....................................................... 419 Vlasz az 1. krdsre .................................................. ...................................... ...... 41 9 Vlasz a 2. krdsre ................................................................................................ 420 Vlasz a 3. krdsre ................................................................................................ 420 A 6. fejezet feladatainak a megoldsa ......................................................... 420 Vlasz az 1. krdsre ......................... ..................................................................... 420 Vlasz a 2. krdsre ............ .................................................................................... 420 A 7. fejezet feladatainak a megoldsa ......................................................... 421 Vlasz az 1. krdsre .............................................................................................. 421 Vlasz a 2. krdsre ................................................................................................ 421 Vlasz a 3. krdsre ................................................................................................ 421 A 8. fejezet feladatainak a megoldsa ......................................................... 422 Vlasz az 1. krdsre .............................................................................................. 422 A 9. fejezet feladatainak a megoldsa ......................................................... 427 Vlasz az 1. krdsre ......................................................................................... ..... 427 Vlasz a 2. krdsre .................................. ................................ ,............................. 428
xii

Tartalomjegyzk

A 10. fejezet feladatainak a megoldsa ... ........ ..... ..... ............. ......... ............. 429
Vlasz az 1. krdsre .............................................................................................. 429 Vlasz a 2. krdsre ................................................................................................ 429 Vlasz a 3. krdsre ................................................................................................ 429

A 11. fejezet feladatainak a megoldsa ........ .. ............................ .......... .... .... 430
Vlasz az 1. krdsre ...... ........................................................................................ 430 Vlasz a 2. krdsre .......... ...................................................................................... 430 Vlasz a 3. krdsre ................................................................................................ 430

A 12. fejezet feladatainak a megoldsa .. ... .. ...... ........ .................... .. ...... ....... 430
Vlasz az 1. krdsre .............................................................................................. 430 Vlasz a 2. krdsre ................................................................................................ 431 Vlasz a 3. krdsre .............................................................................................. .. 431

A 13. fejezet feladatainak a megoldsa ......... ... ..... .................... ................... 431
V l asz az 1. krdsre .............................................................................................. 431 Vlasz a 2. krdsre ............................ ........ ,........................................................... 432 Vlasz a 3. krdsre ................................................................................................ 432

A 14. fejezet feladatainak a megoldsa .... .. ............................................. .. ... 432


Vlasz az 1. krdsre .............................................................................................. 432 Vlasz a 2. krdsre .........., ..................................................................................... 432 Vlasz a 3. krdsre .................................................... ............................................ 433

A 15. fejezet feladatainak a megoldsa .............................................. .. ... ..... 433


Vlasz az 1. krdsre ., ............... ............................................................................. 433 Vlasz a 2. krdsre .............................................. .................................................. 433 Vlasz a 3. krdsre ................................................................................................ 433

A 16. fejezet feladatainak a m egoldsa ............................................... ......... 433


Vlasz az 1. krdsre .................................................... ., ...... .................................. 433 Vlasz a 2. krdsre ............................................................................ ., .................. 434 Vlasz a 3. krdsre ................................................................................................ 434

A 17. fejezet feladatainak a megoldsa ...... .... .. ...... ... .. ..... ...... ..... ........ ...... .. .434
Vlasz az 1. krdsre ....................... ......................................... ., ........................ .... 434 Vlasz a 2. krdsre ................................................................................................ 434 Vlasz a 3. krdsre ........................................ ............................................ ., .......... 434

B fggelk: Az Xcode hasznlata ............................... 43 5


Az Xcode elindtsa ................... ... ......... ... .. ... ..... ... .. .. ...... ... .. .. .. .... ... ... .. ...... . 435

Tmogatott projekttpusok .................................................................................... 436 A Toolbar szemlyre szabsa ............ .................................................................... 439 Code Sense .............................................................................................................. 439 Az alkalmazs futtatsa .......................................................................................... 441

xiii

Tartalomjegyzk

H ibakeress az alkalmazsokban ............................................................... 442


Hiba ......................... ................................................................................................. 442 Figyelmeztetsek ..................................... ................................................................ 444 Trspontok bellitsa .................................................................. ............ ...... ....... 446 Az NSLog hasznlata ............................................................................................. 448 D okumentcik ...................................................................................................... 449 Research Assistant (kutatsi segd) ...................................................................... 449

C fggelk: Az Interface Builder hasznlata ................. 451


A:z xib ablak ................................................................................................. 451 A nzet m egtervezse .................................................................................. 452 A:z Inspector ablak ....................................................................................... 454
Az Attributes lnspector ablaktbla ....................................................................... 455 A Connections Inspector ablak .............................................. .............................. 456 A Size lnspector ablak ................................ ........................................ .................. . 456 Az Iden ti ty Inspector ablak ................................................................................... 457

Library (knyvtr) ........................................................................................ 457 Kivezetsek s


mvele tek ............................. ...............................................

458

Kivezetsek s mveletek ltrehozsa ................................................................. 458 Kivezetsek s mveletek csatlakoztatsa ........................................................... 461 1. mdszer .................................................... .............................. ....................... 461 2. mdszer ............................................. ................... .......................... ............... 462

D fggelk: Objective-C gyorstalpal ......................... 465


Direktvk ................................................................................ .................... 465 Osztlyok ..................................................................................................... 466
@interface .......................... ................................................................. .................... 466 @implementation ............................................ ....................................................... 467 @class .............................................................................................. ....................... ,467 Osztly pldnyostsa ........................................................................................... 469 Mezk ....................................................................................................................... 470 Hozzfrsi jogosultsgok ..................................................................................... 470 Metdusok ............................................................................................................... 471 zenetklds (metdusok hvsa) ................... ..................................................... 473 Tulajdonsgok ......................................... ..................................... ........................... 475 lnicializtorok. ............................... .......................................................................... 478

xiv

Tartalomjegyzk

Memriakezels ........................................................................................... 481 Referenciaszmlls ................................................................................................ 481 alloc .................... .. .............................................................................................. 481 new ..................................................................................................................... 482 retain ................................................................................ ,................................. 482 release ................................................................................................................. 483 Knyelmi fggvnyek s az a utorelease ........................................................ 485 A utorelease Po ol .............................................................................................. 487 dealloc ................................................................................................................ 487 Memriakezelsi tippek .................... ............................................................... 488 Protokollok ................................................................................................... 489 Deleglt .............................................................. ...................................................... 490 Szelektorok ................................................................................................... 492 Kategrik .................................................. .................................................. 493

E fggelk: Tesztels konkrt iPhone-on vagy i Pod Touchen .. ...................................... 495


Regisztrls az iPhone
fejleszti

programra ............................................... 495

Az Xcode ellnditsa ..................................................................................... 496


Tanstvny-alrsi krelem ltrehozsa ................................................... 497 Bejelentkezs az iPhone
fejleszti

program portljra ............................... 499

Trgymutat ........................................................ 511

XV

A szerzrl
Wei-Meng Lee a Developer Learning Solutions (www.learn2develop.net) technolgusa s alaptja. A technolgiai cg szakterlete a Microsoft s Mac OS X technolgik gyakorlati kpzseinek fejlesztse. Wei-Meng a Wrox s O'Reilly kiadk hrneves szerzje . Wei-Meng az iPhone programozsi kurzust elszr Szingaprban indtotta el, s azta rengeteg pozitv visszajelzst kapott. Az iPhone programozsi kpzs gyakorlati megkzeltsvel a tma sokkal knnyebben elsajtthat, mint elmleti knyvek, oktatsi anyagok vagy az Apple-dokumentci bngszsvel. A szerzvel a weimenglee@learn2develop.net e-mail cmen lehet felvenni a kapcsolatot.

Ksznetnyi Ivnits
Egy knyv megrsa nndig nagy elktelezettsget jelent. Klnsen igaz ez az iPhoneprogtamozsrl szl munka megrsra. A knyv vgl elkszlt, s szeretnm megksznni mindazok segtsgt, aki ezt lehetv tettk. Elszr is szeretnk ksznetet mondani Scott Meyersnek, aki hitt bennem, arnikor leszerzdtetett. Remlem, nem okoztam neki csaldst. Ksznet jr Ami Sullivannek, a szerkesztmnek, az segtsge nlkl a knyvet nem fejezhettem volna be. rs kzben lefoglaltak az iPhone-kurzusok, m a kpzsek szneteiben Ami folyamatosan rsra buzdtott. Ragaszkodott hozz, hogy betartsam a szigor hatridket, de nagyon megrt volt, ha kicsit megcssztak a dolgok. Nagyra rtkelem irntam tanstott trelmt, nlkle az olvask most nem tarthatnk kezkben ezt a knyvet. szinte ksznettel tartozom ezrt. Vgl, de nem utolssorban szeretnk ksznetet mondani szleirnnek s felesgemnek, Sze W nak a nekem nyjtott tmogatsrt. nzetlenl alaktottk letket az n beosztsomnak megfelelen, arnikor a kziraton dolgoztam. Felesgem hossz jszakkon t virrasztott mellettem, mikzben mindent flretve dolgoztam, hogy betartsam a hatridket. Ezrt neki s aszleimnek azt kell mondanom: szeretlek benneteket. Utolsknt ksznet illeti szeretette mlt kutynkat, Ookiit, mert mindvgig mellettem maradt, noha fogalma sem volt, hogy mirt tm llandan a billentyzetet.

Bevezets
Az iPhone SDK-t hivatalosan 2008. mrcius 6-n az Apple Town Hallban egy megbeszlsen jelentettk be. Kezdetben az iPhone-fejlesztst a legnagyobb titokban tartottk, ugyanis az Apple titoktartsi szerzdst (Non-Disclosure Agreement, NDA) kttt azokkal a fejlesztkkel, akik letltttk az SDK-t. Tilos volt brkinek nyilvnosan beszlnie az SDK-rl s a hozz tartoz programozi interfszekrl (API-krl). Az Apple felteheten az SDK stabilitsa rdekben krte mindezt. A fejlesztk rszrl azonban rthet felhborodst vltott ki, hiszen gy nem tehettk fel krdseiket nyilvnos frumokon, s szksg esetn nem kaphattak gyors segtsget. Emellett knyvek sem szlethettek, s tanfolyamokat sem szervezhettek a tmrl. Az iPhone SDK esetn az Objective-C programozsi nyelv bevezetse sem segtett, ugyanis a nyelv elsajttsra idt kell sznni azoknak a fejlesztknek, akik korbban javarszt a fsodorba tartoz nyelvekkel dolgoztak, mint a Java, a C++, a C# vagy a VB.NET. A klvilg nyomsnak engedve az Apple vgl 2008 vgn feloldotta a titoktartsi ktelezettsget. A fejlesztk rmmel fogadtk a vltozs hrt, noha ez kiss kslekedett. A tmrl szl vitafrumok mg aznap jjel ltrejttek, az iPhone-rl szl weboldalak pedig gombamd szaporodni kezdtek. Br az iPhone-fejlesztssel kapcsolatban szmos oldal s frum ltezik, egy akadlyt nem sikerlt teljesen elhrtani: az elindulshoz befektetend tanuls mg mindig jelents kihvsnak szmt. Sok fejleszt kzd kezdetekben az Xcode s az Interface Builder hasznlatval. Egyszerre kell megbirkzni az Objective-C sszetett szintaktikjval, s folyamatosan fejben kell tartani, hogy melyik objektumot szabadtsuk fel, s melyiket nem szabad. Ez a knyv ennek az rnek a kitltsre szletett. Amikor az iPhone-fejlesztsrl kezdtem tanulni, ugyanazon az ton mentem vgig, amint a legtbb iPhone-fejleszt: rjunk egy "Hell, vilg" alkalmazst, kzdjnk az Interface Builderrel, prbljuk meg megrteni, rnit is csinl a kd, majd ismteljk meg az egsz folyamatot. Tl sokat bajldtam az elemvezrl koncepcijval is, s nehezen rtettem meg, rnirt is kell ezt hasznlnom, ha egyszeren meg akarok jelenteni egy elemet. A Windows Mobile s az Android kapcsn szerzett fejleszti htterem nem sokat rt, gy a munkt nullrl kellett elkezdenem. Ez a knyv azrt jtt ltre, hogy a kezd iPhone-fejlesztk munkjt minl knynyebb tegye. A klnbz tmkat gy trgyalja, hogy progresszverr lehessen belle tanulni anlkl, hogy elvesznnk a rszletekben. Azt vallom, hogy a legjobban gy tanulunk meg valamit, ha kzben csinljuk, ezrt van minden fejezetben szmos gyakorlat, amelyek elszr megmutatjk, hogy hogyan ptsnk fel valamit, majd bemutatjk, hogyan is mkdik a dolog.

Bevezets
Br az iPhone-programozs hatalmas tmakrt lel fel, ezzel a knyvvel az a f clom, hogy az olvas az alapoktl indulva megrtse az SDK mgtt rejl architektrt, s tisztn lssa, hogy a dolgok mirt gy mkdnek, ahogy. Nem szeretnk azonban az iPhone-programozsrl mindent bemutatni. m biztos vagyok benne, hogy a fejezetek elolvassa (s a gyakorlatok elvgzse) kell tudssal vrtezi fel az olvast az iPhoneprogamozs kilvsainak a megoldshoz.

Kinek szl ez a knyv?


A knyv elssorban a kezd iPhone-fejlesztkenk szl, akik szeremnek elkezdeni az Apple iPhone SDK segtsgvel iPhone-alkalmazsokat fejleszteni. A legjobban akkor hasznos~uk a tudnivalkat, ha van nmi programozsi gyakorlatunk, s legalbb az objektumorientlt programozsi koncepcikat ismerjk. Ha teljesen ismeretlen szmunkra az Objective-C nyelv, lehet, hogy rdemes elszr a D fggelkhez lapozni, amely ttekintst ad errl a nyelvrL A D fggelket emellett gyorsreferenciaknt is hasznlha~uk az egyes fejezetek olvassakor: a gyakorlatok vgrehajtsakor brmikor fellapozhatjuk a szintaxisokat. A fenti mdszerekbl minden bizonnyal mindenki ki tudja vlasztani a szmra legjobbat.

Mivel foglalkozik ez a knyv?


A knyv alapveten az iPhone-programozs alapjait rja le az iPhone SDK hasznlatval, mindezt 17 fejezetben s t fggelkben.

1. fejezet. Bevezets az iPhone programozsba


Az iPhone SDK fejlesztsben.
klnbz

eszkzeit ismerteti, s bemutatja hasznlatukat az iPhone-

2. fejezet. Az

els

Hello World! alkalmazs megrsa

A Hello World! alkalmazs megrshoz megismerkednk az Xcode-dal s az Interface Builderrel. A f cl az, hogy belekstoljunk a tmba, a tovbbi rszleteket a klnbz rszekkel s komponensekkel kapcsolatban a kvetkez fejezetekben trgyaljuk
3. fejezet. Kivezetsek,
mveletek

nzetvezrlk

Az iPhone-programozs alapjairl, azaz a kivezetsekrl (outlet) s a mveletekrl (action) szl. Megismerkednk azzal, hogy programkd az Interface Builderben hogyan mkdik egytt a kivezetsek s a mveletek rvn a vizulis elemekkel, s mindezek mirt szerves rszei minden iPhone-alkalmazsnak.

xxii

Mivel foglalkozik ez a knyv?

4. fejezet. Az elemek megismerse


Megtudha~uk,

hogy a klnbz elemek (View) hasznlatval hogyan pl fel iPhonealkalmazsunk felhasznli fellete (user interface, UI). Megnzzk, hogyan manipulljuk alkalmazsunk felhasznl fellett, illetve hogy mi az elemek bels trolsnak a mdja.
billentyzetrl

5. fejezet. Bevitel a

Megtudjuk, hogyan bnjunk a virtulis billentyzettel az iPhone-unkon, s szksg esetn hogyan rejtsk el a billentyzetet, illetve hogyan biztostha~uk azt, hogy az elemeket ne blokkolja a megjelen billentyzet. 6. fejezet. A
kperny

forgatsa

Megtudha~uk,

hogy hogyan rendezzk jra alkalmazsunk felhasznli fellett az eszkz elforgatsakor. Megismerhe~k a klnfle esemnyeket, amelyek ilyenkor bekvetkeznek. Azt is megtudhatjuk, hogyan szorthat r az alkalmazsunk egy bizonyos kpernytjols hasznlatra.
Elemvezrlk

7. fejezet.

Vlaszt kapunk arra, hogy hogyan hozhatunk ltre tbbfle elemet hasznl alkalmazst. Megvizsgljuk, hogyan ptsnk iPhone-alkalmazst ablakalap alkalmazssablonnal. 8. fejezet. Eszkzsv- s navigcis alkalmazsok Ez a rsz azt mutatja be, hogyan hozzunk ltre eszkzsv- s a navigcis alkalmazsokat az SDK-ban tallhat sablonokkal. Ezekkel fejlett tbbnzetes alkalmazsokat valsthatunk meg. 9. fejezet. Segdprogramok Kiderl, hogyan hozhatunk ltre egy jabb tpus alkalmazst az iPhone-ban: a segdprogramokat. 10. fejezet. A Tablenzet hasznlata
Felfedezhe~k

a leghatkonyabb elemet az iPhone SDK-ban, amelyet leggyakrabban adatsorok megjelentsre hasznlunk. Ebben a fejezetben azt is megvizsgljuk, hogyan alkalmazzunk keressi lehetsgeket a Table nzethez.

11. fejezet. Alkalmazsbelltsok Hasznlatukkal megrizhetk az alkalmazsok belltsai, gy az iPhone-ban s az iPhone Touchban tallhat Settings alkalmazssal hozzfrhetnk az alkalmazsunkhoz kapcsold belltsokhoz.

xxiii

Bevezets
12. fejezet. Fjlkezels
Kiderl, hogyan rizhetk meg alkalmazsunk adatai az adatok fjlokba mentsvel a sandbox knyvtrban. Azt is megismerhe~k, hogyan frhetnk hozz a klnbz mappkhoz alkalmazsunk sandboxban.

13. fejezet. Adatbzis-trols az SQLite3 hasznlatval


A begyazott SQLite3-adatbzisknyvtr hasznlatt ismerjk meg adataink trolsra.

14. fejezet. Tbbrintses alkalmazsok programozsa


Vlaszt kapunk arra, hogyan hasznlhatjuk iPhone-alkalmazsunkban a tbbrintses lehetsgeket, tovbb hogyan hasznljuk a klnbz gesztusokat, pldul a hres "csippents" -t (pinching).

15. fejezet. Egyszer animcik


Ez a fejezet ttekinti azokat az egyszer technikkat, amelyekkel egyszer animcikat hasznlhatunk az iPhone-ban. Azt is elsajtthatjuk, hogy mely affintranszformcikat tmogaqa az iPhone SD K.

16. fejezet. A beptett alkalmazsok elrse


Megnzzk, milyen klnb z mdokon frhetnk hozz iPhone-unk beptett alkalmazsaihoz, pldul a Photo Libraryhez, a Contactshoz stb. Azt is megismerhe~k, hogy alkalmazsainkon bell hogyan hvhatunk meg beptett alkalmazsokat, pldul a Mailt vagy a Safarit.

17. fejezet. Hozzfrs a hardverhez


Megvizsgljuk, hogyan frhetnk hozz iP hone-unk hardvereihez, pldul a gyorsulsmrhz, valamint hogyan hatrozzuk meg fldrajzi adatainkat a Core Location segitsgvel.

A fggelk. A gyakorlatok megoldsai


Az 1. fejezet kivtelvel a fejezetek vgn tallhat feladatok megoldst tartalmazza.

B fggelk. Az Xcode hasznlata


Gyors ttekintst nyjt az XCode szmos szolgltatsrl.

C fggelk. Az Interface Bullder hasznlata


ttekinti az Interface Builder szmos szolgltatst.

D fggelk. Objective-C gyorstalpal


Villmtanfolyam az O bj ective-C hasznlatrl. A programnyelvvel most is m e rked k szr ezt a fejezete t olvassk el.
el

E fggelk. Tesztels konkrt iPhone-on vagyiPod Touchon


Vlaszt kapunk arra, hogy hogyan tesztelhetnk egy alkalmazst egy valdi eszkzn.

xxiv

Hogyan pl fel ez a knyv?

Hogyan pl fel ez a knyv?


A knyv az iPhone-programozs elsajtsnak feladatt szmos kisebb rszre bon~a, gy minden tmakrt nyugodtan vgiggondolhatunk, neltt elmlyednnk a kvetkez ben. Emellett van nhny fejezet, amely a korbbi fejezetekben mr rintett tmkat is trgyal. Ennek az az oka, hogy az Xcode-ban s az Interface Builderben nem csak egyflekppen hajthatjuk vgre ugyanazt a technikt, gy tbbflt is elsajthatunk az iPhone-alkalmazsok fejlesztshez. Ha teljesen kezdk vagyunk az iPhone-programozsban, ajnlatos a tanulst az 1. s 2. fejezettel kezdeni. Ha rreztnk a dolgok zre, az ppen hasznlt eszkzk s nyelv alaposabb megismershez lapozzunk a fggelkekhez, majd tovbblphetnk a 3. fejezetre, s fokozatosan elmlyedhetnk a haladknak szl rszekben. A knyv jellemzje az, hogy a mintaprogramkdok minden fejezetben fggetlenek az elzekben szereplktl. gy szabadon olvashatjuk a rninket rdekl fejezeteket, s nekilthatunk az aktulis gyakorlatnak.

Mi szksges a knyv hasznlathoz?


A knyvben tallhat legtbb plda jl fut az iPhone Simulatoron (amely az iPhone SDK rsze). A hardverekhez (pldul a karnerhoz s a gyorsulsmrhz) is hozzfr alkalmazsok egy valeli iPhone-t vagy iPhone Touchot ignyelnek. Az E fggelk bemuta~a, hogyan tesztelhe~k alkalmazsunkat egy valeli eszkzn. A telefonfunkcihoz is hozzfr alkalmazsokhoz egy iPhone-ra lesz szksg (az iPod Touchban nincs beptett telefon). ltalnossgban ahhoz, hogy a legtbbet hozzuk ki ebbl a knyvbl, nem szksges egy valeli iPhone vagy iPod Touch (br ezek hatrozottan fontosak a tesztelshez, ha azt tervezzk, hogy telepteni szeretnnk alkalmazsunkat az AppStore-ra is).

Jellsek
A knyvben val eligazods megknnytsre szmos jellst alkalmazunk.
Ezek vgrehajtand gyakorlatok vagy pldk.

XXV

Bevezets

Fejezetenknt egy vagy tbb gyakorlatot tallunk, amelyeket a szvegben rdemes vgrehajtani. 1. ltalban nhny szmozott lpsbl llnak. 2. Kvessk vgig a lpseket sajt projektfjljainkkal.

elre

haladva

Hogyan

mkdik?

A begpelt programkdot minden gyakorlat utn rszletesen megmagyarzzuk

Figyelmeztets Az ehhez hasonl szvegdobozok a krnyez szveghez kapcsold, fontos, megjegyzend informcit tartalmaznak.

Megjegyzs A megjegyzsek, tippek, javaslatok, trkkk s az aktulis tmtl kicsit eltr informcik gy nznek ki.

A szvegben tallhat egyb jellsek Az j kifejezsek s fontos szavak emelve. A


billentykombincik els elfordulsukkor dlt betvel

vannak ki-

kvetkezkppen

nznek ki: Control-R.


kvetkezkppen

A fjlnevek, az URL-ek s a programkd a szvegben a pelnek: persistence.properties. A programkd ktflekppen szerepelhet:

szere-

Kiemels nlkli monofont bettpust hasznlunk a legtbb pldakdban. Flkvrrel emeljk ki azokat a kdrszleteket, amelyek a trgyalt tmhoz szerosan kapcsoldnak.

Forrskd
Ahogy a knyvben haladva sorra vgrehajtjuk a gyakorlatokat, megvlasztha~uk, hogy minden programkdot manulisan begpelnk, vagy a knyvhz kapott forrskdfjlokat hasznljuk. A knyvben hasznlt valamennyi forrskd letlthet a WN-N. wrox. com cmrL A forrskdok kztt egyszeren keressk meg a knyv cmt (a Keress [Search] doboz

xxvi

Hibajegyzk

vagy az egyik cmlista hasznlatval), majd a knyvhz tartoz valamennyi forrskd elrshez a knyv rszletei oldalon kattintsunk a Download Code (forrskd letltse) hivatkozsra. A weboldalon is megtallhat forrskdokat a kvetkez ikon jelzi:
A listk a fjlnevet a cmben tartalma~k. Ha csak egy kdrisifetrrl van sz, a fjlnevet egy o!Jan fomskdmegjegyzsben talljuk meg, mint pldul ez

Megjegyzs Mivel szmos knyvnek van hasonl cme, taln egyszerbb a keresst az ISBN szm alapjn vgrehajtani : a knyv ISBN szma 978-0-47050097-2.

Letlts utn tmrtsk ki a programkdot. Azt is megtehetjk, hogy ehhez a knyvhz s ms knyvekhez letlthet programkdokrt a f Wrox programkd-letltsi oldalra megynk a www.wrox.com/dynamic/books/download.aspx cmen.

Hibajegyzk
Mindent megtettnk, hogy a szveg s a programkclak hibtlanak legyenek. Ugyanakkor senki sem tkletes. Ha brmelyik knyvnkben hibt tall az olvas (pldul helyesrsi hibt vagy egy hibs programkddarabot), hlsak volnnk a visszajelzsrt. A hibajegyzk bekldsvel a tbbi olvast akr tbbrnyi frusztrcitl is megmenthetjk, illetve hozzjrulhatunk a mg magasabb sznvonal nformcik kzlshez. A knyv hibajegyzkhez a www.wrox.com oldalon a Search dobozzal jutunk, vagy az egyik cmlistban keressk meg a knyv cmt. Majd a knyv rszleteit tartalmaz oldalon kattintsunk a Book Errata hivatkozsra. Itt megnzhetjk a knyvhz berkezett s a Wrox szerkeszti ltal bekldtt sszes hibt. Az sszes knyv hibalistjhoz tartoz hivatkozsokat is tartalmaz teljes knyvlista ugyancsak elrhet a www. wrox. com/mi scpages/bookl i st. shtml cmen. Ha egy hibt nem tallunk a knyv hibajegyzkben, ezt www .wrox .com/contact/techsupport. shtml oldalon tallhat fulap kitltsvel jelezhetjk. Ezutn a jelzst ellenriz ve, ha a hiba valsnak bizonyul, egy bejegyzs kerl a knyv hibajegyzk oldalra, s egyttal a hibt a knyv tovbbi kiadsaiban is javtjuk.

xxvii

Bevezets

p 2 p. wrox.com
A szerzkkel s a tbbi olvasval a p 2 p. wro x. com cmen elrhet P2P frumokon lehet kapcsolatba lpni. Ezek a frumok egy webalap rendszer rszei, amellyel a Wrox knyveivel s technolgiival kapcsolatos zeneteket tehetnk kzz, illetve rtekezhetnk ms olvaskkal vagy a technolgia tbbi hasznljval. A frumokon e-mail cmnkkel fel is iratkozhatunk a minket rdekl tmkra. gy rtestst kapunk, ha j hozzszls rkezik az adott tmhoz. A Wrox szerzi, szerkeszti, a tma egyb szakrti s az olvask egyarnt jelen vannak ezek a frumokon. A http: 1/p 2 p. wrox . com cmen szmos klnbz frum tallhat, amelyek segtenek az olvasnak nemcsak ennek a knyvnek a feldolgozsban, hanem sajt alkalmazsai fejlesztsben is. A csatlakozshoz az albbiakat kell tenni: 1. A
p2p. wrox. com

cmen kattintsunk a Register (regisztrci) hivatkozsra.

2. A felhasznlsi felttelek elolvassa utna kattintsunk az Agree (elfogads) feliratra. 3. Ha kitltttk a csatlakozshoz a ktelez, illetve az opcionlisan megadhat informcikat, kattintsunk a Submit (beklds) feliratra. 4. Fikunk megerstshez s a csatlakozs folyamatnak befejezshez e-mailben kapjuk meg a tudnivalkat.

Megjegyzs A frumokra kldtt zeneteket a P2P-hez csatlakozs nlkl is elolvashatjuk, m sajt zenetet kldeni csak csatlakozs utn tudunk.

A frumhoz csatlakozva teht zeneteket tehetnk kzz, s a msokira is reaglhatunk. Az zeneteket az interneten brmikor elolvashatjuk. Ha egy adott frumrl szetetnnk az zeneteket e-mailen is megkapni, kattintsunk a frumlistban a frum cme mellett a Subscribe to this Forum ikonra. A Wrox P2P hasznlatval kapcsolatos bvebb informcirt, a frum szaftvernek mkdsrl szl krdsekrt s vlaszokrt, valamint kifejezetten a P2P-rl s a Wrox knyveirl szl szmos egyb gyakori krdsrt olvassuk el a P2P gyakran idzett krdseit (FAQ). A gyakran idzett krdsek brmelyik P2P oldal FAQ-hivatkozsra kattintva elrhetk.

xxviii

~~~:~:.
,-~~ ......

...;:

RSZ

Bevezets
1. Bevezets az iPhone programozsba ................... 3 2. Az
els

Hello World! alkalmazs megrsa .......... 23


mveletek

3. Kivezetsek,

nzetvezrlk

............ 41

4. Az elemek megismerse ....................................... 75 5. Bevitel a 6. A


billentyzetrl.. ..................................... 119

kperny

forgatsa .......................................... 145

Bevezets az iPhone programozsba


A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan szerezhetjk be az iPhone SDK-t? Milyen komponenseket tartalmaz az iPhone SDK? Milyen funkcikkal rendelkeznek a Builder, az iPhone Simulator? Mire kpes az iPhone Simulator? Hogyan pl fel az iPhone OS? Milyen keretrendszerei vannak az iPhone SDK-nak? Mik az iPhone jellegzetessgei s korltai?
fejleszteszkzk:

az Xcode, az Interface

Ismerkedjnk meg az iPhone-programozs vilgval. Az, hogy kzbe vettk ezt a knyvet, egyben azt jelenti, hogy rdekel bennnket az iPhone-alkalmazsok fejlesztse, s csadakozni szeretnnk ahhoz a tbb tzezer fejleszthz, akiknek az alkalmazsai mr megtallhatk az AppStore-ban. A rgi knai monds gy tar~a : "a feladatod elvgzshez elszr fend meg a szerszmaidat". A sikeres programozshoz elszr is a felhasznlt eszkzket kell megismernnk. Ez az iPhone-alkalmazsok programozsra klnsen igaz - j pr eszkzt meg kell tapasztalnunk ahhoz, hogy egyltaln elkezdhessk. gy ennek a fejezetnek az a clja, hogy bemutassa azokat a klnbz eszkzket, amelyekre a fejlesztshez szksgnk van.

1. fejezet: Bevezets az iPhone programozsba

Az iPhone SOK beszerzse


Ahhoz, hogy iPhone-ra vagy iPod Touchra fejleszthessnk, elszr regisztrlt iPhone-fejlesztnek kell jelentkeznk a ht tp: l l de ve l ope r. ap pl e. com/i phone/ program/start/ reg i st e r 1 webhelyen. A regisztrci ingyenes, s hozzfrst biztost az iPhone SDK-hoz, valamint a kezdshez szksges ms hasznos eszkzkhz. A regisztrci utn letlthetjk az iPhone SDK-t (lsd az 1.1. brt).

<C

...

ht1p.//dtYtiO~r.JippJUOfl'l/l()hOM/i1'1CftiU..aiOfl ~atloo'

e
Vo.Tubt-~ ~tl92J'I' ~

Q. lphoni: s.clk

Googk.._,..

[f'l9llldll!':

Cf.tml:ldo.lh

.ldOICCdotdll

Otvtlopiog (or IPhone OS 3.0

.,1'
.,.,.......

iPhone OS 3.0 Readiness Checklist


10

ITunes COnntct

Resourtes for iPhone OS 3.0

Fulured Content
O'IU)

lU a

Ct~once:

Ptv9tilm Workftow

Cotta tttP-br-sttDowtMtWol'lllltW ' " gft do ln the f'irognto~ JWul -"'


iT\1~ Conne<t

bued Ofl 'rW1'


""-'ft

......_loponeftttUt"ttfolt.

1.1. bra

Az iPhone SDK teleptshez a

kvetkez

rendszerkvetelmnyek szksgesek:

Csak Intel-alap Maceken hasznlhat, gyhogy ha ms tpus a processzorunk (pldul a rgi G4 vagy GS Mac), akkor nincs szerencsnk. A rendszert frissteni kell a legjabb Mac OS X verzira.

Igencsak hasznos, ha rendelkeznk egy iPhone-nal vagy iPod Touchcsal is, br ez nem szigor felttel, az alkalmazsunk tesztelshez ugyanis hasznlhatjuk az SDK-hoz tartoz iPhone Simulatort is. Ha azonban bizonyos harciveres funkcikat (kamera, gyorsulsmr stb.) szeretnnk tesztelni, akkor egy tnyleges eszkzre is szksgnk lesz. Ha az SDK letltse befejezdtt, teleptsk (lsd az 1.2. brt). El kell fogadnunk nhny licencmegllapodst, majd ki kell vlasztanunk a szoftver teleptsi knyvtrt.

Az i Phone SDK rszei


SI),

We:lcomt: to the Phone SOK lnsuller

WMcome to N XQOde TOOl& heUlllnon P1ogl'am You wl be gutdtd ftrougn N Gps neotSUtY to inGJI XOOde Tootl and !he lPttont SOK

1.2. bra

Ha az alaprtelmezett belltsokat hasznljuk, akkor a telepts utn a /Developer/Applications mappban talljuk meg a klnfle eszkzket Osd az 1.3. brt).

T DEVICES

.. -

Applcatons

--

.. l

,- g;

E:.]_ , l mJI

IG' r(i::1

rl

,..

Nam~

..
1.3. bra

R.emote De .. ~
IPtlone SOK
~

.,~. ~
1

- -

-...-

-- -~ -

ll lnstruments Q) Interface Bullder


Performance Too!S Quanz Composer Utilitles

ll:iil

._SHARED

1
J

-...,as
Duktop

il

. i~ Xcode .

---

Date t.ocilf,ed Apr 24, 2009, 9:45AM Apr 24, 2009, 9:45AM Apr 24, 2009, 9:45AM Apr 24, 2009, 9 45 AM Apr 24, 2009, 9 45 AM Apr 24, 2009, 9:45AM Apr 24, 2009, 9:45AM Apr 24, 2009, 945 AM _:: _ Apr 24, 2009, 9 AS AM

..

Q.

!i) \111! 1 mengtee

...._"__
l of 9 seitcted. 186.7 C l
llV1113.0!~

Az iPhone SOK rszei


Az iPhone SDK olyan fejleszteszkzk csoportja, amelyekkel iPhone-ra s iPod Touchra fejleszthetnk alkalmazsokat. Tartalma a kvetkez: Xcode - integrlt fejlesztkrnyezet (IDE), amely a projektek kezelst, mdostst s hibakeresst teszi lehetv.

1. fejezet : Bevezets az iPhone programozsba

Dashcode -integrlt fejlesztkrnyezet (IDE), amelyben webalap iPhone-alkalmazsokat s Dashboard-widgeteket fejleszthetnk A D ashcode-dal nem foglalkozunk ebben a knyvben. iPhone Simulator - olyan szoftver, amely egy iPhone-t szimull Macen. Interface Builder - vizulis szerkeszt az iPhone-alkalmazsok felhasznli felletnek megtervezshez. Instruments - elemzeszkz az alkalmazsaink vals idej optimalzlshoz. rszletesen is sz lesz ezekrl az
eszkzkrl.)

(A

kvetkezkben

Xe od e
Az iPhone SD K sszes eszkze teht a / D evel ope r/Appl ications mappba van teleptve (az alaprtelmezett belltsok hasznlata esetn). Az egyik ezek kzl az eszkzk kzl az Xcode.

Getting Started

!Phone Dev Center

Mac Oev Center

Xcode News {RSSl

Maiiing Usts

Tips

e come to

code 3.1

Create yt.ru rnst Cv~ ~ltc..tion lr:Am how easy It ls to qulddy cre.1te, bu rld, and run your first

Mac appllation

IS'! Show at launeh

Buttd Vl 'r oRr interfa~ Learn hO'N lnterf.ace Bullder work.s with Xcode to des.gn your UJ
~d

wtre your code to the vtsua.l controb.

Stor yot ~ applrcat10n da(a l..e;lm how Xcode makn it u.sy to your appHc.ation's dona.

leve~e

Cor-e Dau. to stOI"e

Opt.r"!t.te your APPiitation

lum how to lntegr.ate lnstruments lnto your Xcode workflow to a.Mlyze the performance of your applic.itlon.

1.4. bra

Az i Phone SOK rszei

Az Xcode elindtshoz kattintsunk dupln az ikonjra Qsd az 1.3. brt). Hasznlha~uk a gyorsabb megoldst, azaz a Spotlightot is: a keresmezbe rjuk be, hogy Xcode, s a programnak a legels pozciban meg kell jelennie. Miutn elindtottuk, megjelenik az dvzlkperny Qsd az 1.4. brt). Az Xcode segtsgvel klnfle iPhone- s Mac OS X alkalmazsokat fejleszthetnk Qsd az 1.5. brt).

n
Choose a tempi.J.te for you r new project:
!Phone os

New

Navig~tion-bued

Appllutlon

~avlg.ttion - bued

Nav&gatlon- bHed
Core Data: Applkatlon

OpenGL ES

Window- based App!tutJon

Applicatton

ApplicabOn

'

M.lc OS X

Tabhr
Appl1 cahon

Ut1 Appllu.tlon hry

Vitw"-ba.sed
Application

Apphcat,on

AudtoUniu
Autom.a.tor Action

lundle
Commnd Unt Utalrty

Description Th1s templan provtde.s .t stMting pottit for an apphn.ltOtl thu usu .t single VieW. It preMdes 1. vfew controller to

m01ttage the vfew, and a ntb ftle that contains the view.

Oynmuc libraty
Ftilmewortc

~ Extenston Kernel
Standud Apple P'tug -i ns Static llbrry

Other

Cancel

( choose.

1.5. bra

Az Xcode-ban

IDE szmos olyan eszkzt s funkcit biztost, amelyek jcskn megknnytik a dolgunkat. Az egyik ilyen funkci a kdkiegszts Qsd az 1.6. brt), amely megjelenti az elrhet osztlyok s tagok (pldul metdusok, tulajdonsgok stb.) listjt.

lv

-Megjegyzs A leggyakrabban hasznlt funkcikrl a B fggelkben tallhatunk rszletesebb lerst.

1. fejezet: Bevezets az iPhone programozsba

<lll

SCM
Project Symbob

ll 11yft rst.AppYiewControt ter .h


ll ll
ll
~\r:s.Upp

7T

Myf1nlAppVit'NControler.h:l1

c. ' " a

.lmplementation Ales
llliNtBFiiH

ll Created by Wet-t\er!Q Lee or, 4/29!09 . ll Copyrt 9flt _t1yC~-- 2009 . Ali n ghts reserved.

l!tnterfoce Myftrsti.ppYieo.Control ter : UIYteo.ControL ter {

IEO.It let Ul
UlYiewController
UI~iewOelegote

UIIfebYievNavigot ionType

UI WebY t ewNav i gat t on TypeBockf on.oard

UIVebViewficr.ltgot ionTypeforiiiRest.tllli. t ted


UJ\IebYieYHavtgotionlypefonSut:.ttted

UIWetNiewNaYigottonTypel ink.C l tcked UlltJebYia.oNI:J\'i!;IOt ionTypeOther UlWet:Ni evNcN i gat IonTypeRe load
UIWindow

UIWinOOwlhc:tieco.eHidcleribt i t icot ion


UIWindowOt~eyHotificotion

1.6. bra

iPhone Simulator
Az iPhone Simulatorral (lsd az 1.7. brt), amely az
iPhone SDK msik igen hasznos eszkze, tesztelhetjk az alkalmazsunkat a sajt iPhone-unk/ iPod Touchunk hasznlata helyett. Az iPhone Simulator a / Developer/
i Phone os <Vers i on>/Pl atforms/i Phonesimul a tor. platform/Developer/Applications/ mappban tallhat. Leg-

tbbszr nem kell sajt kezleg elinditanunk, mert ha az Xcode-ban futtatjuk az alkalmazsunkat (vagy ha hibt keresnk), akkor az Xcode automatikusan megteszi helyettnk. Az Xcode emellett automatikusan telepti az alkalmazst az iPhone Simulatorra.

1.7. bra

Az iPhone SDK rszei

AZ IPHONE SIMULATOR NEM EMULTOR


Az iPhone Simulator szimultor, nem pedig emultor. A klnbsg az, hogy a szimultor megprblja egy eszkz mkdst utnozni. Az iPhone Simulator egy iPhone tnyleges mkdst szimullja. A szimultor maga azonban a Macre teleptett klnbz knyvtrakat (pldul a QuickTime-ot) hasznlja a klnbz dolgok megjelentsre azrt, hogy ezek ugyangy nzzenek ki, mint egy igazi iPhone-on. A szimultoron tesztelt alkalmazsok emellett le vannak fordtva x86 kdra. Ez a kd egy, a szimultor ltal megrtett byte-kd. Az emultor ezzel szemben emullja egy eszkz mkdst. Az emultorokon tesztelt alkalmazsok az adott eszkz ltal hasznlt tnyleges byte-kdra vannak lefordtva. Az emultor gy futta~a az alkalmazst, hogy a byte-kdot leford~a egy olyan formra, amelyet az emultort futtat gazdaszmtgp kpes vgrehajtani. Egy egyszer plda a szimulci s az emulci kzti klnbsg rzkeltetsre: kpzeljk el, hogy megprblunk meggyzni egy gyereket arrl, hogy veszlyes dolog ksekkel jtszani. Ennek s'{jmullsra gy tesznk, mintha megvgnnk magunkat egy kssel. Ha emul/ni szeretnnk, akkor fogunk egy kst, s tnyleg megvgjuk magunkat.
Az iPhone Simulator kpes az iPhone OS klnbz verziinak a szimullsra Qsd az 1.8. brt). Ez a kpessge nagyon hasznos akkor, ha a platform rgebbi verziin is szeretnnk elrhetv tenni az alkalmazsunkat, emellett jl jn tesztelshez, valamint a klnbz verzikon futtatott pldnyok hibajelentseinek a hibakeresshez is.
Edit Other Window Help

Rotate Left Rotate Right


Home

xxOXH

2.0 (SA345) 2.1 (SF13 5) 2.2 (SG77) ol 2.2.1 (SHll) 3.0 (7A238j)

Lock

XL

Simulate Memory Warning Toggle ln-Call Status Bar

1.8. bra

Mire kpes az iPhone Simulator?


Az iPhone Simulator az iPhone-ok s az iPod Touchok Ezek kz tartoznak a kvetkezk:
a
kperny
klnbz

funkciit szimullja.

forgatsa- balra, flfel s jobbra;

a gesztusok tmogatsa: rints,

1. fejezet: Bevezets az iPhone programozsba

rints s nyomva tarts, dupla rints, cssztats, lapozs, hzs, csptets;

"kevs a memria" figyelmeztetsek szimullsa.

Az iPhone Simulatornak, lvn egy eszkz szaftveres szimultora, megvannak a maga korltai. A nem rhetk el a kvetkez funkcik:

helyzeti informci lekrse - egy lland koordintt jelent csak meg, pldul szaki szlessg 37,3317 s nyugati hosszsg 122,0307, hvskezdemnyezs, a gyorsulsmr hasznlata, SMS-ek kldse s fogadsa, alkalmazsok teleptse az AppStore-bl, kamera, mikrofon, az OpenGL ES szmos funkcija.

Az iPhone Simulator sebessge nagyban fgg a Macnk teljestmnytl, szemben az eszkz valdi teljestmnyvel. Ezrt fontos az alkalmazsunkat letesztelni egy igazi eszkzn, s nem rdemes kizrlag az iPhone Simulatorra tmaszkodni a tesztels ben. Br az iPhone Simulatornak vannak korltai, mindenkppen hasznos eszkz az alkalrnazsaink tesztelshez. m az alkalmazst ktelez tesztelni egy igazi iPhone-on vagyiPod Touchon, mieltt kzztehetnnk az AppStore-ban.

Megjegyzs Az E fggelkben tallunk egy rszletes lerst arrl, hogyan tesztelhetjk az alkalmazsunkat igazi eszkzn.

10

Az iPhone SDK rszei

Alkalmazsok eltvoltsa az iPhone Simulatorbl


Az iPhone Simulator iPhone OS fjlrendszernek felhasznli tartomnya a -/L i brary/ Application support/iPhane simulator/User/ mappban tallhat.

Megjegyzs A -/L i brary/Appl i ca ti on support/i Phone simul ator/user/


map pa msik neve: <i PhoneuserDarnai n>.

A kls felek sszes alkalmazst az <i PhoneuserDomain>/Applicati ons / mappban trolja a rendszer. Amikor teleptnk egy alkalmazst az iPhone Simulatorra, ltrejn egy ikon a kezdkpernyn (lsd az 1.9. bra bal oldaln), s ltrejn egy fjl s egy mappa az Applications mappban (lsd az 1.9. bra jobb oldaln).

1.9. bra

Az alkalmazsok eltvoltshoz (trlshez) kvessk az albbi lpseket:

1. Kattintsunk r az alkalmazs ikonjra a

kezdkpernyn, fels

addig, amig el nem kezd rezegni. Minden ikon bal "x" gomb. 2. Kattintsunk az eltvoltand alkalmazs ikonja melletti x gombra (lsd az 1.10. brt). 3. Megjelenik egy figyelmeztetablak, amely megkrdezi, hogy biztosan trlni akarjuk-e az ikont. A trls megerstshez kattintsunk a Delete (trls) gombra.

s tartsuk lenyomva sarkban megjelenik egy

1.10. bra

Figyelmeztets Az alkalmazs eltvoltsakor a rendszer automatikusan trli


az Applications mappban
lv megfelel

fjlt s mappt is.

11

1. fejezet: Bevezets az iPhone programozsba

Az iPhone Simulator alaphelyzetbe llitsnak legegyszerbb mdja az, ha az iPhone Simulator ~ Reset Content and Settings (iPhone Simulator ~ belltsok s tartalmak trlse) menpontra kattintunk.

Interface Builder
Az Interface Builder egy olyan vizulis szerkeszt, amely lehetv teszi az iPhone-alkalmazsok felhasznli felletnek megtervezst. Az Interface Builder hasznlatakor nzeteket kell ablakokba hzni, majd a klnbz nzeteket kivezetsekkel s mvele tekkel kell sszekapcsolni, hogy azok programozottan egyttrnkdjenek a prograrnkdunkkal.

If Megjegyzs A kivezetsekrl s a mveletekrl a 3. fejezetben (Kivezetsek, l


mveletek

s nzetvezrlkj tallhat rszletes lers.

J
Az 1.11. bra az Interface Builder klnbz ablakait mutatja be. (A C fggelkben lsd az Interface Buildert rszletesebben.)

lnstruments
Az lnstruments alkalmazs (lsd az 1. 12. brt) lehetv teszi a Mac OS X s iPhonealkalmazsaink teljestmnynek dinamikus nyomon kvetst s profiljaik elksztst. Az Instruments hasznlatval:

stressztesztet hajthatunk vgre az alkalmazsainkon, megkereshetjk a memriaszivrgsokat az alkalmazsainkban, alapos ttekintst kapunk alkalmazsaink
viselkedsrl lv,

a futtatsuk sorn,

nyomon kvethetjk az alkalmazsainkban lmkat.

nehezen reproduklhat prob-

Megjegyzs Az lnstruments alkalmazst nem trgyaljuk ebben a knyvben. Tovbbi informcit az Apple dokumentcijban tallhatunk.

12

Az i Phone SOK rszei

Please enter your name

Enter your secret PIN

11 2
Segrnenttd
~

Label
l.&bV

T"'

Tutr-leld

Swtth

Pro;A:u V.ew
IM.Ify

Acti."ry !ndK-

Ou

'
v.-contro61tr
rv.~orouo~."r

PrO'f"desYiew-~mf\lnct.IOfWtryf tootban, MVrg~ b.Ms. and IPOIcatlon 'ol'l tWI TM UM8CotJUoller d.ss also s~ru

rnociAl viWS and roUt1"9 vitws whfon devlct onet1Ull0n ch.Miges.

<l

;::-----..

1.11. bra
lnstrurnents

ll

ao:aa:oa 0
Ro.r~OofO

Choose TempiOitt for the Tr.c:e Documeru::.

~~, .J.-;.
Mo<OSX

.
......
Ul-

Aa"'Y-

CPU~

~Phone

Sl'mutar.

Obtoet.,_.....

eo..oata

F.Anvi'Y

Thtt

Blan k
~t pf-du

a b&M\k ~ docu"""oq_

~Alt;'

for c"nomtl:ont

IPT!one

{ Open an Exisung Fit.... )

ttnu froon tM br&rr ont o lN -.djvsl tt'le lmtr\UIIe.MS HtW191 s 6umtd

....,nd_

tru~ bt. 1Mn uH tM Wll~tor to

( c.nc.t )

........ ' (:.__.)

lll~[]J~[]l 0 1 :-: lil '

1.12. bra

13

1. fejezet: Bevezets az iPhone programozsba

Az iPhone OS felptse
Br a knyvnek nem clja, hogy az iPhone OS bels felptsvel foglalkozzon, nhny fontos el emt azonban rdemes megismerni. Az 1.13. bra a Mac OS X -et s az iPhone OS-t alkot klnbz absztrakcis rtegeket mutatja be.

1.13. bra

A legals rteg a Core OS, amely az opercis rendszer alapja (magja). Ez felel a memriakezelsrt, a fjlrendszerrt, a hlzati kapcsolatokrt s az opercis rendszer ms feladatairt, valamint ez tar~a a kzvetlen kapcsolatot a hardverelemekkeL A Core OS rteg sszetevi a kvetkezk: OS X kernel, Mach 3.0, BSD, socketek, biztonsg, energiagazdlkods, kulcskezels (keychain), tanstvnyok, fjlrendszer, Bonjour.

14

Az iPhone OS felptse

A Core Services (alapvet szolgltatsok) rtege biztostja az alapszint hozzfrst az iPhone OS szolgltatsaihoz. Ez biztostja a CoreOS rtegben lv szolgltatsok absztrahlsnak a lehetsgt. A Core Services rteg az albbi komponensekbl ll:
gyjtemnyek

(collections),

cmtr, hlzatkezels, fjlok elrse, SQLite, Core Location, internetes szolgltatsok, szlkezels, bell ts ok, URL-segdprogramok.

A Media rteg az iPhone-alkalmazsokban hasznlhat multimdis szolgltatsokat biztos~a. sszetevi a kvetkezk: Core Audio, OpenGL, hangkevers, hangfelvtel, videolejtszs, JPG, PNG, TIFF, PDF, Quartz, Core Animation, OpenGLES.

A Cocoa Touch egy olyan absztrakcis rteg, amely klnbz knyvtrakat biztost az iPhone s az iPod Touch programozshoz; pldul:

15

1. fejezet: Bevezets az iPhone programozsba

tbbrintses esemnyek, tbbrintses


vezrlelemek,

gyorsulsmr,

nzethierarchia, lokalizci, figyelmeztetsek, webnze tek, kapcsolatvlaszt (People Picker), kpvlaszt (Image Picker),
vezrlk .

Az iPhone SD K az 1.1 . tblzatoan lthat, funkci szerint csoportostott keretrendszereket tartalmazza.

Megjegyzs A keretrendszer olyan szoftverknyvtr, amely bizonyos funkcikat biztost.

1.1. tblzat. Az iPhone SDK kentrendszerei

Keretrendszer neve
AddressBook. framework AddressBookUI.framework AudioToolbox.framework AudioUnit.framework AVFoundation.framework CFNetwork.framework CoreA udio.framework CoreD ata.framework

Lers
Hozzfrst biztost a felhasznl nvjegyeit tartalmaz kzponti adatbzishoz. Az Address Book alkalmazs adatbzisban trolt nvjegyek megjelentshez szksges felhasznli felletet biztostja. Alacsony szint C API-kat biztost hangok felvtelre s lejtszsra, valamint az audio-hardverkezelsre.
Az iPhone OS ltal biztostott hangfeldolgoz plug-i nek interfszt szalgltatja az alkalmazsunkhoz.

Alacsony szint C API-kat biztost hangok felvtelre s lejtszsra, valamint az audio-hardverkezelsre. Segt a hlzati szolgltatsok s konfigurcik (pl. HTTP-, FTP- s Bonjour-szolgltatsok) elrsben. D eklarlja a tbbi Care Audio interfsz ltal hasznlt adattipusokat s llandkat. ltalnos megoldst biztost az objektumbrzols kezelsre az alkalmazsunkban.

16

Nhny tovbbi hasznos tudnival

Keretrendszer neve
CoreFoundation.framework CoreGraphics. framework CoreLocation. framework Externa!Accessory.framework Foundation.framework GameKit.framework IOI<it.framework MapKit.framework MediaPlayer.framework MessageUI.framework MobileCoreServices.frarnework OpenAL.framework OpenGLES.framework QuartzCore.frarnework Security.framework StoreKit.frarnework SystemConfiguration.frarnework UII<it.framework

Lers
Abszrrahlja a gyakori adattpusoka t, az Unicode-sztringeket, az XML-t, az URL-eket stb. C-alap API-kat tartalmaz 2D-s megjelentshez; a Quartz rajzolmatoron alapszik. Helyalap adatokat szalgltat GPS, cellaazonost s wifi hlzatok alapjn.
Lehetsget

nyjt a kszlk kls tanozkaival val kommunikls-

ra.
Az Objective C alaposztlyait (pl. NSObject), alapvet adatfajtit, az opercis rendszer szolgltatsait stb. biztostja.

Hlzatkezelsi kpessggel ruhzza fel a jtkokat; gyakran hasznljk peer-to-peer kapcsolatokhoz s a jtkban trtn beszdhez. Driverfejleszrst tesz lehetv.
Trkpkezel Lehetsget

felletet gyaz be az alkalmazs ba.

nyjt video- s hangfjlok lejtszsra.


kezelfelletet

Nzervezrl-alap

biztost e-mailek rshoz.

Hozzfrst biztost a szabvnyos tpusokhoz s llandkhoz. Implementlja az OpenAL specifikcit. Az Open GL API rszeibl sszellton kompakt s hatkony kszlet 2D-s s 3D-s rajzolshoz. Lehetv teszi animcik s effekrusok belltst, majd ezek hardveres megjelentst. Lehetv teszi az adatok biztostst s a szofrverhez val hozzfrs vezrlst. Tmogatja az alkalmazson bell
trtn

vsrlst.

Segt a hlzat rendelkezsre llsnak s az eszkz llapotnak megllaptsban. Tartalmazza az alkalmazsok felhasznli felletnek kezelshez hasznlatos alapvet objektumokat.

Nhny tovbbi hasznos tudnival


A fentiekben tfog kpet kaptunk az iPhone-alkalmazsok fejlesztsekor hasznlhat eszkzkrl. A kvetkezben ttekintnk nhny olyan hasznos informcit, amelyek megknnythetik a dolgunkat.

17

1. fejezet: Bevezets az iPhone programozsba

Az iPhone OS verzii
Jelen knyv rsakor az iPhone OS a harmaclik kiadsnl-azaz a 3.0-s verzinl- tart. Az iPhone OS-t tbbszr tdolgoztk, a fbb verzik a kvetkezk:

1.0- az iPhone

els

kiadsa,

1.1 -tovbbi funkcik s az 1.0 nhny programhibjnak javtsa,

2.0 - az iPhone 3G-s kiadsa; az AppStore-t is tartalmazza, 2.1 - tovbbi funkcik s a 2.0 nhny programhibjnak javtsa, 2.2- tovbbi funkcik s a 2.1 nhny programhibjnak javtsa, 3.0 - az iPhone OS harmaclik iPhone OS 3.0 jdonsgairL
fbb

kiadsa; a

kvetkez

rszben lesz sz az

Az egyes verzik funkciinak rszletes lersa a http://en.wikipedia.org/wiki/IPhone_ os_versi on_hi story. webhelyen tallhat.

AZ IPHONE OS 3.0 JDONSGAI


2009 jniusban az Apple kiadta az iPhone OS harmadik fbb verzijt egy tovbbfejlesztett eszkzzel: az iPhone 3GS-sel. Az S sebessg;:.t jelent: az j eszkz a gyorsabb (600 MHz-es) processzornak s az jraoptimalizlt opercis rendszemek ksznheterr minden tekintetben gyorsabb volt, mint eldei. Az iPhone OS 3.0 nhny fontosabb j funkcija a kvetkez: hangalap aktivls, tovbbfejlesztett karnera (3 MP, autofkusz) s vde rgztsnek a lehetsge, az iPhone helynek meghatrozsa a Find My iPhone (sajt iPhone-om megkeresse) funkci segtsgvel (MobileMe fik szksges hozz), MMS s megoszts tmogatsa (a szolgltatnak is tmogatnia kell), kivgs, msols s beilleszts tmogatsa, j fejleszti API-k: Push rtestsek (norificarions) kls felek alkalmazsaihoz, Bluetooth-szolgltatsok: A2DP, LDAP, P2P s Bonjour, az API lekpezse, e-mailek kldse alkalmazsokon bellrL

18

Nhny tovbbi hasznos tudnival

Tesztels tnyleges eszkzkn


A kezd iPhone-programozk egyik leggyakoribb panasza az volt, hogy a sajt eszkzkn nem tudjk tesztelni a maguk fejlesztette alkalmazsokat. Kiderlt, hogy az Apple biztonsgi okokbl minden alkalmazsnl megkveteli, hogy az rvnyes tanstvnnyal al legyen rva, tovbb a tesztelshez fejleszti tanstvny is szksges. Ahhoz, hogy egy tnyleges eszkzn tesztelhessk az alkalmazsunkat, regisztrlnunk kell az iPhone fejleszti programra (Developer Program), s krvnyeznnk kell egy fejleszti tanstvny teleptst r. Ez hossz folyamat, az E fggelkben rszletes lers tallhat rla.

Kpernyfelbonts
A klsre mutats iPhone nagy felbonts kpernyvel rendelkezik. A nagyjbl 9 centimter tmrj kperny tmogatja a tbbrintses mveleteket, rng felbontsa 480 x 320 kppont, amelyhez 163 ppi (kppont/hvelyk) prosul Osd az 1.14. brt) . Az alkalmazsaink megtervezsekor figyelni kell arra, hogy a 480 x 320-as kpernyfelbonts ellenre az esetek tbbsgben az llapotsor rniatt 460 X 320 kppontra vagyunk korltozva. Termszetesen az llapotsor programozottan is kikapcsolhat, gy hasznlhatjuk a maximlis 480 x 320-as felbontst. Arra is gyelni kell, hogy a felhasznlk elfordthatjk az eszkzket az alkalmazs fekv tjolshoz. Az ilyen esetekre gy kell mdostanunk a felhasznli felletet, hogy az alkalmazs ekkor is megfelelen mkdjn tovbb, s el kell dntennk, hogy tmogatjuk-e az j tjolst.

1.14. bra

Megjegyzs A kperny forgatsnak ny forgatsa) lesz sz .

kezelsrl

a 6. fej ezetben (A kper-

19

1. fejezet: Bevezets az iPhone programozsba

Egyablakos alkalmazsok
Ha mobilra programozunk, s ez mg j terlet a szmunkra, figyelnnk kell arra, hogy a korltozott kpernymret azt jelenti, hogy a mobilplatformok tbbsge csak az egyablakos alkalmazsokat tmoga~a- azaz az alkalmazs ablaka elfoglalja a teljes kpernyt. Ez all a korltozs all az iPhone sem jelent kivtelt. Az asztali gpek opercis rendszereinl (pldul Mac OS X vagy Windows) a megszakott tfedsben lv ablakokat az iPhone nem tmoga~a.

Httrben fut alkalmazsok nlkl


A mobileszkzk alkalmazsainak programozsakor az egyik nagy kihvst az energiagazdlkods jelenti. A rosszul megrt alkalmazs nagyon erforrs-ignyes lehet, s gyorsan lemertheti az akkumultort. Az Apple tudatban van ennek a problmnak, ezrt a ms platformokon tapasztaltak ttekintse utn arra a kvetkeztetsre jutott, hogy a httrben fut alkalmazsok vannak a legrosszabb hatssal a fogyasztsra s a teljestmnyre. Ms platformokon (pldul a Windows Mobile esetben), ha egy alkalmazs eltnik szem ell (pldul egy berkez hvs miatt), akkor is megmarad a memriban, s minden ilyen httrben fut alkalmazs rontja a teljestmnyt, s fogyasztja az energit. Az Apple megoldsa egyszer volt: megtiltottk, hogy az alkalmazsok a httrben fussanak. Br a megolds hatkony, szmos fejlesztnek nem tetszett. Sok hasznos alkalmazs megfelel mkdshez mkdnik kell a httrben. A csevegalkalmazsok nak pldul futniuk kell ahhoz, hogy megkapjk az zeneteket a tbbi felhasznltL Erre a problmra az Apple kifejlesztette a push rtestsi szolgltatst, amely akkor is tadja az adatokat az alkalmazsoknak, ha azok ppen nem futnak. Ez a szolgltats az iPhone 3.0-val jelent meg. A push technolgival az eszkz folyamatosan csatlakozik az Apple szerverhez egy IP-alap kapcsolaton keresztl. Amikor az eszkznek figyelnie kell, az Apple szervere kld egy rtestst, gy jelez az eszkzt kiszolgl alkalmazsnak.
r--~====~====~~==~--~==~~==~

Megjegyzs A push rtestssei nem foglalkozunk ebben a knyvben . Tovbbi informcit az Apple iPhone fejleszti kzpontjban tallunk: http: 11 developer.apple.comli phonel index .action.

20

Nhny tovbbi hasznos tudnival

Kls

felek alkalmazsaira vonatkoz korltozsok

Az Apple az iPhone-ra fejleszt programozk szmra kirtt egy msik korltozst is, eszerint nem hvhatjuk meg kls felek alkalmazsait a sajt alkalmazsunkon bellrl. Ezen kivl interpretlt kdot sem futtathatunk az alkalmazsunkbL Erre j pldt szalgltat egy webbngsz alkalmazs megrsa az iPhone-ra. Mivel az internetes alkalmazsok ltalban JavaScriptet hasznlnak az gyfloldali tevkenysg vgrehajtsra, ez a korltozs azt jelenti, hogy az alkalmazsunkban nem futtathatunk JavaScript-kdot

SSZEFOGLALS
A fejezetben rintlegesen ttekintettk az iPhone-alkalmazsok fejlesztshez hasznlhat eszkzket. Megismertk az iPhone nhny jellegzetessgt, pldul az egyalkalmazsos korltot s a kls felek alkalmazsmeghvsnak a tiltst is. A kvetkez fejezetben ltrehozzuk az els iPhone-alkalmazsunkat, majd belpnk az iPhone-programozs vilgba.

A FEJEZET TUDNIVALI
Tma
Az iPhone SDK beszerzse iPhone Simulator Az iPhone Simulator korltai Az iPhone SDK keretrendszerei

Alapelvek
Regisztrls iPhone-fejlesztknt a http: / / developer.apple.com webhelyen s az ingyenes SDK letltse. A tesztels nagy rsze vgrehajthat az iPhone Sirnulatoron. ersen javallott egy tnyleges eszkzn is tesztelni.

Am

A hardverhez val hozzfrst ltalban nem tmogatja. Ide tartozik pldul a kamera, a gyorsulsmr, a hangrgzts s egyebek.

Az iPhone SDK tbb olyan keretrendszert is biztost, amelyek vgrehajtjk az iPhone bizonyos mkdseit. iPhone-alkalmazsainkat ezeknek a keretrendszereknek a hasznlatval rjuk meg.
Az iPhone nem tmogatja a kls felek httrben fut alkalmazsait. 480 x 320 kppom (elrejtett llapotsortal), 460 x 320 kppont (lthat llapotsorral).

Httrben fut alkalmazsok Kpernyfelbonts Egyablakos alkalmazsok

Az iPhone-on minden alkalmazs egyablakos, azaz az ablakok Icitltik a teljes kpernyt, az ablakok tfedse pedig nem lehetsges.

21

Az els Hello World! alkalmazs megirsa


A FEJEZET FBB RSZEl A KVETKEZK:
Ltrehozunk egy j iPhone-projektet. Az Xcode segtsgvel megrjuk az
els

iPhone-alkalmazsunkat.

Az Interface Bullderrel ltrehozzuk iPhone-alkalmazsunk felhasznli fellett. Majd nhny egyszer programkd megrsval lehetv tesszk, hogy az alkalmazs a kszlk pozcijtl fggen elforgathassa a megjelentett tartalmat. Vgl pedig ikont rendelnk az alkalmazshoz.

Miutn minden eszkz s az SD K (Software Development Kit- szaftverfejleszt kszlet) is a rendelkezsnkre ll, elkezdhe~k az iPhone s az iPod Touch kszlkekre a fejlesztst. A programozsrl szl knyvekben szoks, hogy a fejezetet a "Hello World" alkalmazs kifejlesztsnek bemutatsval kezdjk. Ezzel a megkzeltssel anlkl ismerkedhetnk meg szmos eszkzzel, hogy belemlyednnk a rszletekbe. Radsul azonnali sikert eredmnyez, megmuta~a, hogy valban mkdnek a dolgok, s ez kedvet csinl a tovbblpshez.

2. fejezet: Az

els

Hello World ! alkalmazs megrsa

Ismerkeds az Xcode-dal
Ha
betl~k

az Xcode-ot,

elszr

az

dvzlkperny

jelenik meg (lsd a 2.1. brt).

Megjegyzs Az Xcode elindtsnak legegyszerbb mdja az, ha a Spotlightba begpeljk az Xcode szt, majd megnyomjuk az Entert.

Welcome to Xcode
ettung Sbrted

IPhone Dev ce.nte.r

,...,c Dev Ot.nler

Xcode News (RSS)

Malting Us u

Tlps

e come to co e 3.
Create you_r flr:n Coco& appllatlon ltm how t~sv It ls to q&.~ty cttut, b4.11ld, &l"d I'WI
MK~IQf.lon.

~first

11!1

Bulld your user Interface Lrn how tnterfac:e luJdef' wor'l5 ~~Y~th Xcodt Ul ~ yo-..r Ul and w.o.tt ~code to thf: ~sual controls

Store your appUatJon cb. ta


lM.rn how XC:ock m.akU ft. UIY to levtrat Coe-t O..u. to Stelft 'tOUf" ..,phuttOn'S duL

Show at launeh

2.1. bra

j iPhone projekt ltrehozshoz kattintsunk a File )o> New Project (fjl )o> j projekt) menpontra. A 2.2. bra bemuta~a, hogy milyen projekteket hozhatunk ltre az Xcode-dal. Kt alapkategria ltezik: iPhone OS alkalmazsok s Mac OS X alkalmazsok. rtelemszeren kattintsunk az iPhone OS alatt tallhat Applicationra, hogy az iPhone-alkalmazsaink fejlesztshez elrhet sablonokat megnzhessk. Tbbfle iPhone-alkalmazst hozhatnnk ltre, most vlasszuk a View-Based (nzetalap) alkalmazssablont, s kattintsunk a Choose (kivlaszt) gombra.

24

Ismerkeds az Xcode-dal

New Proiect

Choose a template for you r new project:

Navi~uon-b.ued
Oo~~Q

Core Appliauon

Opt_nGL f5 Application

Ti! b hr Applicahon

Utihty Applit.Jtton

Vtew-based AppliuHon

Aut~tor

Action

Bund le
Comm.nd Une Uttllty
Dyn~c

Oe scriptton This templatt prOVJdts a surung polnt for n apphuoon tN-t uus ;a MVlg~eton controller tt preMdes a user lnttrfue configured wtth a nmgatlon controller to dtsplav il hst of tttms.

Ubnty

Frameworit

Jav
Ke:mel EKtensiOn S'anda.rd Apple Plug-ins

Static Ubro1ry Other

Cancel ) ( Choose ... )

2.2. bra

Megjegyzs A kvetkez fejezetek olyan, ms iPhone-alkalmazsok ltrehozst mutatjk be, mint a Utility Application, a Tab Bar (eszkzsv), s a Navigation (navigci) alkalmazs.

A projektet nevezzk Helloworl d-nek, majd kattintsunk a Save-re (ments). Az Xcode ekkor tovbblp, s ltrehozza az ltalunk kivlasztott sablonhoz a projektet. A 2.3. bra bemutatja a projektnkhz tartoz klnbz fjlokat s mappkat. Az Xcode bal oldali paneljn lthatk a projektben tallhat csoportosrsok A fjlok s a mappk megjelentshez brmelyik csoportot kibonthatjuk Az Xcode jobb oldali paneljn azok a csoporton vagy mappn belli fjlok jelennek meg, amelyeket a bal oldalon kivlasztottunk. Egy adott fjl szerkesztshez vlasszuk ki a fjlt, hogy a jobb oldali panel aljn tallhat szerkeszt megnyithassa. Ha a szerkesztshez kln ablakot szeretnnk nyitni, dupla kattintssal nyissuk meg a szerkesztend fjlt.

25

2. fejezet: Az

els

Hello World! alkalmazs megrsa

Cb:ssu
~r Sourcu

,.4

oWo

Re:sources
Products

rr~rks

8 Targeu
..,.

...J Exe:cu~H

~
,.

..,p

HelloWorld_Prdhc.pc_h
ttelloWorldAppDelegate .h tklloWortdAppDeleg;atun HtlloWot1dV1 twController. h

HelloWondViewControllu.m

Etrors ~d W.rnmgs

find Ruull5 ~l;SiooluMrlu ~ SCM

HelloWor1dVie'NControlle "' " ' ",

=======
No Editor

Project Symbots

.lmplernent.Uon ri lu
. . . Nilifiles

2.3. bra

A kvetkez, gyakorlati rszbl megtanulhatjuk, hogyan szabhatjuk testre az Xcode eszkztrt.


Az Xcode eszkztrnak testre szabsa
A [Hello World.~} letoJthet a Wrox.com-nJL

Az Xcode fels rsze az eszkztrterlet. Itt tallhatjuk meg azokat az eszkztrmenelemeket, amelyeket a fejleszts sorn ltalban hasznlunk. Az ilyen elemek hozzadshoz az eszkztr testre szabhat.

1. Prbakppen vlasszuk a View )l> Customize Toolbar (nzet )l> eszkztr testre szabsa) lehetsget. Egy legrdl ablak jelenik meg Osd a 2.4. brt).
2. Ha j elemet szeretnnk az eszkztrra helyezni, egyszeren fogjuk meg, s hzzuk oda. A 2.5. bra az eszkztrhoz adott ,,Active SDK" elemet mutatja be. 3. Az ,,Active SDK" elem lehetv teszi, hogy vlaszthassunk az alkalmazsunk valdi kszlkre teleptse s az iPhone Simulatorba helyezse kztt Osd a 2.6. brt).

26

Ismerkeds az Xcode-dal

Drilg your favorite ltems lnto the toolbar ...

Bu1ld

Go

De..activate:

CH:o~n

Ali

Build

~nd

Go

Bulld ;and Co

CQ.ss Browser

'o

""
Build Find

[!::J
Ctun
T~sks

Action

lulkl Woarning.s

6J..

~nd

Elron

Oe bugger

.!!...
Breoakpolnu

SCM

Ittfilctor

SniipShots

M.lkt SrQpshot

Help

RueMch Assistant

Ovtrvtew

Actwe Tilrget

Acuve Arch1tecture

Acttvt SOK

Actiw Butld Configuranon

Actwe Exec::ut<Jble

Info

lnspec::tor

Sepil~tor

l- -ni!Xtble Sp;;ace

s".ce

Customize

"__

o:-1
SeM<h

Fix

Editor

- <ir
Breakpoints

~
QUick Modd

Ef
Add Enuty

~
AddAtmbutt.

Add RtliltJonshrp

..

Run

Oe bug

Prottet

... ordrag the default set into the tool bar.

~
Actton

'Q.
Bui1d and Cf'l TolSks Inf o

)'
Surch

'

Show \ Icon and Text

:j

C Use small size

2.4. bra

~ Stnng~
SNnh O A -1 24K
Other Sourc_es Resources He.lloWortdViewControllr.r.h HelloWorldVieWConttolltr. m

.o
lill

14K

O!

HelloWOf1dV~ontu
Mil.mWindOW.)Ub

HelloWorld-tnfo.plin

Fnmtworks
Prod ueu
HeltoWorkfV.ewConttoUtr.h a I'CIIOfrOTIIf-'te'IIC.ont.roller .h

<No sele<ttd symbob

.. ... c.

ll .

_t

Jl

2.5. bra

27

2. fejezet: Az

els

Hello World! alkalmazs megrsa

H ogyan mkdik?

Az Xcode eszkztrhoz hozzadott, ltalnosan hasznlt elemekkel hatkonyabb tehetjk a fejlesztsi folyamatot. Jelen esetben pldul az eszkztrhoz adott ,,Active SDK" elem segtsgvel gyorsan vlthatunk az alkalmazsunk iPhone Simulatoron val tesztelse s a valdi kszlkre teleptse kztt.
Simulator- 3.1 l
Group~

& Fitf:s

2.6. bra

Az Interface Builder hasznlata


Ez idig ennek a projektnek nem volt felhasznli fellete. Ez azonnal kiderl, ha megnyomjuk a Command-R-t (vagy vlasszuk ki a Run ~ Run [futtats ~ futtats] parancsot), s az alkalmazsunk a beptett iPhone Simulatorba kerl. A 2.7. bra mutatja az iPhone Simulatorban megjelentett res oldalt. Ezt azrt j most megnzni, mert gy folyamatban is nyomon kvethetjk az ltalunk eszkzlt vltoztatsokat. Az res oldallal termszetesen nem megynk sokra, adjunk vezrlelemeket az alkalmazsunk felhasznli fellethez. Amikor a projektnkben tallhat fjlokat ttekintjk, kt . xi b Iciterjeszts fjlt tallunk - a Mainwindow.xib-et s a Helloworldviewcontroller.xib-et. A . xi b Iciterjeszts fjlok, tulajdonkppen XML-fjlok, s az alkalmazs felhasznli felletnek inforrnciit tartalmazzk. A . xi b fjlokat vagy XML-tartalmuk mdostsval, vagy sszerbben, az Interface Builder se2.7. bra gtsgve! szerkeszthetjk. Az Interface Buildert az iPhone SDK rszeknt kapjuk, ez teszi lehetv, hogy iPhone-os (s Mac-es) alkalmazsaink felhasznli fellett a "hzd-s-dobd" hasznlatval pthessk fel. Az Interface Builder elindtshoz kattintsunk ktszer a Helloworldviewcontrolle r. xib fjlra. A 2.8. bra bemutatja, hogyan jelzi ki az Interface Builder a Helloworldviewcontroll er. xi b tartalmt (amely jelenleg mg meglehetsen res). A Library (knyvtr) ablak jelenti meg az iPhone-alkalmazsunk felhasznli fellethez adhat klnfle vezrl elemeket. A View (nzet) ablak pedig a felhasznli felletnk grafikus elrendezst mutatja be. (A tbbi ablak hasznlatt lsd ksbb.)

28

Ismerkeds az Xcode-dal

fil~,~

F"~tltu.;IOfldtr

,._

:i=:"!
lllPportS

C;::u~'=

v.- Owlttoller -A cortrvller t~


the fr.mc~.me'lt.1l YleW mnJ19""ent:modelltiiP'!onl05..

Tb Bar Controller - A wntroller

tn"

T.1ble Vf- Controller - A controller tn.t tNlllogU .. Qble Vltw

Image l"'c:ker Controlle<r - A controlier tl'l.lt rrun~H VI-s for d'looJing .1!1d

talw!vpkn:rn..
~~ - ProviCH termUte for ob}U .Jnd tonvollen I'm d1rect!y
01-.w~blt

in

lnterf~e ~ddtr.

~~~ ?..td~.:.':~~~ _~~. ~~~-~~


Vi-COfltrollu
~rol~

Providu vitW-PQtWJ-r.t f1olriCL<On4ll.ty fOf


1"M UM....conutlller dus

........

toOib.an..n.rovlgHIO<I.b.an.~~uon~ ~$4 ~pporu tnod.J

.,..tws. ~ rouang

lllews when cHY!ct

or~enUbOtl

.Q.Fiit~

2.8. bra

Ekkor a Library ablaktbln grgessnk le a Label (cmke) vezrlelernig, s hzzuk a Label-t a View-ra. Miutn a Label-t hozzadtuk, jelljk ki, s vlasszuk a Tools ~ Attributes Inspectorr (eszkzk ~ attribrum-ellenr). A Hello Worldl-t gpeljk be a szvegmezbe, majd a Layout (elrendezs) mellert kartintsunk a kzps Alignment (igazts) ikonra (lsd a 2.9. brt).
View

Hello World!
Une Bru.ks
Lillyout
~

_ [ _ _i _

n 'n"".... _ '

Font Size
M1n1mum

Cola

J.

Tut

-[~]
Hghfght

- - - o ..:.. -----1
H. Offset V. Offset

.l
-..:.

fV1 fnab led

2.9. bra

29

2. fejezet: Az els Hello World! alkalmazs megrsa

Ezutn a Library ablakbl hzzunk egy Text Field (szvegmez) elemet, majd egy Round Rect Button (lekerektett gomb) elemet a View ablakba. Mdostsuk gy a Round Rect gomb tulajdonsgt, hogy rjuk a "Click Me!" feliratot a Title (cm) mezbe (lsd a 2.10. brt).

2.10. bra

2.11. bra

l Megjegyzs Ahelyett, hogy szveg ltrehozshoz az adott elem Title tulajdonsgt hatroznnk meg, (pl. a Label vagy a Round Rect Buttont), tk, jrarendezhetjk s jramretezhetjk a
vezrlelemeket . egyszeren

csak dupln kattintsunk r az elemre, s rjuk be a szveget. Miutn ezt megtetAz Interface Builder tmutatst ad a vezrlelemek eszttikus elrendezs elhelyezshez.

A Command-S lenyomsval mentsk el a Helloworl dvi ewcontro ll er. xi b fjlt, majd az Xcode-ba visszatrve a command-R lenyomsval futtassuk az alkalmazst. Ekkor az iPhone Simulator a mdostott felhasznli felletet jelenti meg (lsd a 2.11. brt). Koppintsunk a Text Field elemre, s a billentyzet automatikusan megjelenik (lsd a 2.12. brt) . Ha az iPhone Simulatoron lenyomjuk a Home gombot, ltszik, hogy az alkalmazsunk mr fent van a szimultoron. (Ehhez a kezdkperny megjelense utn t kelllapoznunk a jobb oldalon lv kvetkez oldalra.) Ha vissza szeretnnk trni az alkalmazshoz, egyszeren csak koppintsunk a HelloWorld ikonra (lsd a 2.13. brt).

30

Ismerkeds az Xcode -dal

2.12. bra

2.13. bra

Megjegyzs Az Apple ltal beptett nhny alkalmazs kivtelvel egyszerre


csak egy alkalmazs futhat az i Phone-on. gy a Home gomb lenyomsval egy-

ll

ben letre is hvjuk az alkalmazsunkat. Ha pedig rkoppintunk az alkalmazs ikonjra, akkor az jra indul.

A kpernytjols megvltoztatsa
Az iPhone Simulatoron az elemek tjolst is megvltoztathatjuk Ha Landscape (fekv) mdba kvnunk vltani, nyomjuk meg a Command -7 billentykombincit. A 2.14. bra megmutatja, hogyan nz ki az alkalmazsunk fekv mdban. Ha szeretnnk Portrait (ll) mdba visszavltani, a ~ billentykombincit kelllenyomnunk.

2.14. bra

31

2. fejezet: Az

els

Hello World! alkalmazs megrsa

Az alkalmazsunk nem reagl megfelelen, arnikor az elem tjolsa megvltozik Ahhoz, hogy az alkalmazs megfelelen reagljon, meg kell vltoztatnunk a programkdot. Az Xcode-ban szerkesszk a Helloworldviewcontroller.m fjlt, s keressk a kvetkez

alaprtelmezettknt

megjelen

programkdszakaszt:

- (BOOL)shouldAutorotateTointerfaceorientation:(UIInterfaceorientation) interfaceorientation { ll Return YES for supported orientations return (interfaceorientation == UIInterfaceorientationPortrait);

Megjegyzs Ennl a pontnl mg ne trdjnk a tbbi olyan fjllal, mint a HelloworldAppoelegate.h s a HelloworldAppoelegate.m. A tovbbi fejezetekbl tbbet is megtudunk ezekrl.

A YES visszajelzshez mdostsuk a

megelz

programkdot:

- (BOOL)shouldAutorotateTointerfaceorientation:(UIInterfaceorientation) interfaceorientation { ll Return YES for supported orientations return YES;

Futtassuk jra az alkalmazst. Ezttal az alkalmazsunk elfordul, arnint az elem tjolsa megvltozik (lsd a 2. 15. brt) .

2.15. bra

32

Ismerkeds az Xcode-dal

Az elemek trendezse
Az elzekben azt lthattuk, hogy a tjols megvltozik ugyan, de az elemek mrete s elhelyezkedse megmarad. Az alkalmazs felhasznlinak ez azonban nem felttlenl nyeri el a tetszst. Ezrt az lenne az idelis, ha gy tudnnk jrarendezni az elemeket a kpernyn, hogy azok a nzet tjolsnak megfelelen vltozzanak. Az elemek jrarendezshez lpjnk be az Interface Builderbe, vlasszuk a Label elemet, majd a Tools ~ Size Inspectort (eszkzk ~ mretellenr). A 2.16. bra szerint mdostsuk az elem Autasi zi ng (automat ikus mretezs) tulajdonsgt, (figyeljk meg az Autosizing szakaszban bellitott klnfle horgonypontokat). Ennek kvetkeztben az elem tjolsnak megfelelen a Label elem is kiterjeszkedik vagy sszehzdik. Ezzel egy idben az elem a kperny bal fels s a jobb oldaln rgzl.

Hello World!
Frame===n

30
Click Me!

y ~

270

H ~

2.16. bra

A 2.17. brnak megfelelen mdostsuk a Text Field elem Autasi zi ng tulajdonsgt. Figyeljnk a klnbz kppontmretekre.

Hello World!
,...---..--

Size & Pos1t1on

(!~
Cllck Me!

x ~ v.--s?
w-

""277

Autoslzln_g__

IHBHl
J---..!

I-l r:::~

2.17. bra

33

2. fejezet: Az

els

Hello World! alkalmazs megrsa

Vgl a 2. 18. bra szerint mdostsuk a Round Rect Button vezrlelem Autcsizing tulajdonsgt. Ekkor az elem tjolsnak megvltozsakor nem az elem mrett vltoztatjuk meg, hanem azt a kperny fel s rszre rgztj k.
Of) 0

Hello World!

Size & Po sition , FrMM:

.. .

"""""30
W

y
H

96
37

--uo

D
2.18. bra

Hello World!

Click Me!

2.19. bra

2.20. bra

34

Ismerkeds az Xcode-dal

Az Interface Builderen bell, a jobb


ernyt,

fels sarokban tallhat nyillal elforgathatjuk a kps gy azonnallthatjuk az elvgzett vltoztatsokat (lsd a 2.19. brt). Ezutn menjnk vissza az Xcode-ba, s futtassuk jra az alkalmazst. Ezttal a vezrlelemek mr jrapozicionljk s elforgatjk magukat, ha a kpernyt elforgatjuk (lsd a 2.20. brt).

Programkd irsa
Eddig azrt nem rtunk programkdot, mert meg kellett ismerkednnk az Xcode-dal s az Interface Builderrel. A kvetkezkben azonban mr programkdot runk, s ezzel el is kezdjk az iPhone-non a programozst. A fejezet korbbi, az Interface Builderrl szl rszben mr lthattuk a Helloworldviewcontroller .xib-nek cmkzett ablakot. Az ablak hrom sszetevt tartalmaz: File's Owner, First Responder, s View. Vlasszuk a File's Ownert, majd a menbl a Tools ~ Idencity Inspecton (eszkzk
)> identits-ellenr).

Az Idencity Inspector ablakban kattintsunk a Class Actions (osztlymveletek) alatt tallhat + (plusz) gombra (lsd a 2.21. brt) . Gpeljk be a kvetkezt a mvelet nevnek a mezjbe: btnClicked:. (A kettspontot ne hagyjuk el, mert ez rsze a mvelet nevnek.) Ezzel a bt nel i c ked: elnevezs mveletet (ms nven esemnykezel t) hozzuk ltre.

2.21. bra

A View ablakban Control-kattintssal jelljk ki a Round Rect Button elemet, s hzzuk a Helloworldviewcontroller.xib ablakban lv File's Owner elemre. Ennek kvetkeztben kismret felugr ablak jelenik meg, amely tartalmazza a btncl i c ked: mveletet. Vlasszuk ki a btncl i c ked: mveletet. Ezzel a Round Re ct Button elemet sszektjk a bt nel i cked: mvelettel, vagyis amikor a felhasznl rkattint a gombra, akkor elindul a mvelet.

35

2. fejezet: Az

els

Hello World ! alkalmazs megrsa

Hello World!

Cllck Me!

2.22. bra

A Helloworldvi ewcontroller . h fjlban adjuk a lethez:

kvetkez

fe jlcet a btnclicked :

mve

ll ll ll ll ll ll ll

Helloworldview controller . h Helloworld created by wei-Meng Lee on 3130109. Copyright __MyCompanyName__ 2009 . All rights reserved.

#import <UI K UIKit . h> iti interface Helloworldvi ewcontroller @ urviewcontrol l er {

11---declaration for the btnclicked: action---(IBAction) btnclicked:(id)sender; @ end

A Helloworldviewcontroller.m fjlban adj uk meg a kivitelezshez szksges programkdot:

kvetkez,

a btnclicked:

mvele t

36

Az alkalmazs ikonjnak testre szabsa

- (void)deal loc { [supe r de a ll oc] ;

//---i mplementation for the btnClicked: action---(IBAction) btnClicked:(id)sender { //---display an alert view--urAlertview *al ert = [[UIAlertview alloc] initWithTitle:@"Hello world!" message: @"iPhone, here I come!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [alert show]; [al ert release];

@end

Az elbbi programkd, a kvetkez figyelemfelhv zenetet jelenti meg: "i Phone, here I come! " Trjnk vissza az Xcode-ba, s futtassuk jra az alkalmazst. Ezttal, ha rkoppintunk a gombelemre, megjelenik a figyelemfelhv zenet (lsd a 2.23. brt).

2.23. bra

Az alkalmazs ikonjnak testre szabsa


Az iPhone Simulatorba teleptett alkalmazsunk alaprtelmezettjeknt fehr ikon jelenik meg Osd a 2.13. brt). Termszetesen ezt az ikont testre szabhatjuk Ha az iPhone-alkalmazsaink ikonjait kvnjuk testre szabni, figyeljnk a kvetkezkre : Az ikonjainkat 57 x 57 kppont mretre tervezzk. A nagyobb mret is megfelel, hiszen az iPhone automatikusan jramretezi az ikonokat. St valjban jobb, ha nagyobb mretre tervezzk az ikonokat, ugyanis elkpzelhet, hogy az Apple a jvben olyan j kszlkeket bocst piacra, amelyek nagyobbak lesznek a jelenlegieknL

Ahhoz, hogy az App Store-on terjeszthessk az alkalmazst, az ikonnak 512 x 512 kppont mretben kell elkszlnie. Az ikonnak legyenek ngyzetes sarkai, mert az iPhone automatikusan lekerekti, s fnyes felletet ad hozzjuk (br ezt a jellemzt ki is kapcsolhatjuk).

37

2. fejezet: Az

els

Hello World ! alka lmazs megrsa

A kvetkez gyakorlati rszben azt nzzk meg, hogyan adhatunk ikont az alkalmazsunkhoz. Az iPhone Simulator ezt fogja hasznlni az alaprtelmezett fehr kp helyett.
Ikon hozzadsa az alkalmazshoz

1. Ha az alkalmazsunkat mg rdekesebb szeretnnk tenni, ksztsnk sajt ikont. Mieltt hozzltnnk, ne felejtsk el, hogy az iPhone kt ikonrnretet engedlyez: az 57 x 57 kppontosat (a fkpernyre) s a 29 x 29 kppontosat (ahogyan a Settings [belltsok] alkalmazsban lthat). A 2.24. bra bemutatja a kt lehetsges ikonmretet.

2.24. bra

2. Ha ikont szeretnnk hozzadni az alkalmazsunkhoz, hzzuk a kivlasztott kpet a projektnk Resources (erforrsok) mappjba (lsd 2.25. brt). Ekkor megjelenik az a krds, hogy kvnunk-e msolatot kszteni a kpr l. Ha igen, akkor a kp msolata a projektmappba kerl. 3. Vlasszuk az Info.plist elemet (szintn a Resources mappban tallhat). Vlaszszuk az ikonfjlelemet, s az rtkt llitsuk be az ikon nevre (app-icon.png; lsd a 2.26. brt). Ezzel megadjuk az alkalmazs ikonjnak a nevt.

38

Az alkalmazs ikonjnak testre szabsa

!'!. HelloWorldViewControHer.h
a.~~ . HelloWorldVa~ontro1ler.m

0t11er Sources IMI He:lloWorld_Prefix.pch ,,.. ma~n.m


'Y ~

l Resourcu

rj L..:

j~) Hello\YorldV.ewController -Xib


~~inWJndow.)(ib

J::!_P~-~

..... -... c . .

S!....!

lnro.phst

U Fr~woriC.s

,. :::.; Proctucu
~@Targtu .,_ ~ Executab1es

-..:;o) Errors and Warnmgs


T-..\. Find Resulu

-t
cl
o u.atdl:~

L...!JBookma.rks
~

SCM

2.25. bra

....... ..

. .
Cl

..

~o~~-~h

~, HdiO'I\'~"' 11 11tiiOWOridV~uoll"' ~
Htlo\\'oftdV~~"'

Re~ttts

~'<Of\.1)1"1
HtfloWof1d'Y~CtOI'Jtf . lllb

..

w,.onV.>ndow.l--.b
W~it
L.: ~oduru.

YWortN.tiO"'

...

tlnfo.,c;;Sl

..

,._openy U$1
~re

,~ ~

l.oula.oonA&tiW b.ec.utltH ftlot


~-itifOs~

loolndied.JOt.ay~

.
10
~

Tugcou
.. -.~ l.J:tcutab'tt ~{trOt'J"'Ir#r\o"tl ~r..tluuJu

--~

. . . .'IW~SWI"g , Shott
~~~,.

t> l J SCM

~~.
.,..~Sy<nbo;s

lnl'oOtc:bOn#Y \oltf,Oft
IUncll\l!~""'t

. . . fnolpl~nlMtOftft41

lundte OS Type

iiMI,-ilu

lundtt creuot OS T'f'IM cocM ...ndk V.f"'.>>f'


UAeq ._re~

W~ntb!'i~ebl~~

. .w.noow

2.26. bra

39

2. fejezet: Az

els

Hello World! alkalmazs megrsa

Futtassuk az alkalmazst, s teszteljk az iPhone Simulatoron. Nyomjuk meg a Home gombot, majd trjnk vissza az iPhone fkpemyjre. Ekkor megjelenik az jonnan hozzadott ikon (lsd a 2.27. brt).

SSZEFOGLALS
Ebben a fejezetben ltrehoztuk az els iPhone-alkalmazsunkat. yilvn maradtak megvlaszoland krdsek, a fejezetnek csak az volt a clja, hogy bemutassa a kezdeteket. A kvetkez nhny fejezet elmlyti az iPhoneprogramozs rszleteit, s bemuta~a az egytt dolgoz elemek titkait is lpsrllpsre.

2.27. bra

1.

Xcode-ban megprbltunk ikont rendelni az iPhone-projektnkhz. Mekkora legyen az ltalunk megadott kp mrete?
klnbz

2. Mit kell tennnk, ha az alkalmazsunknak tmogatnia kell a kijelz

tjolsait?

A FEJEZET TUDNIVALI
Tma
Xcode Interface Builder Az elemek jrapozicionlsa

Alapelvek
Ltrehozhatjuk vele iPhone-os alkalmazsprojektnket, s olyan programkdot rhatunk, amely vezrli az alkalmazs unkat. A Libratyban tallhat elemekkel felpthetjk az iPhone felhasznli feliett.
Az Interface Builderben tallhat Au tosize funkcival biztosak lebernk abban, hogy az elemek trnretezdnek, mg akkor is, ha a tjols megvltozik.

Alkalmazsikon hozzadsa iPhone-alkalmazsok ikonjnak ltrehozsa

Segtsgvel kpet rendelhernk a projektnkhz, majd az i nfo. pl i st fjl Icon fjltulajdonsgban megadhatjuk a kp nevt.
Az ikon mrete 57 x 57 kppont (kezdkperny) s 29 x 29 kppont (belltsok). Az AppStore-on val hasztolshoz a mret 512 x 512 kppont.

40

Kivezetsek, mveletek s
nzetvezrlk
A FEJEZET FBB RSZEl A KVETKEZK:

kivezetsek (oudets) deklarlsa s meghatrozsa, mveletek (actions) deklarlsa s meghatrozsa, kivezetsek s


mveletek

nzetelemekhez val kapcsolsa a View (nzet) ablakban,

j nzervezrl (View Controller) alkalmazshoz val hozzrendelsk.

Az el z fejezetben egy egyszer Hello World! iPhone-alkalmazst ksztettnk anlkl, hogy rszleteztk volna az ezt mkdtet mecharzmusokat. Valjban az iPhone-programozs elsajtsnak az a nehzsge, hogy nagyszm aprsgat kell megtanulni egy alkalmazs mkdkpes elkezdshez. A knyv clja megmutatni azt, hogy az iPhoneprogramozs egyszerre lehet szrakoztat s sikeres. Az iPhone-alkalmazsok ltrehozsnak alapjaival kezdnk. Sz lesz az iPhone-alkalmazsprojektet alkot klnbz fjlokrl, illetve arrl, hogyan kapcsoldik a programkd az iPhone -alkalmazson lthat grafikus widgetekhez.

3. fejezet: Kivezetsek,

mve letek

nzetvezrlk

A kd s a felhasznli fellet egyttmkdsnek az alapjai


Egy nzelalap alkalmazsprojekt j kezdalap egy egyeden nzettel rendelkez alkalmazs fejlesztsre, illetve kivl lehetsget ad az iPhone-programozs fbb fogalmainak a tisztzsra, gy a kvetkezkben ezzel dolgozunk. Elszr tltsk le a programkdot. Nyissuk meg az Xcode-ot, s hozzunk ltre egy j nzetalap alkalmazs- (Viewbased Application) projektet (lsd a 3.1. brt), majd nevezzk Basi cur-nek.
A [BasicUI.tfp] programkdfjl a lf/rox.com-rrJitlthet k.

Navlgation- b.ased
Appl i c~l on

~~9.1ton- b.ued

Core O..ta Appltauon

M.lcfUSE
MacOS X

Apphanon
Audio Unib
Autonw.tor Acton

Tab BM Appiiallon

&mdle
Comm~d

U ne Utility

Description This tcmpla.te~ provfM.s a stvtlnl point for An appllatlon that uses a single vt~. It provldH a view controller to m1.n.age the 'lfew. and a n1b file that
cont&~ns

Oyn&.mlc Ubrary Framework


)ava

the

VII!W .

Kernel Extension

Stand.Md Apple Plug -ins


Static Ubnry

3.1. bra

Az Xcode kijelzi a projekt fjllistjt (lsd a 3.2. brt). Tbb fjl automatikusan elkszl az j projekt ltrehozsakor. Az iPhone SDK igyekszik megknnyteni a dolgunkat olyan elemek ltrehozsval, amelyek a leggyakrabban hasznlatosak az iPhone-alkalmazsok tervezsekor. A 3.1. tblzat a projekt klnbz fjljainak hasznlatt muta~a.

42

A kd s a felhasznli fellet
A~')

egyttmkdsnek

az alapjai

lla5iclJI

-..SOK
Groups&FiiM

N:tMTort.,

..,

Ctassu
Otf'ler Souru s

.. ,
,.

Ruourcu
Fr~

Products

I Ta rgets
.,.
~

Execunble5

iJ Errors Vld Wamings


4, Find Ruulu
L.!) Bookmarks
~
ma~n . m

. . . . lmp l ~entatl on f ilts

e ProJtct Symbo;s

SCM

Mad'I\VindOW.XIb
UIJOt.frMMWOrk

. . . NIBFHes

3.2. bra 3.1. tblzat. Aprojektben ltrehozott le/nbozfjlok

Fjl
Basi cUI ap p Bas i CUI_ P re fi x. p ch B i c UIAppOe l e ga te . h as Basi cUIAppoe l eg a te. m Basi cUIViewcontroller. h Basi eU IV i ewcont ro ll e r. m Basi cUIVi ewcontro ll er. x i b CoreGrap hi cs. framework Foundation. framework I nfo pl i st mai n m Mai nwi ndow. x i b UI Ki t. framework

Leirs
Az alkalmazscsomag (futtat llomny), amely a futtathat kd meUett az alkalmazshoz csomagolt adatokat is tartalmazza. A projekt sszes fjljnak fejlct tartalmazza. Ez a fejlc alaphelyzetben a projekt sszes fj lj ban megtalllia t. Headerllomny az alkalmazsdeleglthoz.
Az alkalmazsdeleglt implementcis llomnya.

Headerfjl A

n zetvezrlhz .

nzetvezrl

implementcija.

A nzetek felhasznli fellett tartalmaz Xib fjl. C-alap API, alacsony szint 2D-s renderelshez. API olyan alap-rendszerszolgltatsokhoz, mint az adattpusok, az XML, az URL stb. Sztrfjl, amely informcit tartalmaz a projektrl: ikonok, alkalmazs neve s msok. Az informcit Irulcs/ rtk prokban trolja. A f llomny, amely betlti az iPhone-alkalmazst.
Az alkalmazs fablaknak xib fjlja. Az alkalmazs felhasznli felletnek felptshez s kezelshez elengedhetetlen alapvet elemeket szolgltatja.

Megjegyzs A ltrehozott fjlok szma s tpusa a kivlasztott projekt tpustl fgg. A nzetalap alkalmazssablon kiindulsi alapknt kivl a klnbz fjlok megrtshez.

43

3. fejezet: Kivezetsek, mveletek s nzetvezrlk

A main.m fjl tartalmazza azt a program kdot, amely betln az alkalmazst. Ez a kdot csak ritkn szksges megvltoztatni : #import <UIKit/ UIKit.h> int main(int argc , char *argv[] ) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retval = UIApplicationM (argc, argv, ni l, nil ); ain [pool release]; return retval;

A munka nehezt a UIApp l i ca ti onMai nO fun kci vgzi, amely az Info . pl i st f jlt rtelmezi, hogy tbb info rmcit gyjtsn a pro j ektrL Lnyegben az t a f nib f jlt figyeli, amelyet a projekthez hasznlunk. A 3.3. bra az Info . pl i st f jl tartalm t mutatja. A Mai n ni b fi l e bas e name kulcs a Mainwindow-ra mu tat, amely a bet l te nd 1 IB f jl neve az alkalmazs indtsa kor.

MIT JELENT A XIB S A NIB?


iPhonc-alkalmazs tervezse kzben tbbszr tallkozunk .xib (mskpp ~IB) kiterjeszts fjlokkal. l\lit jelent a NIB s a .xib pontosan? Ennek megrtshez r,id trtneti ttekintsre nn szksg. A mostani i\fac OS X egy KeXTSTEP ne, opercis rendszerre plt, amely a ' eXT Yllalar termke ,olt (ezt az Apple egyik alaptja, SteYe Jobs hozta ltre 1985-ben). A NIB N betje a eXTSTEP-re utal. A .xib-nl az x vlheterr az X.\IL-re utal, mi,el tartalmt X1IL-fjlknt menti. Az IB az Interface Builderbl szrmazik, amely az alkalmazs felhasznli felletnek Yizulis kiptst teszi lehet, .

'Y lnform.Jtlon Property Us t

102 ,...... ,
1

Loalizatlon

n~trw.

development region

Engllsh

Sundie

displ~y

name

Execua.ble fUe

SI PRODOCT _NAME) SlEXECUTABLE_NAM EI lcom.yourcomJW!Y.SI PII.OOUCT_NAME:td<ntflor}

Icon file
Bundle id~tJfter

lnfoOtction;J.ry wrsJon
Bundlename

6.0
SlPRODUCT_NAME)
,7111
l. O

Bund le OS Type code


Bund le creator OS T~ code

Sundit versJon
LSRequ.iresiPhoneOS Main nib ftle ban n.mt
1

MoinWindow

3.3. bra

44

A kd s a felhasznli fellet

egyttmkdsnek az

alapjai

XIB-fjlok szerkesztse
Az Interface Builder hasznlathoz kattintsunk ktszer a Mainwindow.xib fjlra. A XIB
fjl az alkalmazs felhasznli fellett jelenti, teht majdnem kizrlag csak az Interface Builder hasznlja.

rMegjegyzs A XIB fjl lnyegben egy XML-fjl. Megnyithatjuk s szerkeszthetjk az olyan alkalmazsokkal is, mint a TextEdit, br a felhasznli fellet megvltoztatshoz legtbbszr az Interface Buildert hasznljuk.

l
Ha aMinwindow. xi b fjlt megnyitottuk az Interface Builderben, egy, a fjl nevnek megfelel ablakot ltunk (lsd a 3.4. brt) .

....__.
Window

Qtr PiU
3.4. bra

11!1lltlf?Pwr:*

Ez az ablak t elemet tartalmaz. A Fi l e' s owner a felhasznli fellet birtokosnak objektuma (az az osztly, amely a XIB fjl tartalmt hivatott kezelni). A First Responder az az objektum, amellyel a felhasznl ppen operl. (Az reagl elemeket a negyedik fejezet trgyalja rszletesen.) A BasicUI App Delegate elem a BasicUIAppoelegate osztlyra mutat. vebben lsd albb.)
els

(Errl b

A BasicUI view controller arra a nzetvezrlre mutat, amelyet a felhasznli fellet megjelentshez hasznlunk. A window az a
kperny,

amelyet az alkalmazs elindtsakor ltunk.

45

3. fejezet: Kivezetsek, mveletek s nzetvezrlk

Delegcik
A Basi eU IAppoe l egate. m fjl azt a kdot tartalmazza, amelyet ltalban az alkalmazs betltsnek befejezsekor vagy annak lelltsa eltt futtat a program. Tartalma pldul a
kvetkez:

#import "BasicUIAppoelegate.h" #import "Basicurviewcontroller.h" @implementation BasicUIAppoelegate @synthesize window; @synthesize viewcontroller; - (void)applicationoidFinishLaunching:(UIApplication *)application { ll override point for customization after app launeh [window addsubview:viewcontroller.view]; [window makeKeyAndvisible];

Miutn az alkalmazs befejezte a betltst, az applicationoidFinishLaunching: zenetet kldi a delegltjnak. A fenti esetben egy nzetvezrl view elemt vlasztja ki, amelyet megjelentsre az aktulis ablakhoz ad hozz. A BasicUIAppDelegate.h fjl a BasicUIAppoelegate osztly tagjainak deklarcijt tartalmazza:
#import <UIKitiUIKit.h> @class Basicurviewcontroller; @interface BasicUIAppoelegate : NSObject <UIApplicati onoelegate> { urwindow *window; Basicurviewcontroller *viewcontrolle r ;
}

@property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet Basicurviewcontroller *viewcontroller; @end
Ebbl

a sorbl a

kvetkez

a fontos:

@interface BasicUIAppoelegate : NSObject <UIApplicationoelegate> {

A <UIApplicationoelegate> utasts adja meg azt, hogy az osztly az UIApplicationoelegate protokollt valstsa meg. Ez azt jelenti, hogy ezutn mr kezelr tudjuk a UIApp l ica ti onoelegate protokollban meghatrozott esemnyeket (vagy zeneteket). zznk egy pldt a UIApplicationoelegate protokoll esemnyre:

46

A kd s a felhasznli fellet

egyttmkdsnek

az alapjai

appl i ca ti onDi d Fi ni shLaunchi ng: (Ezt a Basi cUIAppDel egate. m fjlban lttuk meg-

valsulni.)
applicationwillTerminate: applicationoidoidReceiveMemorywarning:

Megjegyzs A protokollokat a D fggelkben trgyaljuk rszletesebben.

Nzetvezrlk
Az iPhone-programozsban ltalban azrt hasznlunk nzetvezrlket, hogy nzeteket (View) alaktsunk, navigljunk, s a memrival operljunk. A nzeralap alkalmazsok projektsablonjban a nzet kezelshez az Xcode automatikusan nzetvezrlt hasznl. Ezt a nzetet olyan kpernynek (vagy ablaknak) kpzeljk el, amilyet az iPhone-on ltunk.

Megjegyzs Ez a rsz pusztn


zrlkhz,

bevezet a nzetvezrlk alapjaiba; a nzetve-

illetve a tbbnzetes alkalmazsokhoz a hetedik fejezet nyjt rsz-

letesebb eligaztst.

'

."

t""\ ""'

1-...

BasicUI View Controller


~

Window

.,........-

.,._... ...

- .

-~

View
loade.d from ' BukUIViewControllu '

l
3.5. bra

47

3. fejezet: Kivezetsek, mveletek s nzetvezrlk

A Mainwindow. xi b ablak tartalmazza a BasicUI View Controller elemet. Ha ktszer kattintunk r, ugyanezen a nven felhoz egy ablakot Qsd a 3.5. brt). Lthat, hogy a nzet a Basicurviewcontroller-bl tltdtt be. A Basi cUIViewcontroller a BasicUIViewcontroller.xib fjl nevre utal, amely ugyancsak benne van a projektben. Az Interface Builder hasznlathoz kattintsunk ktszer a Basi cUIVi ewcontro ll er. xi b fjlra Qsd a 3.6. brt).

3.6. bra

Ahogyan a Mainwindow.xib fjlnl, a BasicUIVi ewcontro ll er. xi b ablakon is lthat nhny elem. Ebben az esetben az ablak hrmat mutat: Fi l e' s owner, Fi r st Responder s view. Ha a File's Owner elemet jobb gombbal (vagy Control-kattintssal) megnyitjuk, lthatjuk a kivezetseit Qsd a 3.7. brt). Egyelre azt jegyezzk meg, hogy a view kivezets a view elemhez kapcsoldik. A view elem jelenti az alkalmazsban megjelen kpernyt. Megjelenitshez kattintsunk ktszer a View-ra Qsd a 3.8. brt).

3.7. bra

A View ablak megtervezse


A View ablak megtervezshez a Library (knyvtr) ablakbl hzhatunk t nzetelemeket (kattintsunk a Tools )>- Libraryra [eszkzk )>- knyvtr]). A 3.9. bra a Library ablak klnbz, a View ablakban hasznlhat elemeit mutatja.

48

A kd s a felhasznli fellet

egyttmkdsnek

az alapjai

3.8. bra

View Controller
U1Vte....Contr(... fer
Ubro~~

PrOYldu view - ma~gemer.t funct,onllitty for too rbars. naveg.n 011 bars, and ~pl,catson
v.ews. The UIVinvC:ornroller cl<tss ~so s~pporu moda.J vt~s and rotating vlews

,__.

when de..., ce orientat;on c.hanges

~ o View lcons
Q

View lcons And L.a.bels

D!! View lcons And Descnplions

VIew Con troller


UMew<:onuot~r

Show Group Banners


NewGroup New Sman Group

Ptovu:les vit'w- mangement funct on;ar ,ty for tooibiB, ruvtg.J.llon ban, and .1pphc.tt10n VtCWS. The UMewConuoller class al so supports modal VI~ and rotating views when di!VlCI!

onetHatJon changes.

Ed~r
Ke;~-..-_

T1 '_

ul-!

<t

Ren(..v;o

3.9. bra

3.10. bra

49

3. fejezet: Kivezetsek, mveletek s

nzetvez rl k

A Library ablak klnb z nzetelemeit rdemes ikonk nt vagy cmkeknt megjelentennk. Ehhez kattintsunk a Library ablak als rszn a csillag formj ikonra, majd vlasszuk a View Icons and Labels (ikonok s cmkk nzete) funkci t (lsd a 3.1 O. brt). gy a nzetelemek neveit az ikonokkal egytt mutatja a program (lsd a 3.11 . brt). Tltsk meg a View ablakot a 3.12. brnak megfelelen. A kvetkez nzetelemeket hasznljuk: Label. Text Field, Round Rect Burton.

""' Cocoa TotKh Plug n L Custom ObJecU. "'l

Please enter your name

CtlckMe
View Control cr Navtg.uion C
T~

l.lr Co"

Providu Vlew- ma'\a9ement functo~ ty for toolbl.n;, naVIgat.on bars , and ~pl iUllion
VIt~-

The UMewConuoller class


vl~s

~so

s<Jpporu modal

.llnd roLlting views

......n~ dt!VICt! Ofit:rUat OR ChVIgU.

3.11. bra

3.12. bra

Alkalmazsunk egy nagyon egyszer dolgot tud: amikor berjuk a nevnket a szvegmezbe,

majd a piros ngyzetre kattintunk, az alkalmazs egy figyelmeztet kpjelzst ad le

a nvvel.

Kivezetsek s mveletek ltrehozsa


Hogy az alkalmazs sszekapcsoldjorr a View ablak nzetelemeivel, szksgnk van egy olyan mechanizmusra, amely hivatkozik az ablak nzetelemeire, s ezzel egy m echanizmus a kivezets (out/et) s a mlvefet (action).
idben

az

esem nyek bekvetkeztekor folyamatokat aktivl. Az iP hone-programozsban ez a kt

50

A kd s a felhasznli fellet

egyttmkdsnek

az alapjai

A Basicurviewcontroller.xib ablakban (lsd a 3.13. brt) vlasszuk ki a File's Owner elemet, s nyissuk meg annak Idencity Inspector ablakt (fools )> Idencity Inspector). A Class Actions (osztlymveletek) szekci alatt kattintsunk a plusz (+) gombra, majd adjuk hozz a bt nel i c ked: nev mveletet. A Class Outlets szekci alatt kattintsunk a plusz gombra, majd adjuk hozz a nameTextField nev kivezetst. Alltsuk a Type-ot unextFi e l d-re.

l#ltjl::tl

rtrst Responder

View

N;uno
Object ID

F1le's Owner
~-~-

Lo<k
Notos

, """'';,;o;;:h.;;;;d)!] Show Woth S.it<On

: l

-----

3.13. bra

A mvelet olyan metdus, amely a nzetelemek ltal elhvott esemnyeket kezelik (pldul ha egy gombra kattintunk) a View ablakban. A kivezets ellenben arra val, hogy a programkdbl tudjunk hivatkozni egy nzetelemre a View ablakon. A File's Owner elem kijellsvel vlasszuk a File )> Write Class File (fjl )> osztlyllomny krsa) menelemet. Az Interface Builder legenerlja az ppen hozzadott kivezetsekhez s mveletekhez szksges kdot. Mivel a projektsablon mr tartalmaz a nzetvezrl ltal hasznlt osztlyfjlokat, a 3.14. brnak megfelel krdst l~uk.

51

3. fejezet : Kivezetsek, m velete k s nzetvezrlk

Megjegyzs Manulisan is mdosthatjuk a nzetvezrl fjlokat (a . h s a .m fjlokat), de az Interface Builder is rendelkezik az elbbi funkcival, amely segt a kivezetsek s a m veletek kdjainak generlsba n.

"Ba.sicUIVlewController.m, and "BaslcUIVJe.,...Controller.h" already exisL Do you want to repiace these files?
filesor folders Y.lt11the same namu .llreildy t-kist 1n "Ciaues'_ Cnoos ng repiace "hl l 0\ferwr te the existn~

h!es W1th t"e new "'les

Cilllcol )

3.14. bra

Ezen a ponton kt lehetsgnk van. Fellrjuk a projektnk jelenlegi fjljait. gy fellrjuk az sszes olyan vltoztatst, amelyet eddig eszkzltnk a meglv osztlyfjlokban. sszeolvasztjuk az jonnan generlt kdot a meglv osztlyfjlokkaL Ezt az opcit ajnljuk, hiszen gy egyenknt vlaszthatjuk meg az osztlyfjlokba bekerl utastsokat.

Kattintsunk a Merge (sszefzs) gombra. Ezutn a 3.15. brnak megfelel ablakot lthatjuk a Basi cvi ewcont r ol l er. h tartalmval. Az ablak bal oldala mutatja azt a kdot, amelyet az Interface Builder generlt, mig a jobb oldalon az eredeti fjl tartalmt ltjuk. A szrke kdrszeket illesztjk be. Mivel mindkt utastst az eredeti fjlba szeretnnk illeszteni, jelljk ki rnind kt rszt, a kijelz jobb als sarkban kattintsunk az Actions listre (mveletek listja), majd a Choose Leftre (bal oldali kivlasztsa). Ismteljk meg ugyanezt a lps a msodik kdblokknl is. Az ablak ekkor a 3.16. brnak megfelelen nz ki. Figyeljk meg a kt nyl irnyt. Mentsk el a fj lt a Command-S-sel. Az ablak bezrshoz nyomjunk Command-W-t. Ekkor a kvetkez fjl ablakt ltjuk: Bas i cv i ewcon tro ll e r . m. Ismteljk meg az elz lpseket (mg ha a msodik kdblokk ltszlag semmit sem tartalmaz; lsd a 3.17. brt). Mentsnk, majd zrjuk be az ablakot.

52

A kd s a felhasznli fellet

egyttmkdsnek

az alapjai

0"'"
[~ll
Ir
1 /

hO BasacUIViewController.h
BaslcUIVlev.Controller.h- tvartfolders/QF/ QFE59rlcHbO--Rl

Ba.scUIViewController.h- (Var/folders/QF/QFES9rLcHbO .... -RE


- - -

------

.,.

:j

~""'"
ll ll

-- -- --

-~- --- - - -- . Concroller

:j
"' l

BostcUIYtewControl ie-r .h &l$iclll


Cr~ted

BostcUI!Jteo.Corltrollet .h

ti
f/

ll Bastct.II ll
Sotuttor~

l
ri~ts

by Wet-Mer.g LeP on "121/6'9 . 2009 .It.! l nghts

JI C')pyrlght Oevetoper Leorntno

ri
JI~PCTt

ll Creoted trf W~i-Meng Lee on i/21/89. 11 Copvrtght D~loper Learnirq Sotuticos 2009. ALI ll
ltMPOrt <i.llkttiUlKtt.h>

<iJIKit/U IKit .h>

..,..,

tmterfoce BastcUIVie...controller : UIYie..Controt ter { tet Ul extftel *~ extfie } - {IBAct ton)btrel icked:(id)sender;

linter foce Bas t cUIYitNControtter : 2 }

UIYie\o~Controlter

~ -

""""

-~-------~

----

--

..

..
status 2 ditferences

Choose right

Choose both (left Hrst)


Choose both {rlght fi.rs O
Choose nelther

J Actlons

l. .

3.15. bra

ltiiPQrt

-<LJI~tt/U I K i. t. . h>

tifii:)Ort ..:LIJKtt/UlKt t .h>


fint~rf~

l}

@tnt.erfoce BosicUIYiet.Controller : Ul\lteo.Controller { lElOJtle t UlTextFietd .,._,Textfield;

Bosi cUIYieo.Controller : UIYiei.Controi ter {

_.!....

l}
@end

t t on)btiCl icked:(i
\!end
___L__

__L__

-------

3.16. bra

tiliPOrt BostcUIYtevControt ter .h 8illple.erttot ton BostcUIYtei.Controller - (I&ct ton )btnClicked : ( td)sender {

't.,.:;lrt "BostcUlYieo.Controller .h
f:hiiPI~tatton

BosicUIYi.evController

_.!....

1 .

ri The de:su;~noted tnlttOlizer. OverneJe to perfor setup th - (td)tnitWtthHt~:(NSStnng *)ntbNcweOYNi l tu"tdle:(HS&.i if (t:etf [s~r tnltWtthNtbNalte:ntl:lraerNll bl.rldle:n

l?!

ll The de'!:lgnotffi intttattz.er . Overnoo to perton se~ ti1 - (td)inttWt~tbNal!e:(NSStnng )ntbrbleOTNtl tu'ldle:(NSaJ tf (sett. [St4Jer inttWttJYh~:nt~Ntl bt.rldle:n ll Cu!.U. tmttolizotton } return self:

3.17. bra

53

3. fejezet: Kivezetsek,

mveletek

s nzetvezrlk
kvetkezt

Visszbb az Xcode-ban, a Basicviewcont ro ll er. h fjlban a #import <UIKit/UIKit.h>


@interface BasicUIViewcontroller : UIViewcontroller {

ltjuk:

IBOutlet UITextField *nameTextField;

- (IBAction)btnclicked:(id)sender;

@end

Az IBOutl et azonost vltozkat pre fixl, hogy az Interface Builder ssze tudja szinkronizlni a megjelenst s a kivezetsek csatlakozsait az Xcode-dal. Az IBActi on azonost mveletek fggvnyeit szinkronizlja. A Basi cvi ewcontro ll er. m fjlban a kvetkez utastst l~uk: #import ""Basicurviewcontroller.h"" @implementation Basicurviewcontroller
- (IBAction)btnclicked:(id)sender {
}

//.o o
A
kvetkezkben

megnzzk a kivezets hasznlatt a gyakorlatban.

Kivezets hozzadsa kd hasznlatval

Kivezetsek vagy mveletek nzetvezrlhz val hozzadsnl hasznlha~uk az Interface Buildert, generlhatunk osztlyfjlokat, vagy megrha~uk a kdot mi magunk is. Ehhez vgezzk el a
kvetkez

lpseket:

1. Manulisan rjunk egy msik IBOutlet elemet az osztlyhoz (Basi curviewcontroll er. h) a kvetkezkppen:
#import <UIKit/UIKit.h> @interface Basicurviewcontrolle r : urviewcontroller { IBOutlet UITextField *nameTextField;
IBOutlet UITextField *ageTextField;

- (IBAction)btnclicked:(id)sende r ; @end

54

A kd s a felhasznli fellet egyttmkdsnek az alapjai

2. Ebben az esetben manulisan rendelnk kivezerst (ageTextField nven) a nzetvezrlhz. Mentsk el a fjlt, s vlasszuk a File's Owner elemet a Basicurviewcontrol l er.xi b fjlban. Figyeljnk az Idenrity Inspector ablakra, ez a 3. 18. brn jobb oldalt lthat.

Megjegyzs A kivezetsek a sasicurviewcontroller.h alatt listzdtak ki. A 3.13. bra alapjn lthat, hogy az ldentity lnspector ablakban kivezetsek ltrehozsakor a kivezetsek a Basicurviewcontroller.xib alatt listzdtak ki, ugyanis a kivezetsek ekkor mg nem kapcsoldtak a . h fjl hoz.

+ 3.18. bra

Az ageText Fi el d kivezets megjelenik a Class Outlets szekciban. Ez muta*, hogy a kzvetlen l a . h f jlba trtn kdols is m kdik.

Megjegyzs Ha trlni akarjuk a Basi curviewcontrol l er. h alatt ki listzott

kivezetsek brmelyi kt, azt a . h fjlbl manulisan kell eltvoltanunk. Ez egyrtelm, ha ltjuk, hogy a mnusz (-) gomb szrkre vltott.

55

3. fejezet: Kivezetsek,

m veletek

nzetvez r lk

Ha ezen a ponton egy msik kivezerst runk a projekthe az lndentity lnspector ablakban, az a Basicurviewcontroller.xib alatt megjelenik a listban (lsd a 3.19. brt) . Miutn a kivezets ltrejtt a . h fjlban, az megjelenik a Basi curvi ewcontro ll er . xi b alatt.

3.19. bra

HOGYAN DEKLARLJUNK KIVEZETSEKET S MVELETEKET?


Az Apple demiban s szmos ms bevezet jelleg fzetben a kivezetseket s a mve leteket leginkbb azonnal a . h fjlban hozzuk ltre, majd ktjk ssze az Interface Builder nzetelemeivel, hiszen ez a kd s a felhasznli fellet sszekapcsolsnak leggyorsabb s legelterjedtebb mdja. A kivezetsek s a mveletek Interface Builderben val ltrehozsa, majd a . h fjlban val megjelemtse egy fokkal nehezebb. Emellett azonban annak is megvannak az elnyei, hogyha a kivezetseket s a mve leteket az Interface Builderben direkt hozzuk ltre. gy a felhasznli felletet nem csak programozk tudjk megtervezni. A tervez gy foglalkozhat a felhasznli fellet kllemvel, gy hozha* ltre a mveleteket s a kivezetseket, gy ktheti ssze ket a nzetelemekkel, hogy nem foglalkozik a kddal. Miutn a tervezs vget rt, kvetkeznek a programozk, s meghatrozhatjk az Interface Builderben ltrehozott mveleteket s kivezetseket.

56

A kd s a felhasznli fellet

egyttmkdsnek

az alapjai

A nzetvezrl kapcsolata a mvelethez s a kivezetshez


Miutn a mveleteket s a kivezetseket meghatroztuk a nzetvezrlben, valahogy ssze kell ket kapcsolnunk a View ablak nzetelemeiveL Ahhoz, hogy a View ablakban tallhat nzetelemek esemnyeit a nzetvezrlben meghatrozott mveletekhez kapcsoljuk, hasznljuk a Control-kattintst, majd hzzuk a nzetelemet a File's Owner elemre. Ekkor hasznljuk a Control-kattintst, majd hzzuk a Click Me (kattints rm) gombot a File's Owner elemre. Ekzben egy elasztikus szalag jelenik meg. Ha az egr a File's Owner elemre r, az elem kiemelclik Osd a 3.20. brt), a gomb elengedsvel pedig egy felugr ablak jelenik meg. A bt nel i c ked: mveletet most mr ltjuk az E ven ts (esemnyek) szekcinl.
ICJMewController xib

Please enter your name

ClickMe

3.20. bra

Figyelem A mveletek kapcsolshoz mindig a View ablak hzunk a File's Owner elemre.

nzetelemeibl

l)

meghatrozott kivezetsek s a View ablak nzetelemeinek sszekapcsolshoz vgezznk Control-kattintst, majd hzzuk a File's Owner elemet arra a nzetelemre, amelyhez kapcsoini szeretnnk Osd a 3.21. brt). Ekkor az Outlets group (kivezetsek csoportja) alatt lthatjuk azoknak a kivezetseknek a listjt, amelyeket a nzetvezrlben mr meghatroztunk Jelljk ki a nameText Fi el d kivezets t.

nzetvezrlben

-Megjegyzs Az ageTextFi e l d ki vezetst ebben a pldban nem hasznljuk, kizrlag illusztrciknt tntettk fel.

57

3. fejezet: Kivezetsek, mveletek s nzetvezrlk

Please enter your name

CllckMe

3.21. bra

Figyelem A kivezetsek kapcsolshoz mindig a File's Owner elemet hzzuk a


View ablak megfelel nzetelemre. Ez a mveletek sszekapcsolsnak tkletes ellentte.

A mveletek s a kivezetsek kapcsolsa utn a File's Owner elemre kattintva jobb egrgombbal (vagy Control-kattintssal) nzhe~k meg a kapcsoldsokat (lsd a 3.22. brt). Ltha~uk, hogy a nameTextField kivezets a Round Style Text Field nzetelemhez kapcsoldik, a bt nel i cked: mvelet pedig a Round Rect Button Tou ch Up In si de esemnyhez.
V"ew

Please enter your name

Cllck Me

3.22. bra

Amikor gombot ktnk mvelethez, a Touehed Up In si de esemny automatikusan a m velethez ktdik, olyannyira ltalnos a gomb megnyomsa utasts az iPhone-alkalmazsokban. Haszeretnnk ms esemnyeket ktni a nzetvezrlben meghatrozott mvelethez, kattintsunk jobb gombbal a gomb nzetelemre, majd hzzuk az esemnyt (amelyet egy kr jelez) a kivnt File's Owner elemre (lsd a 3.23. brt).

58

A kd s a felhasznli fellet

egyttmkdsnek

az alapjai

IIIIIIi\lll

3.23. bra

Ha a mvelet megfelelerr kapcsoldik, ezt ltnunk kell az esemny neve melletti listban (lsd a 3.24. brt).
s:(UMe-oYController.xib

EJl
Y.~w

DD

\4ode

.,.
Please enter your name
nrst Respon<

Cllck Me

3.24. bra

59

3. fejezet: Kivezetsek,

mveletek

nze tvezr l k

Kivezetsek exponlsa tulajdonsgokknt


Idzzk fel a Basicurview controller . h fj lt, amiko r egy nerlrunk: #import <UIKit/ UIKit . h> interface Basicur viewcontroller : urviewcontroller @ IBOutlet UITextFi eld *nameTextField;
mvelete t

s egy kivezerst ge-

- ( IBAction)btnClic ked :(i d)sender; @ end

A nameTextField a UITextField tpu snak egy IBOutlet pldnya. Az iPho ne-progra m ozsnl j gyako rlat a tagvltoz exponlsa tulaj d o n sgknt (pr o perty) az @ property azonostval : it/U IKit . h> #i mport <UI K @ interface Basicurviewcontroller : urviewcontroller IBOutlet UITextField *nameTextFiel d ;

property ( nonatomic , retain) UITextFiel d *nameTextFi eld; @ - (IBAction) btncl i cked:(i d)sender; @ end

Megjegyzs Az @ property azonosthoz az IBOutlet tag is hozzad hat . Ez a szint axis az Apple nyelvben rendkvl elterjedt:

@ prope rty ( nonatomic , retain ) IBOutlet UITextField *nameTe xtField;

Megjegyzs A non atomi c s a re ta i n azonostk hasznlathoz nzzk meg a D fggelket. Ott talljuk a bevezet anyagot az Objective-C-hez . Ugyangy az @ synthesi ze kulcsszt is csak rviden trgyalj uk; ezt rszleteiben szintn a fggelkben magyarzzu k el.

60

A kd s a felhasznli fellet

egyttmkdsnek

az alapjai

Ha a kivezers t m r tulajdo n sgknt expo nltuk, m eg kell hatrozn unk a tulajdo nsg

getter s setter fggvn yei t. E nnek leggyorsabb s legknnyebb m d ja az @ synthesi ze


kulcssz hasznlata a Basi curviewcontroller. m fjlban : #i m port "Basicurviewcontroller . h" @ implementation Basicurviewcontroller @synthesize nameTextField;

A mvelet leprogramozsa
A korbbiakban a R o und Rect Button n zetelem Touch up rnside esem nyt a nzetvezrl b en m eghatrozo tt btncl i ck : mvele ttel kapcsoltuk ssze. A bt nel i ck: m etdus
vgrehaj tsh oz a
kve tkez

k d o t r ju k a Basicurviewcontroller . m fj lba:

#i m port "Basicurviewcontroller.h" @implementation Basicurviewcontroller @synthesize nameTextField; - (rBAction)btnClicked: ( id)sender { NSString *str = [[NSString alloc] initWithFormat: @ "Hello, %@", nameTextField . text ]; urAlertview *alert=[[urAlertview alloc] initWithTitle:@"Hello" message: str delegate : self cancelButtonTitle: @ "OK" otherButtonTitles:nil, nil] ; [al ert show]; [al ert release]; [st r re l eas e] ;

- (void)dealloc { [nameTextField release]; [supe r dea ll oc] ;

end @

Az @ synthesize a zonost gene rlja a fo rdtprogramnak (co mpiler) a nameTextField tulajdonsg lekrd ez (getter) s bellt (setter) fggvn yeit. A urAlertview osztly figyelmeztet

ablakot d o b ki a meghatrozott tar talo mmal.

61

3. fejezet: Kivezetsek, mveletek s nzetvezrlk

Az alkalmazs tesztelshez ssnk Command-R-t az Xcode-ban. Ha az alapmretezett SDK az iPhone Simulator (3.0) (lsd a 3.25. brt), akkor az iPhone Simulator elindul.

3.25. bra

rjuk be a nevnket, s kattintsunk a Click Me gombra. A 3.26. brn l~uk a bert nevet mutat figyelmeztet kpjelzst.

Egy sszetettebb plda


A fenti projektet hasznljuk, de gy mdos~uk a programot, hogy a felhasznlnak titkos PIN kdot kelljen bernia a figyelmeztets megjelentshez. A 3.27. bra muta~a, hogy ehhez mely nzetelemeket kell a View ablakhoz adni. A kiegszt nzetelemek a kvetkezk: Label, Round Rect Button.

A mveletek s kivezetsek meghatrozsa


Adjuk a
kvetkez

objektumokat s

mveleteket

a Basi curviewcontroller. h fjlhoz:

#import <UIKit/UIKit.h> @interface Basicurviewcontroller : urviewcontroller { IBOutlet UITextField *nameTextField; NSMutablestring *secretPin;

@property (nonatomic, retain) UITextField *nameTextFiel d ; - (IBAction) btnCl icked : (id)sender; - (IBAction)clearPinBtnclicked:(id)sender; - (IBAction)pinBtnclicked:(id)sender; @end

62

A kd s a felhasznli fellet

egyttmkdsnek

az alapjai

..._., Vew

...

Please enter your name

Enter you r secre! PIN


.JI ... ....
-~

.;

,.

)C

r;

ClearPIN Click Me

3.26. bra
l!as'cUIVewContro:ler xrb

3.27. bra

3.28. bra

63

3. fejezet: Kivezetsek,

mveletek

nzetvezrlk

Az NSM utablestring osztly mdosthat sztringet jell (vagyis a tartalma megvltoztathat az inicializls utn). Ezzel ellenttben a NSStri ng osztly nem mdosithat sztring (vagyis a tartalma nem vltoztathat meg az inicializls utn).

A mveletek s kivezetsek sszektse


Az Interface Builderben kssk az t Ro und Rect gombot a pi nBtncl i c ked: mvelethez . Ezzel egy egyedli mvele t kezeli az t gom b Tou ch up In si de esemnyt. Ezutn kssk a Clear PIN gombot a cl earPi natnel i c ked: mvelethez . A File's Owner elem kapcsolatainak igy a 3.28. brnak megfelelen kell kinznie.

A mveletek megvalstsa
A Bas i curviewcont ro ll er. m fjlban a
#import "Basicurviewcontroller.h" @ implementation Basicurviewcontroller @ synthesize nameTextField; - (IBAction)clearPinBtnClicked:(id)sender { //---clears the secret pin--[secretPin setstring:@""];
}
kve tkez

vltoztatsokat eszkzlj k:

- (IBAction)pinBtnclicked:(id)sender { //---append the pin entered to the string--[secretPin appendstring:[sender titleForstate:urcontrolstateNormal]];


}

- (IBAction)btnclicked:(id) sender { //---if the user has entered the pin correctly--if ([secretPin isEqualToString: @"2345"]) { NSString *str = [[NSString alloc] initwithFormat:@"Hello, %@", nameTextField.text ]; urAlertview *alert = [[UIAlertview alloc] initWithTitle:@"Hello" message: str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [al ert show] ; [alert release]; [str release];
}

64

A kd s a felhasznli fe llet

egyttmkds nek

az alapjai

- (void)vi ew i dLoad { D / / -- - init the string with an initial capacity of 1 -- secretPin = [[NSMutablestring alloc] initWithCapacity:l]; [supe r vi ewDidLoad];

- (voi d) deal loc { [nameTextField release]; [secretPi n release]; [super deal loc] ;

A View betltsekor az elz kdban inicializljuk a secretPi n talakithat szttinget, kezdeti kapacitsa legyen egy. Az talakthat sztting olyan sztting, amelynek a tartalma szerkeszthet. Ebben az esetben gy inicializljuk, hogy a kezdeti hosszt egyre lli~uk. gy, arrkor a felhasznl az 1-5-s gombok valamelyikt megnyomja, a pi nstncl i c ked : metdus lp letbe. A t i t l e Forstate: metdust a UICont ro l StateNormal llandval egytt hasznljuk arra, hogy a gomborr megjelentett szveget kibontsuk, majd a secretPi n szttinghez fzzk:

3.29. bra

[secretPin appendst ri ng: [s ende r t i t le Forstate:UIControlstateNormal ]];

Figyelem A UICont ro l stateNorma l lland adott nzet norml megjelenst jelenti (vezr l elem j. A megjelents egyb llapota lehet UICont ro l stateHi g hl i ghted (amikor a nzet kiemelt) s UICont ro l stateDi sabled (amikor a nzet letiltott) .

ll
ll

Az alkalmazs els indtshoz nyomjunk Command-R-t az iPhone Simulatorban. A felugr ablak most csak akkor jelenik meg, ha a felhasznl a megfelel kdot berta
~sd

a 3.29. brt).

65

3. fejezet: Kivezetsek,

mveletek

nzetvezrlk

Nzetvezrlk
Az elzekben a nzetalap alkalmazsprojektrl volt sz, amely alapveten tartalmaz egy elre bellitott nzetvezrlt az alkalmazsokhoz. A kvetkezkben azt vizsgljuk meg, hogyan adjunk az alkalmazshoz manulisan nzetvezrlt, illetve hogyan kapcsoljuk egy XIB fjlhoz. Ehhez a legjobb egy ablakalap alkalmazs- (Window-based Application) projektet ksztennk Az ablakalap alkalmazsprojekt sablonja olyan projektcsontvzat hoz ltre, amelyben sszesen egy deleglt s egy ablak van. Ez a sablon kiindulsi alap brmilyen iPhone-alkalmazs fejlesztshez. Ksztsnk teht j ablakalap alkalmazsprojektet az Xcode-dal (lsd a 3.30. brt).

Choose. a template for your new project

haVIgatiOn - based

O".nGL ES
Application

Applk alktn

hblbr Apphcat&on

'MilcOSX
Applauon Aud to Unlu
Aut~tor

Action

VIew-based Appllatlon

lundle
Command U ne: Utllity
Oynamlc Ubnry
Framework

Opllon.s

Use Core Data for nonge

Description This template provteles a starting point for any appllatlon. tt preMdes just &n applicatJon delegate ..nd

Kernel Extension
Standard Apple Plug - IM
St;nlc Ubrary

a wtndow.

3.30. bra

lel

Nevezzk el a projektet Basi cUI2-nek. A projekt ltrehozsa utn a 3 .31. brnak megfefjllistt l~uk. A nzetalap alkalmazs s az ablakalap alkalmazs kztt az a f klnbsg az, hogy az ablakalap alkalmazsprojekt ltrehozsakor nincs alapmretezett nzetvezrl - az alkalmazs csak egy alkalmazsdelegltat s egy fablakot hoz ltre.

66

Nzetvezrlk

3.31. bra

Nzetvezrl

hozzadsa

Nzetvezrl (View Controller) osztly manulis hozzadshoz kattintsunk jobb gombbal a projekt nevre (sas i cur 2) az Xcode-ban, s vlasszuk az Add ~ New File (hozzads ~ j fjl) opcit. A ksbbiekben le kell tlteni a forrskdot az albbiak elvgzshez. Ahogyan a 3.32. brn, a New File (j fjl) ablak legyen elttnk. Az iPhone OS szekci alatt a bal oldalon vlasszuk a Cocoa Touch Class osztlyt, majd a urvi ewcontroller alosztlysablont jobboldalt. Vlasszuk a With XIB for User Interface opcit, amellyel a nzetvezrl osztly mellett egy XIB fjlt is hozzadunk a projekthez. Nyomjuk meg a Next (kvetkez) gombot. A kvetkez ablakban nevet kell adnunk az j nzetvezrl osztlynak. Legyen Myviewcontroller.m (lsd a 3.33. brt) . Ezutn elkszl a megfelel .h fjL Kattintsunk a Finish (befejezs) gombra. Ezzel hrom fjl kszl el (lsd a 3.34. brt):

Myviewcontroller.h Myviewcontroller.m Myviewcont roller.xib

67

3. fejezet: Kivezetsek,

mveletek

s nzetvezrlk

Newfile
Choose a U!:mplilte for your new file:

.m
NSObject subclass
Resource

.m
UITableView<:eU

.m
urrableViewContr

subclass

olier subclass

Userinterface
W.acOSX AppleScript C iind C+..Coubon

.m
UIViewsubda.ss

.m
4iliilll'*
~ W!th XIB for user interface

.m
UnttTenCue
c~ss

Coe oa lnterfKe Bullder SOK


Purejava

Opt ions

Pure Python

Ru by
Sync~ces

Descri ptio n An ObjecuYe-C ~s whldlls a subdau of UIViewController, ...... th an optiOnal header file wh1c.h
indudes the <UIKtt/UIKlt.h> header. A xtB file contaJning a vtew conftgured for thts View Controller ts al so included.

Oth

3.32. bra
()

Newfile

New UIVIewController subclass with XII

File Name
~ Also crute "MyVtcwController.h"'

Location: LIOesktop/Objective-C Book/Sourc.e. Code~ ( Choose.. .. )

Targets:

3.33. bra

68

Nzetvezrlk

3.34. bra

J:..:.sztsnk egy pldnyt az imnt ltrehozott nzetvezrlbl a Basicur2oelegate.h fjl ban, majd exponljuk tulajdonsgknt (propcrt)'), hogy az egsz alkalmazsban hasznlni tudjuk:
#import <UIKit/UIKit.h> @cl ass MyViewcontroller; @interface sasicUI2AppDelegate : NSObject <UIApplicationoelegate> { urwindow *wi ndow; MyViewcontroller *myViewcontroller;

@property (nonatomic, retain) IBDutlet urwindow *window; @property (nonatomic, retain) MyViewcontroller *myViewcontroller; @end

ltt eldeklarlst vgznk (rszletesebben lsd a D fggelkben), ezzel jelezve a forditprogramnak, hogy a Myviewcontroller osztlyt valahol meghatrozzuk a projektben:
@class MyViewcontroller;

kdot a sas i cur2oel e gate .rn fjlba, hogy ezzel ltrehozzuk a MyViewcontroller osztly pldnyt, majd llitsuk annak nzett a jelenlegi ablakhoz:
#import "sasicur2Appoelegate.h" #import "MyViewcontroller.h" @implementation BasicUI2Appoelegate @synthesize window; @synthesize rnyviewcontroller;

Helyezzk a

kvetkez

69

3. fejezet: Kivezetsek, mveletek s nzetvezrlk

- (void)applicationoidFinishLaunching:(UIApplication *)application { //---create an instance of the Myviewcontroller--MyViewcontroller *viewcontroller = [[MyViewcontroller alloc] initWithNibName:@"Myviewcontroller" bundle:[NSBundle mainBundle]]; //---set the instance to the property--self.myviewcontroller = viewcontroller; [viewcontroller release]; //---add the view of the view controller--[window addsubview: [myviewcontroller view]];

ll override point for customizatien after application launeh [window makeKeyAndvisible];


- (void)dealloc { [myviewcontroller release]; [window release]; [super dea ll oc] ;

@end
A [BasicUI2.'{jp} kdfjl

Amikor az alkalmazs fut, a kd hatsra az jonnan hozzadott

nzetvezrl

betlt.

A nzet szemlyre szabsa


A nzetvezrl megfelel bektse utn testre szabjuk az j nzetet gy, hogy az valami hasznosat is csinljon. Kattintsunk ktszer a Myviewcontroller.xib fjlra, s adjuk a web nzetelemet a View ablakhoz (lsd a 3.35. brt). A Web egy olyan webbngsz nzetelem, amellyel webes tartalmakat tudunk megjelenteni. A Myviewcontroller.h-ben ksztsnk kivezerst a Web nzetelemhez, s exponljuk tulajdonsgknt:
#import <UIKit/UIKit.h> @interface MyViewcontroller : UIViewcontroller { IBOutlet urwebview *webview;
}

@property (retain, nonatomic) urwebview *webview; @end

70

Nzetvezrlk

Flle'sOwner

.---,.,_-.-...

"..

_,----

.
Label
SegtM:I' ted

"""

ROIUld aea

l--

l.lf'NI,bVIew ob,tKt

Providts a ~to embed ~content. A urt tw ~to a Wt.....tow-,

and KnC rtq~U tD load wrla Corottnt. Tt"l d.ut. an &ISO bot uud to~ b.:tc oWtd forwvd '" ttw ~torv of-~. and Ht

'"Cl

tfl

3.35. bra

A MyViewcont roller .xib fjlban kssk a Icivezetst a Web nzetelemhez. A kapcsolat mkdsnek leellenrzshez kattintsunk jobb gombbal a File's Owner elemre, ahol ltnunk kell a kapcsaldst Osd a 3 .36. brt) .

3.36. bra

71

3. fejezet: Kivezetsek, mveletek s nzetvezrlk

A Myviewcontroller.m fjlba rjuk a kvetkez kdot; gy a nzet betltse utn azonnal az Apple.com weboldalt lthatjuk a Web nzet alatt:
#import "MyViewController.h" @implementation MyViewcontroller @synthesize webview;

ll Implement viewDidLoad to do additional setup after loading the view, ll typically from a nib. - (void)viewoidLoad { NSString "strurl = @"http://www.apple.com";
//---create an URL object--NSURL "url = [NSURL URLWithString:strUrl]; //---create an URL Request object--NSURLRequest *request = [NSURLRequest requestwithURL:url]; //---load the request in the urwebview--[webview loadRequest:request]; [super viewoidLoad];

- (void)dealloc { [webview release]; [super dealloc];


}

@end

Az alkalmazs tesztelshez nyomjunk Command-R-t az iPhone Simularorban. A 3.37. bra a programot mutatja az Apple honlapjval.

SSZEFOGLALS
Ebben a fejezetben a XIB fjlok hasznlatrl s a nzetvezrlk iPhone-alkalmazsokban betlttt szereprl volt sz. A kivezetsek s a mveletek megrtse ltfontossg, hiszen az iPhone-alkalmazs fejlesztsnek a sarokkveit jelentik. A ksbbiekben tbbszr tallkozunk velk.
3.37. bra

72

Nzetvezrlk

A kvetkez fejezetben a virtulis billentyzet (amely automatikusan felugrik, ha a felhasznlnak adatokat kell az alkalmazsokba vinnie) hasznlatt tekin~k t.

1. Kd hasznlatval deklarljunk, majd hatrozzunk meg kivezetst a UITextField n-

zetelemhez. 2. Kd hasznlatval deklarljunk, majd hatrozzunk meg


mveletet.

A FEJEZET TUDNIVALI
Trgy
Delegcis fjlok
Nzetvezrlk

Kulcsfogalmak
A delegcis fjlok azt a kdot tartalmazzk, amelyek az alkalmazs betltsekor/lelltsakor hajtdnak vgre. A nzetvezrlkkel nzeteket alaktunk, naviglunk s a memrival operl unk. A mvelet olyan metdus, amely a nzetelemek ltal elhvott esemnyeket kezelik (pldul ha egy gombra kattintunk) a View ablakban. A kivezets arra val, hogy a kd programozottan mutasson a nzetelemre a View ablakon. Hasznljuk az IBOutl et kulcsszt: IBOutlet UITextField * nameTextField; Hasznljuk az IBActi on kulcsszt: - (IBAction)btnclicked:(id)sender; Mveletek kapcsolshoz mindig a View ablak zunk a File's Owner elemre.
nzetelemeibl

(View Controller)

Mvelet (Action) Kivezets (Outlet) Kivezets hozzadsa kd hasznlatval Mvelet hozzadsa kd hasznlatval Mveletek kapcsolsa Kivezetsek kapcsolsa

h-

Kivezetsek kapcsolshoz mindig a File's Owner elemet hzzuk a View ablak megfelel nzetelemre.

73

Az elemek megismerse
A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan jelentsnk meg Alert elemeket a Felhasznlk szmra a urAlertview hasznla tval? Hogyan jelentsnk meg egyes belltsokat a U lAeti onsheet rvn? Hogyan vezreljk alapozsta UIPagecontrol segtsgve!? Hogyan jelentsnk meg kpeket a unmagevi ew-val? Hogyan jelentsnk meg a Felhasznlk ltal vlaszthat gombokat a ursegmentedcontro l-ral? Hogyan jelentsnk meg webes tartalmakat az alkalmazsainkban a urwebvi ew segtsgve!? Hogyan adhatunk hozz elemeket dinamikusan az alkalmazsainkhoz futs kzben? Hogyan kthetnk elemeket az
elemvezrlkhz?

Hogyan vltsunk az elemek kztt?

Eddig megismertk, hogy hogyan hozzunk ltre iPhone-alkalmazsokat az Xcode-dal s az Interface Builderrel. Ebben a fejezetben azokat az elemeket rszletezzk, amelyekkel b vthe~k az alkalmazsainkat. Megmuta~uk, hogyan adhatunk hozz elemeket az Interface Builderrel, valarnint hogyan hozhatunk ltre elemeket dinamikusan futs kzben.

4. f ej ezet: Az elemek megismerse

Az elemek hasznlata
Az elzekben mr szmos elem, a Round Rect Button (lekerektett gomb), a TextField (szveges mez) s a Label (cmke) mkdst is megfigyelhettk Ezek az elemek mind elg egyrtelmek, rajtuk keresztl pedig lehetsgnk nylik a kivezetsek s a mvele tek elvnek a megrtshez. Mg tbb elem tallhat az Interface Builder Libraty ablakban (lsd a 4. 1. brt).

V~Conu

..,..,.,.

NJVI~Uon.

T~

brCo

TmleVI-

lmJ9f:

P'lck

Ob)<

Extem~O

TUM; VI-

lm.lge:Vlew

label
Ubd

-.

:l
Web VI-

.....,v,_

TutVIew

Scrol'iiew

PtchrVl-

~tel'kkef

To><t
TutFtelcl
Swtdl

NJvigJUOfl

Round 1tec

Progrtis Vlrw AaMty Ind

P~eControl

Wlnd~

View

Su.rchlhr

S...-ch~r

tQvtg;lluon

Tootb;u

~rll uuon

Fluiblt:Sp

..
.......
fiudSPK
Tmll.ilr

T;~b

hl-tl:vn

Vhtw Controller

l.!YievwC

~ro

P'rcMdes onHr-IN~nt lunctionty lOt" 1ool~n. na\ri9a1~ bs. ~ ~ltuuon ~.TM. UNinrControler clns ~ suppom modoll vteWJ .and roUng \ll&rM ~n devke ~uon ~ges

4.1. bra

A Library ablak az albbi rszekre van osztva: Controllers - olyan elemeket tartalmaz, amelyek ms elemeket vezrelnek, pldul a View vezrlt, a Tab Bar vezrlt vagy a Navigation vezrlt stb. Data Views - adatokat megjelent elemeket tartalmaz, pldul az Image elemet, a Table elemet, a Data Pickert vagy a Picker nzetet. Inputs and Values - olyan elemeket tartalmaz, amelyek felhasznli beviteleket fogadnak el, pldul a Label, a Round Rect Button s a Text Field elemeket. Windows, Views & Bars - olyan elemeket tartalmaz, amelyek egyb elemeket jelentenek meg, pldul a View, a Search Bar vagy a Toolbar elemet.

76

Az elemek hasznlata

a Library ablakban tallhat nhny elem hasznlatt ismertetjk. em clunk az sszes elemet bemutatni, szmos elem mkdst azonban gy is megfigyelhetjk A fejezetben megismerkednk az elemek hasznlatnak nhny olyan alapelvvel, amelyeket ms esetekben is gond nlkl alkalmazhatunk. A

kvetkezkben

Az Alert elem hasznlata


Az egyik olyan elem, amely nem szerepel a Library ablakban, a urAlertview. A urAlertview egy Alert View-t (figyelmeztet ablakot) jelent meg a felhasznlnak, s rendszerint futs kzben hozzuk ltre, ezrt kdolssal kell megvalstanunk

Megjegyzs A urAlertview-val mr tallkoztunk az albbiakban a mkdst vizsgljuk meg.

elz

fejezetben. Az

A urA ertview akkor fontos, amikor zenetet kvnunk megjelenteni a felhasznl szl mra. Emellett gyors hibakeresknt is szolglhat, ha futs kzben szeretnnk megfigyelni egy vltoz rtkt. A kvetkez gyakorlatban a urAlertview-t vizsgljuk meg rszletesen. Tltsk le a megjellt programkdot.

Az Alert elem hasznlata


A programkd [UsingViews.<}p] a Wrox.com oldalrl tolthel le.

l. Hozzunk ltre egy j View-based Application projektet az Xcode segtsgve!, s nevezzk el usi ngvi ew s-nek

2. A usingviewsviewcontroller .m fjlban adjuk hozz a flkvrerr szedett programkdot a viewDidLoad metdushoz: - (voi d) view DidLoad { urAlertview *alert [[urAlertView alloc] initWithTitle:@"Hello" message:@"This i s an alert view" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

[al ert show]; [alert release]; [super view DidLoad] ;

77

4. fejezet: Az elemek megismerse

3. Nyomjuk meg a Command-R gombot, hogy az alkalmazst az iPhone Simulatorban teszteljk Ha betltttk az alkalmazst, az Alert elemet l~uk (lsd a 4.2. brt). 4. Visszatrve a Xcode-ba, mdostsuk az otherButtanTi t l es paramtert a flkvr rtk bell ts val: urAlertview *alert
=

[[UIAlertview alloc] initWithTitle:@"Hello" message:@"This is an alert view" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Option 1", @"Option 2", nil];

5. Adjuk hozz a flkvr sort a us i ngvi ewsvi ewcontro ll er. h fjlhoz: #import <UIKit/UIKit.h> @interface usingviewsviewcontroller <UIAlertviewoelegate> { urviewcontroller

@end 6. Adjuk hozz a


kvetkez

metdust a usingviewsviewcontroller.m fjlhoz:

- (void)alertview:(UIAlertview *)alertview clickedButtonAtindex: (NSinteger)buttonindex { NSLog([NSString stringwithFormat:@"%d", buttonindex]);

7. Nyomjuk meg a Command-R gombot, hogy az alkalmazst az iPhone Simulatorban teszteljk Kt tovbbi gomb is jelen van az OK gomb mellett (lsd a 4.3. brt). 8. Kattintsuk r az egyik gombra: az Option 1-re, az Option 2-re vagy az OK-ra.

9. Nyomjuk meg a Command-Shift-R gombot az Xcode-ban a Debugger Console


ablak megjelentshez. Figyeljk meg a kirt rtkeket. Futtassuk le tbbszr az alkalmazst, s nyomjuk meg a klnbz gombokat, hogy megnzhessk a kirt rtkeket.

78

Az elemek hasznlata

4.2. bra

4.3. bra

10. Figyeljk meg az egyes gombokra kattintva a kirt rtkeket:


OK gomb- O Option 1 -1 Option 2-2

Hogyan mkdik? A UIA l ertview hasznlathoz lnfle argumentumokkal:


elszr

hozzuk ltre egy pldnyt, s inicializljuk a k-

urAl ertView *al ert = [ [UIA l ertview a ll oc] i ni twi th Ti t l e :@"Hello" message:@"This is an alert view" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

Az

paramter az Alert elem megnevezse, a "He ll o". A msodik a "This is an alert view" zenet. A harmadik a deleglt, ez egy olyan objektum, amely a urAlertview objektum ltal kivltott esemnyeket kezeli. Jelen esetben ez a self, amely azt jelenti, hogy az esemnykezel az aktulis View Controller osztlyban valsul meg. A cancel-

els

79

4. fejezet: Az elemek megismerse

ButtonTitle paramter egy olyan gombot jelenit meg, amely eltnteti az Alert elemet. Az utols, a othe rButtonTi t l es paramter pedig, ha szksges, tovbbi gombok elhelyezst teszi lehetv. Ha nincs szksgnk tovbbi gombokra, ennek az rtke legyen egyszeren ni l. Az Alert elem modlis megjelenitshez hasznljuk a megjelenit metdust: [alert show];

Az Alert elem egyszer hasznlathoz igazbl nem szksges az ltala kivltott esemnyeket kezelni. Az OK gomb lenyomsra (ahogy azt a can ce l Button Ti t l e paramterben megad tuk) egyszeren eltnik az Alert elem. Ha egynl tbb gombot szeretnnk, a kvetkezkppen llitsuk be az otherButtonTi t l es paramtert:
urAlertview *alert [[UrAlertview alloc] initwithTitle:@"Hello" message:@"This is an alert view" delegate:self cancelButtonTitle:@"OK"
otherButtonTitles:@"option 1", @"option 2", nil];

Az otherButtanTi t les paramter vgre egy ni l-t kell tennnk, klnben futsi hiba kvetkezik be. Mr van hrom gombunk Tudnunk kell, hogy a felhasznl melyiket nyomta meg - klnsen, hogy az Option 1-et vagy az Option 2-t. Ehhez a urAlertview osztly ltal kivltott esemnyt kell kezelnnk. Ehhez pedig biztostsuk, hogy az elemvezrl megvalstsa a urA l ertviewDel eg ate protokollt:
@interface usingviewsviewcontroller
<UrAlertviewDelegate> { // ...

urviewController

A urA l ertvi ewoe l egate protokoll szm os, az Alert elemhez kapcsold metdust tartalmaz. Ahhoz, hogy megtudjuk, melyik gombot nyomta meg a felhasznl, az alertvi ew: cl i ckedButtonAtrndex: metdust kell megvalstanunk - (void)alertview:(UrAlertView *)alertview clickedButtonAtrndex: (Nsrnteger)buttonrndex {
NSLog([NSString stringwithFormat:@"%d", buttonrndex]);

A lenyomott gomb indexe a cl i ckedButtonAtindex: paramteren keresztl tovbbtclik.

80

Az elemek hasznlata

Ir

Megjegyzs Az Objective-C protokollok elvnek trgyalst a D fggelkben


talljuk.

J
Az Action tbla hasznlata
Jllehet az Alert elem tbb gombot is meg tud jelenteni, elsdlegesen a felhasznlk figyelmeztetsnek az eszkze. Ha olyan zenetet szeretnnk megjelenireru a felhasznlk szmra, amelyben tbb lehetsg kzl vlaszthatnak, az Alert elem helyett hasznljunk inkbb Action tblt. Az Action tbla egy gombgyjtemnyt jelent meg, amelybl a felhasznl kivlaszthat egyet. Mindig a kperny als rszn, a szlen bukkan fel, jelezve, hogy az Action tbla rszletei az aktulis alkalmazshoz kapcsoldnak. J plda az Action tbla hasznlatra az, amikor a Safariban megnyomjuk a plusz (+) gombot. Ekkor megjelenik egy Action tbla, amelyen hozzadunk egy knyvjelzt vagy az aktulis oldalt a Home kpernyhz, vagy elkldjk az aktulis oldal hivatkozst. A kvetkez gyakorlatban egy Action tblval dolgozunk.

Action tbla hasznlata


1. Az elz rszben ltrehozott projektet felhasznlva, az albbiak szerint mdostsuk a viewDidLoad metdust (a usingviewsviewcontroller .mfjlban): - (void)vi ewoidLoad { UIActionSheet *action ; [[UIActionsheet alloc] initWithTitle:@"Title of Action sheet" delegate:self cancelButtonTitle:@"OK" destructiveButtonTitle:@"Delete Message" otherButtonTitles:@"Option l", @"Option 2", nil]; [action showinView:self.view]; [action release]; [super viewoidLoad];

2. Adjuk hozz a usingviewsviewcontroller.h fjlhoz a dett utastst:

kvetkez

flkvren sze-

81

4. fejezet: Az elemek megismerse

#import <UIKit/UIKit.h> @interface usingviewsviewcontroller <UIActionsheetoelegate> {


}

urviewcontroller

@end 3. Adjuk hozz a usingviewsviewcontroller.m fjlhoz a dett utastst: - (void)actionsheet:(UIActionsheet *)actionsheet clickedButtonAtindex:(NSinteger)buttonrndex{ NSLog([NSString stringWithFormat:@"%d", buttonrndex]);
}
kvetkez

flkvren sze-

4. Nyomjuk meg a Command-R gombot, hogy az alkalmazst az iPhone Simulatorban teszteljle A 4.4. bra az Action tbla mkdst muta~a be. 5. Kattintsunk r valamelyik gombra: Delete Message, Option 1, Option 2 vagy OK 6. Nyomjuk meg a Command-Shift-R gombot az Xcode-ban a Debugger Console ablak megjelentshez. Figyeljk meg a kirt rtkeket. Futtassuk le tbbszr az alkalmazst, s nyomjuk meg a klnbz gombokat, hogy megnzhessk a kirt rtkeket. 7. Figyeljk meg az egyes gombokra kattintva a kirt rtkeket: Delete Message - O OptiDll 1-1 Option 2-2

OK-3

Hogyan mkdik?
Az Action tbla mkdse nagyon hasonlit az Alert elemre, de ms a megjelense. Az Action tbla megjelentshez adjuk meg azt az elemet, amelybl az Action tbla szrmazik. UIActionsheet *action [[UIActionsheet alloc] initWithTitle:@"Title of Action sheet" delegate:self cancelBut:t:onTitle:@"OK"

82

Az elemek hasznlata

destructiveButtonTitle:@"Delete Message" otherButtonTitles: @"Option l", @"Option 2", nil ]; [action showrnview:self.view]; A destructiveButtonTitle: paramterben megadott gomb piros.

4.4. bra

4.5. bra
elemvezrlnek

Az Action tbla ltal kivltott esemnyek kezelshez az tailla a UIActi onsheetoe l egate protokollt.

meg kell vals-

@inte rface Usingviewsviewcontroller : urviewcontroller <UIActionsheetoelegate> { // ... Ahhoz, hogy megtudjuk, melyik gombot nyomtk meg, az actionsheet:clickedButtonAtindex: metdust kell megvalstanunk - (voi d)actionsheet:(UIActionsheet *) actionsheet clickedButtonAtindex:(NSinteger)buttonindex{ NSLog([NSString stringwithFormat:@"%d", buttonindex]);

A lenyomott gomb indexe a cl i ckedButtonAtindex: paramteren keresztl tovbbtdik.

83

4. fejezet: Az elemek megismerse

A Page

vezrlelem

s az Image elem

Az iPhone Home kpernyjnek aljn egy pontsorozat lthat. A fnyes pont jelli az aktulisan kijellt oldalt. Ahogy a kvetkez oldalra lapozunk, a kvetkez pont vlik fnyess. Az iPhone SDK-ban a pontsorozatot a UIPagecontrol osztly jelenti meg. A 4.5. brn a Page vezrlelemet ltha~ uk mkds kzben az iPhone Home kpernyjn. A kvetkez gyakorlati rszben megnzzk, hogyan vltsuk az ImageView elemben megjelentett kpeket az alkalmazsainkban a Page vezrlelemmeL

A Page

vezrlelem

s az Image elem hasznlata

1. Az elz kt rszben ltrehozott projektet felhasznlva, adjunk hozz t kpet a Resources mapphoz gy, hogy thzzuk ket a PinderbL A 4.6. bra a projekthez hozzadott t kpet mutatja. 2. Kattintsunk ktszer a us i ngvi ews vi ewcontro ll er. xi b fjlra, hogy az Interface Builderrel szerkessznk. 3. Hzzunk t kt ImageView elemet a View abiakba (lsd a 4.7. brt). tfedsben helyezzk el ket (de ne teljesen) az brn lthat mdon.

Groups & Flles

e, UsingViews
._ Cl;asse.s Oth!!.r Source.s

Q} UsingViews_Prefix.pd
Y'

EJ iM;ac_old .jpe:g

~ m;un.m Resource..s

I
4.6. bra

lt.U.qpeg
~c8100 .j peq

MacPhJs.Jpf9
NaE.JP<9 UsingViewsVIewContr
M<WlWindow.xib

UsingViews- lnfo.plist

// .,.t ll:,oport
.,.
~c-r

UslngVte:

"U.tngYt

Fram~r1cs

Products

@aple-.entat ion

4. Jelljk ki az egyik ImageView elemet, nyissuk meg az Attributes Inspector ablakot, s a Tag tulajdonsgot llitsuk O-ra. Jelljk ki a msodik ImageView elemet, s a Tag tulajdonsgt llitsuk 1-re (lsd a 4.8. brt).

5. Hzzuk t a Page vezrlelemet a View ablakba, a lapok szmnak az rtkt pedig llitsuk tre (lsd a 4.9. brt).

Megjegyzs Nveljk meg annyira a Page


mind az t pont lthat legyen.

vezrlelem szlessgt, hogy

84

Az elemek hasznlata

4.7. bra

Al ph

-ui0
0 Opaqut C Hddtn O Cleu ContelCl Be:fore: Dnwtng O d1p Subvaews
- Autoresize Subvie:ws

Tag
Dnwtng

Stretchi ng

0.00 1

x
~

0[
y

O.OO j

G)

1.00
Wid th

0i

1.00
Height

Intenedon

O User Interaction Eniillltd


O Mulnplt Touch

4.8. bra

85

4. fejezet: Az elemek megismerse

~ View

ll of Pages

Current

O H1des for Single Page O Oefers Page Display


Cont,,..,-Cont~ t

D.'m
H. Al ignment v . Alignmo.nt Selected

O Highlighted 0 15!1 Enabled


Mode
, Sc._le To Fill

;j

o
Dr~wing

O Opaquo.
15!1 Clip Subvtews

O Hidden

Clear Context B.fore Drawing

Autortsize Subviews
Strt.tching 0.00

4.9. bra

6. Visszatrve az Xcode-ba, definiljunk hrom kivezets t s kt urrmagevi ew ob jektumot a us i ngvi ewsvi ewcontro ll er . h fjlban:
#impo rt <UI K UI Ki t.h> it/ @ inte r face usingviewsviewcontroller : urviewcontroller { IBDutlet UIPagecontrol *pagecontrol; IBOutlet urimageview *imageviewl; IBOutlet urimageview *imageview2; urimageview *temprmageview, *bgimageview;
}

@property (nonatomic, retain) UIPagecontrol *pagecontrol; @property (nonatomic, retain) urimageView *imageviewl; @property (nonatomic, retain) urimageview *imageview2; @ end

86

Az elemek hasznlata

7. Kapcsoljuk a hrom Icivezetst az elemekhez az Interface Builder View ablakban. A 4.1 O. brn az i magevi ewl , az i magevi ew2 s a pagecont ra l kivezetsek kapcsolatait lthatjuk.

4.10. bra

8. trendezhe~k az ImageView elemeit a View ablakban gy, hogy tfedjk egymst. 9. Adjuk hozz az albbi flkvrrel szedett utastst a usingviewsviewcontroller. m fjlhoz az Xcode-ban: #import "usingviewsview cont roller.h " @impl em entation usingviewsviewcontrol l er @ synthesize pagecontrol; @ synthesize imageviewl, imageview2; - (void) viewoidLoad { //- --initialize the first imageview to display an image--[imagevi ewl setimage:[UIImage imageNamed:@"iMac_old.jpeg"]]; tempimageview = imageview2 ; / / ---make the first imageview visible and hide the second--[imageviewl setHidden:NO]; [imageview2 setHidden:YES];

87

4. fejezet: Az elemek megismerse //---add the event handler for the page control--[pagecontrol addTarget:self action:@selector(pageTurning:) forcontrolEvents:urcontrolEventvaluechanged]; [super viewoidLoad];

//---when the page control 's value is changed- -- (void) pageTurning : (UIPagecontrol * ) pagecontroller
{

//---get the page number you can turning to-- NSinteger nextPage = [pagecontroller currentPage]; switch (nextPage) { case O: [ tempimagevi ew setimage : [UIImage i mageNamed: @"i Mac_ol d. jpeg")] ; break; case 1: [temprmageview setrmage: [UIImage imageNamed:@"iMac . jpeg"]]; break; case 2: [temprmageview setrmage : [UIImage imageNamed:@"Mac8100 . jpeg"]]; break; case 3: [temprmageview setrmage: [UIImage imageNamed:@"MacPlus.jpeg"]]; break; case 4: [temprmageview setrmage:[UIImage imageNamed :@"MacSE.jpeg "]]; break ; default: break;
}

//--- switch the two imageview views- -if (temprmageview.tag==O) { /1---imageviewl-- temprmageview = imageview2 ; bgrmageview = imageviewl;
}

else { //---imageview2--temprmageview = imageviewl; bgimageview = imagevi ew2;


}

//-- -animate the two views flipping--[urview beginAnimations:@"flipping view" context:nil]; [urview setAnimationouration:O . S] ; [urview setAnimationcurve:urviewAnimationcurveEasernout]; [UIView setAnimationTransition : urviewAnimationTransitionFlipFromLeft forview:temprmageview cache:YES]; [temprmageView setHidden:YES]; [UIView commitAnimations];

88

Az elemek hasznlata

[UIView beginAnimations:@"flipping view" context:nil]; [UIView setAnimationouration : O.S]; [UIView setAnimationcurve:UIViewAnimationCurveEaseinOut]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forview:bgimageView cache:YES]; [bgimageview setHidden:NO]; [UIView commitAnimations];

- (void) dealloc { [pagecontrol release]; [imageviewl release]; [imageview2 release]; [supe r de a ll oc] ;

- (void) didReceiveMemorywarning { ll Releases the view if it doesn't have ll a superview. [super didReceiveMemorywarning];

- (void)viewoidunload {

@end

10. Nyomjuk meg a Command-R gombot, hogy az alkalmazst az iPhone Simulatorban teszteljk Amikor megrintjk a kperny aljn tallhat Page vezrlelemet, az Image elem a 4.11. brn lthat kpet jelerri meg. Hogyan mkdik?

4 .11. bra

Amikor elszr tltjk be az elemet, az egyik ImageView elem megjelert egy kpet, a tbbit pedig eltakarja:
//--- initialize the first imageview to display an image--[i magevi ewl setimage: [U !Image i mageNamed: @"i Mac_o l d. jpeg"]] ; tempimageview = imageview2; //---make the first imageview visible and hide the second--[imageviewl setHidden:NO]; [imageview2 setHidden:YES];

89

4. fejezet: Az elemek megismerse

Azutn sszek~k a Page vezrlelemet, hogy amikor a felhasznl megrinti, egy esemnyt vltson ki, s elindtson egy metdust. Ebben az esetben a pageTurni ng metdust hvjuk:
//---add the event handler for the page control--[pagecontrol addTarget:self action:@selector(pageTurning:) forcontrolEvents:urcontrolEventvaluechanged]; [super viewDidLoad];

A pageTurning: metdusban hatrozzuk meg, hogy melyik kpet tltjk be a Page vezrlelem rtke alapjn:
//---when the page control's value is changed--- (void) pageTurning: CUIPagecontrol *) pagecontroller

//---get the page number you can turning to--NSinteger nextPage = [pageController currentPage]; switch (nextPage) { case O: [templmagevi ew setimage: [U limage imageNamed: @"iMac_old. jpeg"]]; break; case 1: [templmageview setimage: [UIImage imageNamed:@"iMac.jpeg"]]; break; case 2: [tempimagevi ew setimage: [U limage imageNamed :@"Mac8100. jpeg"]]; break; case 3: [temprmageview setimage:[UIImage imageNamed:@"MacPlus.jpeg"]]; break; case 4: [tempimageView setimage:[UIImage imageNamed:@"MacSE.jpeg"]]; break; default: break;
}

// ...

Ezutn bekapcsoljuk a kt ImageView elemet, s animljuk lnbz metdusaival:


//---switch the two imageview views--if (templmageview.tag==O) { /1---imageviewl--templmageview = imageview2; bgimageview = imageviewl;

ket

a UIView osztly k-

90

Az elemek hasznlata

else { //--- imageview2--temprmageview = imageviewl; bgrmageview = imageview2;

//--- animate the two views flipping--[UIView beginAnimations:@"flipping view" context:nil]; [UIView setAnimationouration:O.S] ; [UIView setAnimationcurve:urviewAnimationcurveEasernout]; [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forview:tempimageview cache:YES]; [temprmageview setHidden:YES]; [urview commitAnimations]; [UIView beginAnimations:@"flipping view" context:nil]; [UIView setAnimat ionouration :O .S]; [UIView setAnimationcurve:urviewAnimationcurveEasernout]; [UIView setAnimationTransition: urviewAnimationTransitionFlipFromRight forview:bgimageView cache:YES]; [bgrmagevi ew setHidden:NO]; [urview commitAnimations]; Ez esetben a tkrzses tmenetet alkalmazzuk az ImageView elemekre: [UIView setAnimationTransition: urviewAnimationTransitionFlipFromLeft forview:tempimageview cache:YES];

Elemek csoportositsa szegmentlt

vezrlelemmel

A szegmentlt vezrlelem egy olyan vzszintes elem, amely egy gombkszletet tartalmaz. Ha szegmentlt vezrlelemet alkalmazunk, a felhasznJk brmelyik benne lv gombot megrinthetik. Ezzel megszntetik az elzleg kivlasztott gomb kijellst. A kvetkez gyakorlati rsz azt muta~a be, hogyan csoportosthatunk tbb elemet a szegmentlt vezrlelemmel, valamint, hogy hogyan jellhetnk ki a segtsgvel egy elemcsoportot.
A szegmentlt
vezrlelem

hasznlata

A programkd [UsingViews2. ~p] a Wrox.com oldalrl tlthet le.

1. Hozzunk ltre egy View-based Application projektet az Xcode segtsgve!, s


nevezzk el us i ngvi ews2-nek.

2. Kattintsunk ktszer a usingviews2viewcontroller.xib fjlra, hogy az Interface Builderrel szerkesszk.

91

4. fejezet: Az elemek megismerse

3. Adjuk hozz a View ablakhoz a Segmented Control, View, Label


(gyzdjnk

kvetkez

elemeket Qsd a 4.12. brt):

meg arrl, hogy begyaztuk a View-ba).

First View

Second View

4.12. bra

4.13. bra

4. Adjunk hozz egy jabb View elemet (a Librarybl) a View ablakhoz, majd ehhez adjunk hozz egy Label elemet Qsd a 4. 13. brt). FigyelFile's Owner UsingVitws2Vie~ontroller First Responder UIRtsponder jnk a msodik elem elhelyezsre.." UMtw gyzdjnk meg rla, hogy a msodik elem nem rsze az elsnek. Arnikor ugyanis a msodik elemet egrrel hzzuk az elsre, az Interface Builder gy rtheti, hogy a msodik elemet az els gyermekv k4.14. bra vnjuk tenni. Ezt megelzend, a kurzorral helyezzk a msodik elemet az elsre. A View ablak ekkor gy nz ki, mint a 4.13. brn.

92

Az elemek hasznlata

5. Azt, hogy a kt elem azonos szinten van -e, gy ellenrizhetj k, hogy List mdban jelertjk m eg a usi ngvi ews2Vi ewcontroll er. xi b ablakot (lsd a 4.14. brt).

6. D eklarljuk az albbi kivezetseket a usi ngvi ews2Vi ew contro ll er . h fj lban:


#im po rt <UI K UI K h> it/ it. UIView controller { @i nt erface usingviews2Viewcontroller IBOutlet urview *viewl; IBOutlet UIView *view2; IBOutlet ursegmentedcontrol *segmentedcontrol;

@property (nonatomic, retain) UIView *viewl; @ property (nonatomic, retain) UIView *view2; @ property (nonatomic, retain) ursegmentedcontrol *segmentedcontrol; end @ 7. Kapcsoljuk a kivezetseket a View ablak megfelel elemeihez az Interface Builderben. (Elkpzelh et, hogy t kell helyeznnk a kt elemet, hogy hozzjuk kapcsolhassuk a kt urvi ew kivezets t.) 8. Adjuk hozz az alb bi flkvrrel szedett utastst a usingviews2viewcontrol ler.m fjlhoz az Xcod e-ban : #import "usingvi ews2viewcontroller . h" @m i plementation usingviews2viewcontroller @ synthesize segmentedcontrol ; @ synthesize viewl, view2; - (void)viewDidLoad { //---add the event handler for the segmented control --[segmentedcontrol addTarget:self action:@selector(segmentchanged:) forcontrolEvents:UIControlEventvaluechanged]; [super viewDidLoad];

//---when the segment has changed -- - (IBAction)segmentchanged:(id)sender { NSinteger selectedSegment = segmentedControl.selectedSegmentindex; if (selectedsegment == O) { //---toggle the correct view to be visible--[self.viewl setHidden:No]; [self.view2 setHidden:YES];

93

4. fejezet: Az elemek megismerse

else{ //---toggle the correct view to be visible--[self.viewl setHidden:YES]; [self.view2 setHidden:NO];


}

- (void)dealloc { [segmentedcontrol release]; [viewl release]; [view2 release]; [super dea ll oc] ;

9. Nyomjuk meg a Command-R gombot, hogy az alkalmazst az iPhone Simulatorban teszteljk.

10. Amikor megrintjk a First szegmenst, a First elem cmkje jelenik meg. Amikor a Second szegmenst rin~k meg, a Second elem cmkje jelenik meg Osd a 4.15. brt).

Arsl View

SecondV~w

4.15. bra

94

Az elemek hasznlata

H ogyan

mkdik?

Amikor betl~k az elemet, elszr sszektjk, gy amikor a felhasznl megrinti az egyik gombjt, ez kivlt egy metdust. Ebben az esetben a segme ntc hanged: metdust:
[segmentedcontrol addTarget:sel f action:@sel ector ( segmentchanged :) forcontrolEvents:UIControl Eventval uecha nged] ;

A segmentchanged: metdusban meghatrozzuk, hogy melyik gomb ra kattintottunk (a szegmentlt vezrlelem se l ectedsegmentrndex tulajdonsga rvn), majd megjelen~k, illetve elrejtjk a relevns elemeket:
- (I B i on) segmentChanged: ( id) sender { Act N nteger selectedsegment = segmentedcontrol . selectedsegm Si entindex ; i f (sel ectedsegment == 0) { //--- toggle the cor r ect view to be vi si ble - - [self . viewl setHidden:NO]; [self . view2 setHidden :YES] ; el se{ //--- toggle the correct view to be visi ble --[self.vi ewl setHidden: YES] ; [self.view2 setHidden:NO];

A Web View hasznlata


Ha weblapokat szeretnnk betlteni az alkalmazsunkbl, begyazhatunk egy webbngszt az alkalrnazsba a urwebview segtsgveL A Web View rvn egy krst kldnk a webes tartalom betltsre. Ez nagyon hasznos akkor, ha egy meglv webes alkalmazst szeretnnk natv alkalrnazss (mint amilyeneket a D ashcode segtsgvel runk) konvertlni. Csak annyit kell tennnk, hogy begyazzuk az sszes HTML-oldalt az Xcode-projektnk Resources mappjba, s futs kzben betl~k a HTML-oldalakat a Web elembe.

,, Megjegyzs Attl hogy milyen bonyolultak a webes alkalmazsai nk, termszetesen elkpzelhet, hogy tovbbi mveleteket is el kell vgeznnk ahhoz, hogy a webes alkalmazsunkat natw konvertljuk, ha olyan kiszolgloldali technolgikat tartalmaz, mint a CGI, a PHP stb.

fggen,

ll
A kvetkez gyakorlati rsz azt View segtsgveL
muta~a

be, hogyan tltsnk be weboldalakat a Web

95

4. fejezet: Az elemek megismerse

Weblapok betltse a Web View hasznlatval


A programkd fVsingViews3.ifpj a
~17rox. com

oldalrl tOJthel le.

1. Hozzunk ltre egy j View-based Application projektet az Xcode segtsgve!, s

nevezzk el usi ngvi ews3-nek. 2. Kattintsunk ktszer a usingviews3viewcontroller.xib fjlra ahhoz, hogy az Interface Builderrel szerkesszk. 3. Adjunk hozz egy Web View-t a View ablakhoz a Librarybl (lsd a 4.16. brt). A Web elem Attributes Inspector ablakban ellenrizzk a scales Page to Fit (az oldal tmretezse, hogy illeszkedjen) tulajdonsgot.

Mode Al p ha
Background

('-'Sc=ale:::....:..To::...;":Fil:.:..l::::-;::::==:::;-~

,~1===~
o
{S1 Opaque C Hidden {!j Clev Context Befor-e Drawing
~ Clip Subvtews

Tag
Dr~wing

f!'1 Autoresize Subvfew.s


Stretching
0.00

x
1.00

r-t
y

0.00

r-t

..:.;

r-t

1.00 Height

..,
\!.

Wid th
Interaction

User Interacti on Enabled

~ Multiple Touch

l
j

4.16. bra

96

Az elemek hasznlata

4. Deklarljunk egy kivezets t a Web elemnek a us i ngvi ews3vi ewcontro ll er. h fjlban:
#import <UIKit/ UIKit.h> @interface usingviews3Viewcontroller : UIViewController { IBOutlet urwebview *webview;

@property (nonatomic, retain) urwebview *webview; @end 5. Visszatrve az Interface Builderbe, kapcsoljuk ssze a we bvi ew kivezets t a Web elemmel. 6. Adjuk hozz a usingviews3viewcontroller.m fjlhoz a dett utastst: #import "u si ngvi ews3Vi ewcontro ll er. h" @implementati on usingviews3viewcontroller @synthesize webview; - (void) viewoidLoad { NSURL *url = [NSURL URLWithString: @"http://www.apple.com"]; NSURLRequest *req = [NSURLRequest requestWithURL:url]; [webview loadRequest:req]; [super viewDidLoad];
kvetkez

flkvrerr sze-

- (void) dealloc { [webview release]; [super dealloc];

7. Nyomjuk meg a Command-R gombot, hogy az alkalmazst az iPhone Simulatorban teszteljk Lthat, hogy az alkalmazs betlti az Apple.com oldalt (lsd a 4.17. brt).
4.17. bra

97

4. fejezet: Az elemek megismerse

Hogyan mkdik?
A Web elem URL-lel val betltshez elszr hozzunk ltre URL-lel egy NSURL objektumot, az URL Wi thstri ng metdus segtsgve!: NSURL *url
=

[NSURL URLWithString:@"http://www.apple.com"];

Ezutn hozzunk ltre egy NSURLRequest objektumot gy, hogy az NSURL objektumot a requestwi thURL: metdusba tovbb~uk: NSURLRequest *req

= [NSURLRequest requestwithURL:url];

Vgl tltsk be a Web elemet az NSURLRequest objektummal a loadRequest: metduson keresztl: [webview loadRequest:req];

Elemek dinamikus hozzadsa programkd hasznlatval


Eddig az alkalmazsunk sszes felhasznli fellett vizulisan hoztuk ltre az Interface Builderrel. Jllehet az Interface Builder viszonylagosan megknnyti a felhasznli fellet kialaktst, idnknt jobb, ha kdolssal hozzuk ltre. Pldul akkor, ha dinamikus felhasznli felletet kell ksztennk, tbbek kztt jtkok szmra.

Megjegyzs Vannak olyan fejlesztk, akik esksznek a felhasznli fellet kdolsos ltrehozsra. Az Interface Builder knnyen hasznlhat, de akad, akinek zavar lehet. Minthogy gyakran tbbflekppen is elvgezhetnk egy mveletet az Interface Builderben, ez akr szksgtelen bonyodalmakhoz vezethet.

A kvetkez gyakorlati rszben megismerjk, hogy hogyan hozzunk ltre elemeket dinamikusarr kdolssal, ennek segtsgvel megrthe~k az elemek felptst s kezelst.

98

Elemek dinamikus hozzadsa programkd hasznlatval

Elemek ltrehozsa programkd hasznlatval


A programkd [UsingViews4.ifp} a Wrox.com oldalrl tiJlthet fe.

1. Hozzunk ltre egy j View-based Application projektet az Xcode segitsgvel, s


nevezzk el usi ngvi ews4-nak. 2. Adjuk hozz a usingviews4viewcontroller.m fjlhoz a dett utastsokat: #import "usingviews4viewcontroller.h" @implementation usingviews4Viewcontroller - (voi d)loadview { //---create a urview object--urview *view = [[UIView alloc] initWithFrame:[urscreen mainscreen].applicationFrame]; view.backgroundcolor = [UIColor lightGraycolor]; //---create a Label view--CGRect frame= CGRectMake(10, 15, 300, 20); Ullabel *label = [[UILabel alloc] initWithFrame:frame]; label.textAlignment = UITextAlignmentcenter; label.backgroundColor = [UIColor clearcolor]; label.font = [UIFont fontWithName:@"Verdana" size:20]; label.text =@"This is a label"; label.tag = 1000; //---create a Button view--frame= CGRectMake(10, 70, 300, SO); UIButton *button = [UIButton buttonwithType:UIButtonTypeRoundedRect]; button.frame = frame; [button setTitle:@"Click Me, Please!" forstate:urcontrolstateNormal]; button.backgroundcolor = [UIColor clearcolor]; button.tag = 2000; [button addTarget:self action:@selector(buttonclicked:) forcontrolEvents:urcontrolEventTouchUpinside]; [view addsubview:label]; [view addsubview:button]; self.view = view; [label release];
kvetkez

flkvren sze-

99

4. fejezet: Az elemek megismerse

- (IBAction) buttonclicked: (id) sender{ UIAlertView *alert = [[UIAlertView alloc] initwithTitle :@"Action invoked!" message:@"Button clicked!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] ; [alert show] ; [alert release];
}

@ end

3. Nyomjuk meg a Command-R gombot,


hogy az alkalmazst az iPhone Simulatorban teszteljk A 4. 18. brn lthat, hogy a Label s a Round Rect Button elem megjelenik a nzeten. Ha rkattintunk a gombra, egy Alert View megjelert egy zenetet.

Hogyan

mkdik?

Az elemek programozott ltrehozshoz hasznljuk az elemvezrlben definilt loadvi ew metdust. Ezt a metdust csak akkor tudjuk megvalstani, ha futs kzben generljuk a felhasznli felletet. Ennek a metd usnak a hvsa automatikusan trtnik, ha hvjuk az elemvezrl vi ew tulajdonsgt, de az aktulis rtke ni l . Az els elem, amelyet ltrehozunk, a UIVi ew objektum, amelyet tovbbi elemek troljaknt is hasznlhatunk:

4.18. bra

//---c reate a UIVi ew object --UIVi ew *view = [ [UIView alloc] initW ithFram : [U e IScreen mainscreen] . applicationFrame]; //-- - set t he background colo r to li ghtgray- - view . backgroundcolor = [UIColor lightGraycolor] ; Ezutn ltrehozunk egy Label View-t, amely egy sztringet jelert meg: //- - - create a Label view--CGRect fram e= CGRectM (lO , 15 , 300 , 20) ; ake U lLabel *label = [[UILabel alloc] i nitW t hFrame:frame] ; i l abel.textAlignment = U ITextAl i gnme ntcenter; label.backgroundcol or = [UIColor cl earcolo r];

100

Elemek dinamikus hozzadsa programkd hasznlatval

label.font = [UIFont fontWithName:@"Verdana" size:20]; l abe l. text = @"This is a l abe l"; label.tag = 1000; Egyttal a tag tulajdonsgot is belltottuk, ez azrt hasznos, mert ezzel kereshetnk elemeket futs kzben. Ugyancsak ltrehozunk egy Button elemet a UIButtonTypeRoundedRect llandt tartalmaz buttonwi thType: metdussal. Ez a metdus egy UIRoundedRectButton objektumot ad vissza (amely a UIButton egy alosztlya). //---create a Button view--frame= CGRectMake(lO, 70, 300, 50); UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = frame; [button setTitle:@"click Me, Please!" forstate:urcontrolstateNormal]; button.backgroundcolor = [UIColor clearcolor]; button.tag = 2000; Ezutn sszekapcsolunk egy esemnykezelt a Touch up rnside esemnnyel, gy ha megrintjk a gombot, a buttoncl i c ked: metdust hvjuk: [button AddTarget:self action:@selector(buttonclicked:) forcontrolEvents:UIControlEventTouchUpinside]; Vgl hozzadjuk a l abe l s a button elemeket a korbban ltrehozott nzethez: [view addsubview:label]; [view addsubview:button]; Legvgl hozzrendeljk a view objektumot az aktulis elemvezrl view tulajdonsghoz: self.view =view;

A loadview metdusban nem kapjuk meg a view tulajdonsg rtkt (ha ez rendben van):
[self.view addsubview: label]; self.view = view; //--- this is not OK--//--- this is OK---

belli~uk,

akkor

Ha megprblnnk megkapni a view tulajdonsg rtkt ebben a metdusban, az krkrs hivatkozshoz s memria-tlcsordulshoz vezetne.

101

4. fejezet: Az elemek megismerse

Az elemek hierarchija
Miutn ltrehoztuk s hozzadtuk az elemeket, azok bekerlnek egy faadatstruktrba. Az elemek a hozzadsuk sorrendjben jelennek meg. Ennek ellenrzshez mdostsuk a korbban ltrehozott ursutton objektum helyt a kvetkezk szerint: CGRectMake (10, 30, 300, SO}. //---create a Button view--frame; CGRectMake(lO, 30, 300, SO); UIButton *button; [UIButton buttonwithType:UIButtonTypeRoundedRect]; button.frame ; frame; [button setTitle:@"click Me, Please!" forstate:urcontrolstateNormal]; button.backgroundcolor; [UIColor clearcolor]; button.tag ; 2000; [button addTarget:self action:@selector(buttonclicked:) forcontrolEvents:urcontrolEventTouchuprnside]; Ha jra lefuttatjuk az alkalmazst, lthat, hogy a gomb lefedi a cmkevezrl elemet (lsd a 4.19. brt), hiszen a gomb hozzadsa ksbb trtnt meg: [view addsubview:label]; [view addsubview:button]; Ha a hozzads utn meg szetetnnk vltoztatill az elemek megjelentsnek a sorrendjt, hasznljuk az exchangesubvi ewAtrndex: wi thsubvi ewAtrndex: metdust: [self.view addsubview:label]; [self. view addsubview:button]; [self.view exchangesubviewAtindex:l withsubviewAtindex:O]; [button release]; [l abe l re l eas e] ;

4.19. bra

4.20. bra

102

Vlts a nzetek kztt

Az

elz,

flkvren szedett utasts felcserli a Label s a Button elemek sorrendjt. Ha

jra lefuttatjuk az alkalmazst, a Label elem most mr a Button elem felett jelenik meg
~sd

a 4.20. brt) . A mr korbban hozzadott elemek sorrendjnek megjelentshez hasznljuk a kkdszegrnenset, amely megadja az egyes elemek tag tulajdonsgainak az rtkt:

vetkez

[self .view addsubview:label]; [self.view addsubview:button]; [self.view exchangesubviewAtindex:l withsubviewAtindex:O]; for (int i=O; i<[self.view.s ubviews count]; ++i) { urview *view= [self.view.subviews objectAtindex:i]; NSLog([NSString stri ngWithFormat:@"%d", view.tag]);
}
kvetkez

metdus a urvi ew objektum sszes elemr kilistzza:

-(void) printViews: (UIView *) view { if ([view.subviews count] >O){ for (int i=O; i<[view.subviews co unt]; ++i) { urview *v = [view.subviews objectAtindex:i]; NSLog([NSString stringWithFormat:@"view index: %d Tag: %d",i, v. tag]); [self printviews:v];
}

} else return;

Egy elem eltvoltshoz az elemhierarchibl alkalmazzuk a removeFromsupe rvi ew metdust az eltvoltani kvnt elemre. A [label removeFromSuperview];
kvetkez

utasts pldul eltvoltja a l abe l elemet:

Vlts a nzetek kztt


Egy View-based Application projekt ltrehozsakor az Xcode-ban, a projekt egyetlen
nzetet tartalmaz a hozz tartoz View controllerreL Ezt lthatjuk, ha mdostjuk az . xi b fjlt az Interface Builderben. Nha azonban tbb nzetre van szksgnk. Tegyk fel, hogy a felhasznl megad egy adatot egy nzetben, majd a megadott adat alapjn vltunk egy msik nzetre, amely valamilyen A
kvetkez mveletet

vgez.

gyakorlati rsz azt mutatja be, hogyan vltsunk kt nzet kztt, s homegfelel

gyan kssnk ssze egy j nzetet a

View ControllerreL

103

4. fejezet: Az elemek megismerse

Kt UIView kztti vlts


A programkd [VCExample.ifpj a lFrox.com o/da/rrJI tlthet le.

1. Hozzunk ltre egy j View-based Application projektet az Xcode segtsgve!, s


nevezzk el VCExamp l e-nek. 2. Kattintsunk ktszer a VCExampleviewcontroller.xib fjira ahhoz, hogy az Interface Builderrel szerkesszk.

3. Kattintsunk ktszer a view elemre a vcExamplevi ewcontroll er. xi b ablakban, majd


adjunk hozz egy Button elemet (lsd a 4 .21. brt). Emellett llitsuk a view httrsznt zldre.
,., n

Simui.ard Interbec

D~~:menu

Sutuslar

'-''

""=-===--===': yn":'

Too..,.
aonott'l

-'"""'='--:_ _ _ ===--.n_-;:! : ~~or '-'-='------'-iii!J :

Alph.&.u:kground

1.00

';)

......

P'k.ku\'inrrt

O.ter'K:hr

-.&v ...

o
~

T..
Dnwno

---O
M ()p;lque O Hidden O Our Conwct kforl! or..,!\9

1 2
M,menled

Label

.......

Ilound Rut

r----To~

O Oip Subvlews
~ Auuwua .. Su~

Ilound RKt ItUtort

Oi spty S&condVlew

-~"""""'"'"""'"-You c:~n ~~ d'le wgfl objen wntn il's Upl)f:d. ude, Image. ~d 01M.r ~u.vKe pr~mt.s ~ bunon ln ildd11~, you~'!." speaty .a
i)

lmplflnenu a button ttw; lnlerc:epu 1ouch

.... ,..

'

4.21. bra

4. Mdostsuk a VCExamp levi ewcontro ll er. h fjlt az Xcode-ban gy, hogy adjuk hozz az albbi, flkvrrel szedett programkdot: #import <UIKit/ UIKit.h> @interface VCExampleviewcontroller urviewcontroller {

//---declare an action for the Button view---(IBAction) displayview:(id) sender; @ end

104

Vlts a nzetek kztt

5. Visszatrve az Interface Builderbe, Control-kattintssal hzzuk a Button elemet a File's Owner elemre, s vlasszuk a di splayvi ew: -t Osd a 4 .22. brt).
VCExampltViewController .;x; ib
Vtr~~JWode

"'

IID

lmlli:D!I

flnt Responder

V1t.w

Disp1~y

SecondVlew

4.22. bra

6. gy sszekapcsoltuk a Button elem Tou ch Up In si de esemnyt a most hozzadott di sp l ayvi ew: mvelettel.
7. Kattintsunk jobb gombbal a Classes csoportra az Xcode-ban, s adjunk hozz egy j fjlt. Vlasszuk a Cocoa Touch Classes csoportot, majd a urviewcontroller alosztlysablont Osd a 4.23. brt).

8. Az elemvezrlt nevezzk el secondviewcontroller.m-nek.


9. Ezutn adjunk hozz egy j . xi b fjlt, gy a felhasznli felletet ltrehozhatjuk az Interface Builderrel. Kattintsunk jobb gombbal a Resources csoportra az Xcode-ban, s adjunk hozz egy j fjlt. Vlasszuk a User Interfaces csoportot, majd a View XIB-sablont Osd a 4 .24. brt).

10. Az . xi b fjl neve legyen: secondvi ew. xi b. Az Xcode mr tartalmazza azokat a fjlokat, amelyeket most adtunk hozz Osd a 4 .25. brt).

105

4. fejezet: Az elemek megismerse

Choose a template for your new file:

.m
NSObje_ct subclass

.m
UIT~bleViewCell

.m
UITabltViewControllu

subdan

subclass

Ap~e.Scnpt

.m
UMew subclass

.m

.m
Unn Tut Case class

C Vld C++ Cvbon Coc.oa


Interfillee luilder SOK Purejavit
Pure Python

De scription An Objecuve-c cWs which is a subclass of UIVIt.wController, with


an optional header fUt which lncludu the <UIKit/U IKit.h> huder.

Ru by
Sync Servku

"""''

PrevKtus

4.23. bra

Choose a template for your new file:

AppleSen p t

C and C++
CMbon

Du crlptlon An lntuh.ce Builder documtnt for ernting J. Cocoo1 Touch view.


To customl2t this documtnt, dng controb from the Ubnty onta the YttW and ust tht lnspector to stt propen i~. Conside-r add1ng a ~w connolle:r, or

Coe: oa lnttrfKt Ikulder SOK


Pure~~

Pure Python

Ru by
Sync Services

custom controller ctns w.th outltts ~d acbons conntc~d to your views to customln thdr be.havior.

4.24. bra

106

Vlts a nzetek kztt

Se<.ondViewContT1

Sec:Oild'oo'te\.Controtte
'JCE.t~Le

4.25. bra

11. Nzzk meg a secondviewcont roller . h fjlt. Lthat, hogy a Secondviewcontrol l er


osztly a urvi ewcontro ll er alaposztlybl szrmazik: #i mport <UIKit/ UIKit.h> @interface secondviewcontroller urviewcontroller { } @end 12. Kattintsunk ktszer a Secondvi ew . xi b fjlra ahhoz, hogy az Interface Builderben szerkesszk. Vlasszuk a File's O wner elemet a secondview . xib ablakban, s nzzk meg az Idencity Inspector ablakt (lsd a 4.26. brt). A Class rtke legyen secondviewcontroller.

uteontrot

UIO~te.Ptcker

Ullmage.PickerConuoller

n u11tli UllmigeVIew

4.26. bra

107

4. fejezet: Az elemek megismerse

13. Kapcsoljuk ssze a File's Owner elemet a view elemmel gy, hogy Controlkattintssal rhzzuk a view elemre (lsd a 4 .27. brt). Jelljk ki a view elemet.

1111111!111

First Respondu

Vie_w

4.27. bra

14. Kattintsunk ktszer a View elemre, s vltoztassuk meg a httrsznt narancssrgra, majd adjunk hozz egy Button elemet (lsd a 4.28. brt). 15. Adjuk hozz az albbi sorokat a secondvi ewcont ro ll e r. h fjlhoz, az Xcode-ban:
#import <UIKit/UIKit.h> @interface secondviewcontroller UIViewcontroller {
}
Return

//---action for the Return button---(IBAction) btnReturn:(id) sender; @end


4.28. bra

16. Visszatrve az Interface Builderbe, kapcsoljuk ssze a Return gombot a File's Owner elemmel, s jelljk ki a btnReturn :-t. 17. Adjuk hozz az albbi, flkvrrel szedett sorokat a vcExampleviewcontroller .m fjlhoz, gy amikor megnyomjuk a Display SecondView gombot, a msodik elemvezrlvel jellt elemet hozzadjuk az aktulis nzethez, amely ezltal meg is jelenik:

108

Vlts a nzetek kztt #import "VCExampleviewcontroller.h" //--- import the header file for the view controller--#i mpo rt "secondvi ewcont ro ll e r. h" @implementation VCExampleviewcontroller Secondviewcontroller *secondviewcontroller; //---add the view of the second view controller to the current view---(IBAction) displayView:(id) sender{ secondviewcontroller = [[Secondviewcontroller alloc] initWithNibName:@"Secondview" bundle:nil]; [self.view addsubview:secondviewcontroller.view]; - (voi d)dealloc { //---release the memory used by the view controller--[secondviewcontroller release]; [super de a ll oc] ;

@end

18. A btnReturn: metdust gy mdostsuk a secondviewcontroller.m fjlban, hogy annak nzett trljk az aktulis nzetbL Ekkor a view eltnik, s felfedi a megelz nzetet:
#import "secondviewcontroller.h" @implementation secondviewcontroller -(IBAction) btnReturn:(id) sender { [self.view removeFromsuperview];

@end

19. Nyomjuk meg a Command-R gombot az alkalmazs tesztelshez. Lthat, hogy amikor megnyomjuk a Display SecondView gombot, megjelenik a msodik nzet (lsd a 4.29. brt). Ugyangy, ha megnyomjuk a Return gombot, a msodik nzet
eltnik.

Hogyan rnkdik? A gyakorlati rsz els felben megismertk, hogyan kell hozzadni egy j . xi b fjlt a projekthez. Ezutn hozzadtunk egy UIViewcontroller alosztlyt, amellyel a hozzadott . xi b fjlt vezrelj k. A view-t a kvetkez lpsekkel kapcsoltuk ssze az elemvezrlvel az . xi b fjlban:

109

4. fejezet: Az elemek megismerse

1. Az

elemvezrl

nevt adtuk a Class tulajdonsg rtknek a File's Owner pontban.

2. sszekapcsoltuk a File's Owner pontot a nzettel. A lpsek sorrendje nagyon fontos. Ha nem hatrozzuk meg az elemvezrl osztlynak nevt, nem tudjuk sszekapcsolni a File's Owner pontot a nzettel.

4.29. bra

A msodik view megjelertshez ltrehoztuk a msodik majd annak view-jt az aktulis nzethez adtuk:
secondviewcontroller = [[Secondviewcontroller alloc] initWithNibName:@"secondview" bundle:nil]; [self.view addsubview:secondviewcontroller.view];

elemvezrl

egy pldnyt,

A msodik view eltvolitshoz hvjuk a msodik view removeFromsupervi ew metdust:


[self.view removeF romsuperview];

110

Vlts a nzetek kztt

A vlts animlsa
Az elz rszben az egyes elemek kztti vltst ismertk meg. Az tmenet nagyon gyorsan trtnik, s nem ltvnyos. Hogy megfeleljnk az iP hone-felhasznlk magas szint elvrsainak, animljuk az tmenetet. Szerencsre az SD K API-jainak a segitsg-

vel ez nagyon

egyszer .

kvetkez

gyakorlati rsz ezt m u ta~a be.

Animcik megjelenitse tmenetek kzben

1. Adjuk hozz az albbi flkvrrel szedett programkdot a VCExamp l evi ewcontroller.m-hez:


-(IB Acti on) displayview:(id) sender{ secondvi ewcontroller = [ [Secondview control le r al l oc] i ni t Wi thNibName: @" Secondvi ew" bundl e:n il] ; [UIView beginAnimations:@"flipping view" context:nil]; [UIView setAnimationouration:l]; [UIView setAnimationcurve:UIViewAnimationcurveEaseinOut]; [UIView setAnimationTransition: UIViewAnimationTransitioncurlDown forview:self.view cache:YES]; cont rolle r.view] ; [sel f.view addsubview:secondview [UIView commitAnimations];

2. Nyomj uk meg a Command-R gombot az alkalmazs tesztelshez. Figyeljk meg, mi trtnik, amikor rkattintunk a Display SecondView gombra (lsd a 4.30. brt).

3. Adjuk h ozz az albbi flkvrrel szedett sorokat a secondviewcont roller.m fjlhoz az Xcode-ban: -(I BActi on) btnReturn: (id) sender { [UIView beginAnimations:@"flipping view" context:nil]; [UIView setAnimationouration:l] ; [UIView setAnimationcurve:urviewAnimationcurveEasein]; [UIView setAnimationTransition: UIViewAnimationTransitioncurlup forview:self.view . superview cache:YES]; [sel f .view removeFromsupervi ew]; [UIView commitAnimations];

111

4. fejezet: Az elemek megismerse

4.

yomjuk meg a Command-R -t az alkalmazs tesztelshez. Ha megnyomjuk a Rerum gombot a msodik nzeten, az felugrik (lsd a 4.31. brt).

4.30. bra

4.31. bra
mkdik?

Hogyan

Alapveten

hozzadtunk nhny animcit az tmenethez, a urvi ew osztly klnfle

animcis metdusaival: [UIView beginAnimations:@"flipping view" context:nil]; [UIView setAnimationouration:l]; [UIView setAnimationCurve:urviewAnimationcurveEaseinOut]; UIViewAnimationTransitioncurloown [UIView setAnimationTransition: forview:self.view cache:YES]; [self.view addsubview:secondviewcontroller . view]; [UIView commitAnimations]; A klnbz utastsokkal a kvetkezket tettk: Az animci idtartamt egy msodpercre llitottuk

Az animcis grbe a UIViewAnimationcurveEaseinOut. Vlaszthatunk ms animcitpust is: a urvi ewAni ma ti oncurveEasern-t, a urvi ewAni ma ti o neu rveEaseout-ot vagy a urviewAnimationcurveLinear-t.

112

Vlts a nzetek kztt

Az animcitmenet tipusa urviewAnimationTransitioncurloown. Vlaszthatunk ms


animcitmenetripust is: a urvi ewAni ma ti onTransi ti on Fl i pFromLeft-et, a urvi ewAnimati onTran si ti on Fl i pF romR i ght-ot vagy a urvi ewAnimati onTran si ti oneurl Up-ot.

Adatok tadsa nzetek kztt


Idnknt

adatokat kell tadnunk egyik elembl a msikba. Ehhez a legegyszerbb, ha

ltrehozunk egy tulajdonsgot a clelemben, s a hvelemben adjuk meg az rtkr.

A kvetkez gyakorlati rsz ezt mutatja be.


Adatok tadsa egyik
elembl

a msikba

1. Kattintsunk ktszer a VCExamp l eviewcontroller.xib fjlra, s adjunk hozz egy DatePicker elemet a View ablakhoz (lsd a 4.32. brt). 2. Hozzunk ltre ennek a DatePicker elemnek egy kivezerst a VCExampleviewcontroller.h fjlban, s bocsssuk ki tulajdonsgknt: #import <UIKitiUIKit.h> @interface VCExampleviewcontroller UIViewController { 11---outlet for the DatePicker ll view--IBOutlet UIDatePicker *datePicker;
Display SecondVIew

Tuc

Oct 28

11---expose this outlet as a ll property--@property (nonatomic, retain) UIDatePi c ker *date Pi eke r; -(IBAction) displayview:(id) sender; @end 3. Control-kattintssal hzzuk r a File's Owner elemet a Date Pi eke r elemre a VCExampleviewcontroller.xib ablakban, majd jelljk ki a datePicker-t.
4.32. bra

113

4. fejezet: Az elemek megismerse

4. Hozzunk ltre egy UIDatePicker-tpus objektumot a secondviewcontroller . hban, majd bocsssuk ki tulajdonsgknt: #import <UIKit/U IKit.h> @interface Secondviewcontroller : UIViewcontroller { //---object of type UIDatePicker--UIDatePicker *selectedoatePicker;
}

//-- -expose the object as a property--@property (nonatomic, retain) UIDatePicker *selectedDatePicker; -(IBAction) btnReturn:(id) sender ; @end

5. Adjuk hozz az albbi flkvrrel szedett sorokat a vi ewoi dLoad metdushoz a


secondvi ewcont ro ll e r. m fjlban: #import "Secondvi ewcontro ll er. h" @implementation Secondviewcontroller synthesize selectedoatePicker; @ - (void ) viewoidLoad { //---display the date and time selected in the previcus view--NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; [formatter setDateFormat:@"MMM dd, yyyy HH:mm"]; urAlertview *alert
=

[[UIAlertview alloc] initWithTitle:@"oate and time selected" message:[formatter stringFromDate:selectedDatePicker.date] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

[al ert show]; [alert release]; [super viewoidLoad];


}

- (void)deal loc { //- -- release the memory used by the property--[selectedDatePicker release]; [super dealloc];

114

Vlts a nzetek kztt

6. Vgl adjuk h ozz a flkvrrel szedett sorokat a VCExampleviewcontroller.m


fj lhoz: #import "VCExampleviewcontroller.h" #import "secondvi ewcontro ll er . h" @implementation VCExampleviewcontroller @synthesize datePicker; Secondviewcontroller *secondviewcontroller; -(IBActi on) displayview:(id) sender{ secondviewcontroller = [[Secondviewcontroller alloc] i ni t wi th Ni bName:@" secondvi ew" bund l e : ni l] ; //---set the property of the second view with the DatePicker view in ll the current view--secondviewcontroller.selectedDatePicker = datePicker; [urview beginAnimations: @ "flipping view" context:nil]; [UIView setAnimationouration : l]; [urview setAnimationcurve:urviewAnimationcurveEasernout]; [urview setAnimationTransition: urviewAn i mationTransitioncurlDown forview :self .view cache : YES]; [self.view addsubview:secondviewcontrol l er.view]; [urview commitAnimations];

7. Nyomju k meg a Command-R gombot, hogy az alkalmazst az iP hone Simulatorban tesztelj k. Vlasszuk ki a dtumot s az id t a oatePi cker elemben, majd nyomjuk meg a D isplay SecondView gombot. Amikor a msodik elem lthatv vlik, megjelenik a vlasztott dtum s id (lsd a 4.33. brt) .

Hogyan mkdik?
Az adatok egyik elembl a msikba trt n tadsnak a legegyszerbb mdja az, ha kzzresznk egy tulajd on sgot a fogad elemben, s a hv elemben adjuk meg a tulajdonsg rtkt. A msodik elem a selectedoatePicker nev tulajdonsgot teszi kzz. @interface secondviewcontroller : urviewcontroller { //---object of type uroatePicker--uroatePicker *selectedoatePicker;

/ /---expose the object as a property--@p roperty (nonatomic, retai n) UIDatePicker *selectedoatePicker;

115

4. fejezet: Az elemek megismerse

Az rtk tovbbtshoz egyszeren csak be kell llitanunk az ltalunk definilt tulajdonsgot


//---set the property of the second view with the DatePicker view in ll the current view--secondviewcontroller.selectedDatePicker : datePicker;

4.33 . bra

SSZEFOGLALS
Ebben a fejezetben szmos view mkdst ismerhettk meg. Azt is lthattuk, hogyan lehet dinamiirusan ltrehozni nzeteket futs kzben. Megtudtuk tovbb, hogyan kssnk ssze egy nzetet egy elemvezrlvel, s hogyan vltsunk kt nzet kztt futsidben.

1. Mik az view-ks az elemvezrlk sszekapcsolsnak lpsei?

2. Mikor alkalmazzunk Alert View-t, s rnikor az Action tblt? 3. Hozzunk ltre egy UIButton-t kdolssal, s kssk ssze annak Touch Up rnside esemnyt egy esemnykezelveL

11 6

Vlts a nzetek kztt

A FEJEZET TUDNIVALI
Tma
A UIA l ertview hasznlata

Alapelvek
urAlertview *alert ~ [[UIAlertview alloc] initWithTitle:@"Hello" message :@"This is an alert view" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; Az elemvezrlnek meg kell valstania a UIA l ertvi ewoe l egate protokollt. UIActionsheet *action ~ [[UIActionSheet alloc] initWithTitle:@"Title of Action Sheet" de l e gate: self cancelButtonTitle :@"OK" destructiveButtonTitle: @"oelete Message" otherButtonTitles:@"Option 1", @"Option 2", nil]; Az elemvezrlnek meg kell valstania a UIActi onsheetDe l eg a te protokollt. [pagecontrol addTarget : self action:@selector(pageTurning:) forControlEvents:urcontrolEventvaluechanged]; [imageviewl setrmage: [urrmage imageNamed:@"iMac_old.jpeg"]]; [segmentedcontrol addTarget:self action:@selector(segmentchanged:) forcontrolEvents:urcontrolEventvalueChanged]; NSURL *url ~ [NSURL URLWithString:@"http://www .apple . com"]; NSURLRequest *req ~ [NSURLRequest requestwithURL:url]; [webview loadRequest:req]; [urview beginAnimations:@"flipping view" context:nil]; [urview setAnimationouration:l]; [UIView setAnimationcurve: urviewAnimationcurveEasernout]; [urview setAnimationTransition: urviewAnimationTransitioncurlDown forview:self.view cache:YES]; [self.view addsubview : secondviewcontroller . view]; [UIView commitAnimations]; Definiljunk egy tulajdonsgot a fogad elem ben, s az rtkt a hv elemben adjuk meg.

A UIA l e r tv i ew ltal kivltott esemnyek kezelse A UIActi onSheet hasznlata

A UIActi onsheet ltalkivltott esemnyek kezelse Az esemnyek sszektse a UI Pagecont ro l -lal A urrmagevi ew hasznlata Az esemnyek sszektse a ursegmentedcontro l -lal A urwebvi ew hasznlata

Az tmenetek animlsa

Adatok tadsa elemek kztt

117

Bevitel a

billentyzetrl

A FEJEZET FBB RSZEl A KVETKEZK:


Hogyan szabjuk testte a billentyzetet a Hogyan tntessk el az alfanumerikus Hogyan rejtsk el a numerikus Hogyan
szlelhet,

klnbz

beviteli

lehetsgekre?

billentyzetet

a gpels befejezse utn?

billentyzetet?

hogy a

billentyzet

lthat-e, vagy sem?


billentyzetnek?

Hogyan vltoztassuk a nzeteket, hogy helye legyen a

Az iPhone egyik levitatortabb terlete a tbbrintses billentyzet: ez az adatbetpllst teszi lehetv az iPhone-ba. A kritikk fleg a fizikai billentyzet hinyrl szlnak, rrg a lelkes iPhone-tmogatk esksznek r, hogy gy egyszerbb a hasznlat. Habr a legtbb telefonplatform rgta ksrletezik a virtulis billentyzettel, egyik sem olyan sikeres ennek a kivitelezsben, mint az iPhone. Az iPhone billentyzett az intelligencija teszi erss. Lekveti, amit gpelnk, javaslatokat tesz a gpelt szra, tovbb automatikusan jav~a a helyesrst, s beilleszti a kzpontozst. St mi tbb, a billentyzet tudja, hogy mikor kell megjelennie - feltnik, amikor megrin~k a TextField nzetet, s magtl eltnik, amikor a nem beviteli nzette koppintunk. Valamint azt is megengedi, hogy klnbz nyelveken tplljunk be adatokat. Az iPhone-alkalmazsok programozinak kulcsfontossg, hogyan integrljk a billentyzetet az alkalmazshoz. Hogyan rejtsk el a billentyzetet, ha mr nincs r szksg? s hogyan bizonyosodhatunk meg rla, hogy a felhasznl aktulis nzett nem blokkolja a billentyzet? Ebben a fejezetben vltozatos mdszereket ismerhetnk meg a billentyzet programozsra.

5. fejezet: Bevitel a

billentyzetrl

A billentyzet hasznlata
Az iPhone-programozsban a TextField nzet kapcsoldik rendszerint ssze a billenty zetteL Amikor a TextField nzetre koppintunk (vagy klikk.elnk, ha a Simulatort hasznljuk), a billentyzet automatikusan megjelenik. Ezutn a billentyzetrl bevitt adat a TextField nzetbeilleszkedik be.
A TextField hasznlata
A programkd [Keyboordlnputs.ifp} o Wrox.com oldalr/ tbithet le.

l. Hozzunk ltre egy j View-based Application projektet az Xcode segtsgvel, s nevezzk el Keyboardinputs-nek.
2. Kattintsunk ktszer a Keyboardinputsvi ewcont ro ll er. xi b fjira ahhoz, hogy az Interface Builderrel szerkesszk. 3. Tltsk fel az view ablakot a Label s a TextField nzetekkel (lsd az 5.1. brt). 4. Mentsk el a Keyboardinputsvi ewcontro ll er. xi b fjlt, s nyomjuk meg a Command-R gombot az Xcode-ban az alkalmazs futtatshoz az iPhone Simulatoron. Az 5.2. bra azt muta~a, hogy amikor az alkalmazs betltdik, a billentyzet kezdetben rejrve van (balra), de ahogy a felhasznl a TextField nzetre kattint, a billentyzet automatikusan megjelenik Gobbra) .
Alphanumenc Input

5.1. bra

120

A billentyzet hasznlata

5.2. bra

Hogyan rnkdik?

Az iPhone felhasznli fellet szpsge az, hogy arnikor a rendszer szleli, hogy az aktv nzet a TextField, a billentyzet magtl megjelenik; semmit sem kell tenni, hogy el hozzuk. A billentyzettel alfanumerikus adatokat tudunk betpllni, valamint szmokat s specilis karaktereket (pldul szimblumokat). Az iPhone billentyzete az angoltl eltr nyelvi karaktereket is tmogatja, pldul a knai t, a hbert stb. Sajnos a billentyzet eltntetse mr nem olyan egyszer, rnint az megjelenitse. Amikor befejeztk a gpelst, a billentyzet nem rnik el magtl, ugyanis nem tudja, hogy mikor fejezzk be tnylegesen a gpelst; gy nhny kdot kell rnunk ennek az orvoslsra (lsd albb).

121

5. fejezet: Bevitel a

billentyzetrl

A beviteli szabsa
Az

lehetsgek

szemlyre

elz rszben a TextField nzetbeli adatbevitelt lttuk Hogy jobban megrtsk az adatbevitel tulajdonsgait, menjnk az Interface Builderbe, vlasszuk a TextField nzetet, s hozzuk el az Attributes Inspector ablakot (fools )i;> Attributes Inspector [eszkzk )i;> attribtum-ellenr]). Az 5.3. brn az Attribates Inspector ablakot lthatjuk a TextField nzetben. Elssorban a Text Input Traits (szveges bevitel jellemzi) nev szakaszra figyelnk. A Text Input Traits szakasz nhny olyan elemet tartalmaz, amellyel bellithatjuk, hogy a billentyzet hogyan kezdje a begpelt szveget.

Cle.ar Button N~ver appears ==~---.:..:.J r"' Cle;or When Ed o tong B~ns font Font Size Text Input Helvetocl. 12.0 Adjust To Fit
T~lts

17

Cap . t.tli~e

A Capitalize elem nagybetsre vltoztatja a szavakat, a mondatokat vagy a billentyzettel bevitt sszes karaktert. A Correction elemmel bellithatjuk, hogy a billentyzetnk javaslatokat tegyen-e azokra a szavakra, amelyeket nem runk helyesen. Vlaszthatjuk mg a Default opcit, amely alaprtelmezett teszi a felhasznlnak a teljes szvegkorrekcis belltst.

COfrectoon Keymrd
AppeMance '-'

RNurn Key

,..,.?e;;.;...'a:.:u:.:lt....;._ _ _ _;:..0J

De ::::l=====~IT)~ =='a u t

lJ Auto e"ab'e Rnurn Key


G ~cure
Co
troC

Content

5.3. bra

A Keyboard elemnl a klnbz tpus lnbz tpus adatbevitelekhez.

billentyzetek

kzl vlaszthatunk a k-

Az 5.4. bra (balrl jobbra) a Keyboard elemhez konfigurlt billentyzettpusokat mutatja: Email Address (e-mail cm), Phone Pad (trcszgombok) s Number Pad (szmbillentyk).

122

A beviteli

lehetsge k

szemlyre szabsa

5.4. bra

Az Appearance elemmel kivlaszthatjuk, hogyan jelenjen meg a billentyzet.


billentyzetet muta~a.

Az. 5.5. bra a D efault (fell) s az Alert (alul)

Te_xt Inp- t u

Tr~its

Cap;tahze
Col"ftcltOn

__
- Oiflt .... 1

Ke~rd
A,p.pearat1ce

Def.ault

l;

fte:turn Key l

Default
Co

COO<Jie

Jol n

cr..
Con t.e.nr

xt

Routt
Search

5end
Yahoo Done
Etner~r.cy

Coli

5.5. bra

5.6. bra
klnbz

A Return Key elemmel Osd az 5.6. brt) llithatunk be a billentyzetkre.

pus

visszatr

gombot

Az 5.7. brn a Google billenty szolgl indtgombknt. Vgl az Auto-Enable Return (a visszatrs gomb automatikus engedlyezse) jellngyzetnl bellithatjuk, hogy ha nincs begpelt adat, akkor a Return billenty nem rhet el (kifakult). jra elrhetv vlik, amint legalbb egy karaktert begpelnk. A Secure (biztonsgos) jellngyzet segtsgvel a bevitt adatot rejtett tehe~k Osd az 5.8. brt) . Ezt ltalban jelszavaknl hasznljuk.

123

5. fejezet: Bevitel a

billentyzetrl

5.7. bra

5.8. bra

A billentyzet eltntetse
A billentyzet teht automatikusan megjelenik, amikor az iPhone-ban a TextField nzetet vlasztjuk. m a billentyzet eltntetse tbb erfesztst ignyel a programoztL Az albbiakban megismerjk, hogyan tvolitsuk el a billentyzetet, amikor befejeztk a gpels t. Az els mdszert a kvetkez gyakorlati rsz szemllteti.
A billentyzet eltvoltsa ( 1. mdszer)

1. Hasznljuk az elzleg ksztett projektnket, s kattintsunk ktszer a Keyboardrnputsvi ewcontro ll er. xi b fjira ahhoz, hogy az Interface Builderrel szerkesszk.
2. Vlasszuk ki a File's Owner elemet a Keyboardr npu tsviewcontroller . xi b ablakban, hozzuk el az Idencity Inspector ablakot, s hozzunk ltre egy j mveletet a doneEdi ti ng: nven (lsd az 5.9. brt). Ez ltrehoz egy IBActi on-t, amely lehetv teszi, hogy esemnyt csatlakoztassunk a TextField nzethez.

124

A beviteli

lehetsgek

szemlyre szabsa

o.

surdi r.iti

5.9. bra

3. Kattintsunk jobb egrgombbal a TextField nzetre a View ablakban, aztn kattintsunk a Di dEndon Ex i t esemny melletti krre, s hzzuk a File's Owner elernig Osd az 5.10. brt). A ltrehozott doneEdi ti ng: kivezets jelenik meg. Ezt jelljk ki.

5.10. bra

4. Menstk el a Keyboardrnputsviewcontroller.xib fjlt. 5. Visszatrve az Xcode-ba, adjuk hozz a controller.h fjlhoz:


kve tkez

kdot a Keyboardrnputsvi ew-

125

5. fejezet: Bevitel a billentyzetrl

#import <UIKit/UIKit.h> @interface Keyboardrnputsviewcontroller


}

UIViewcontroller {

-(IBAction) doneEditing:(id) sender; @end

6. A Keyboardrnputsvi ewcontro ll er. mfjlban hajtsuk vgre a doneEditing:


#import "KeyboardinputsViewcontroller.h" @implementation Keyboardrnputsviewcontroller -(IBAction) doneEditing:(id) sender{ [sender resignFirstResponder];

mveletet:

7. Mentsk el a projektet, s nyomjuk meg a Command-R gombot az alkalmazs fu tattshoz az iPhone Simulatoron. 8. Amikor az alkalmazs megjelenik az iPhone Simulatoron, kattintsunk a TextField nzetre. A billentyzemek meg kell jelennie. Hasznljuk a billentyzetet, gpeljnk be valarnilyen szveget, majd nyomjuk meg a Return gombot, amikor vgeztnk. A billentyzet eltnik.

Hogyan mkdik?
sszekapcsoltunk a TextField nzet oi dEndonExit esemnyt a ltrehozott doneEdi ti ng: mvelettel. Amikor a TextField nzet tartalmt szerkesztjk a billentyzettel, s megnyomjunk a Return gombot, ez beindtja a TextField oidEndonEdit esemnyt. Ez aktivizlja a doneEditing: mveletet, amelyik a kvetkez utastst tartalmazza:
[sender resignFirstResponder];
Alapveterr

a sender a TextField nzetre vonatkozik, s a res i gn Fi rstResponder utastja a TextField elemet, hogy lemondjon els reagl sttuszrL Ez lnyegben azt jelenti, hogy tbbet nem akarjuk hasznlni a TextField nzetet, s nincs szksgnk a billenty zetre, ezrt a billentyzet eltnik.

Megjegyzs A First Responder (els reagl) sttusz arra az aktulis nzetre vonatkozik, amelyiken a felhasznl dolgozik. Az itteni pldban, amikor a TextField nzetre kattintunk, az vlik aktulis nzett (els reaglv), s automatikusan aktivlja a billentyzetet .

126

A beviteli

leh etsgek

szemlyre szabsa

A billentyzet tlltsa szmbillentyzetre


Ez idig a dolgok elg egyszerek voltak. Tudjuk, hogyan tvoltha~uk el a billentyzetet egyszeren gy, hogy a TextField nzetet megfosztjuk az elsdleges sttusztL Ez a oi dEndon Ex i t esemny kezelst ignyli, amelyik akkor lp mkdsbe, amikor a felhasznl a Return gombra kattint. m a Return gomb csak akkor ltszik, amikor nem numerikus billentyzetet hasznlunk. Ha numerikus billentyzetet vlasztunk, a Return gomb mr nem rhet el. Ekkor problmnk lesz a oidEndOnExit esemny beindtsvaL Ezrt a kvetkez gyakorlati rsz egy msik mdszert mutat a billentyzet eltvoltsra a kivlasztott billentyzet pustl fggetlenl.
A billentyzet eltvoltsa (2. mdszer)

1. Hasznljuk ugyanazt a projektet, kartintsunk ktszer a Keyboardrnputsvi ewcont ro ll e r. xi b fjlra ahhoz, hogy az Interface Builderrel szerkesszk.

'-~in

Sl.t

Text Input Tr:ait.

PUiizc
Corr:t.Jan

Odauli ASCII C~pab' e Numbers & P\lr.CiuaiO<l


URL -1 NumIH!< PiMf - -. Phon Pad

Keyboard
Ap~ar.anct

2. Vlasszuk a TextField nzetet a View ablakban, s hozzuk el az Attributes Inspector ablakot (fools ~ Attributes Inspector). llitsuk a billentyzet pust Number Padra (lsd az 5. 11. brt).

5.11. bra

3. Vlasszuk ki a File's Owner elemet a KeyboardinputsViewcontroller.xib ablakban, s hozzuk el az Idencity Inspector ablakot (lsd az 5.12. brt) . Adjuk hozz a bgTouched: nev mveletet s a text Fi e l d kivezets t. 4. Fogjuk meg a File's Owner elemet, s hzzuk a TextField nzetre (lsd a 5.13. brt). A textField kivezetsnek meg kell jelennie. Ekkor jelljk ki. 5. Adjuk hozz a View ablakhoz a Round Rect Button elemet (lsd az 5.14. brt) . 6. A Round Rect Button elem kivlasztsa utn vlasszuk a Layout ~ Send to back (elrendezs ~ htraklds) utastst. gy ez az elem a tbbi vezrlelem mgtt jelenik meg. 7. Mretezzk jra a Round Rect Button elemet azrt, hogy az egsz tltse (lsd az 5.15. brt).
kpernyt

ki-

8. Az Attributes Inspector ablakban lltsuk a Round Rect Button pust Customra (lsd az 5.16. brt).

127

5. fejezet: Bevitel a

billentyzetrl

+ -

I.D<k
Notes

Show\'f 1 Se.ecton th

5.12. bra

Enter some text

File's Ownf:r

Fint R upondu

View

5.13. bra

128

A beviteli

lehetsgek

szemlyre szabsa

-.--.-."ome text

5.14. bra

5.15. bra

View

Enter some text


Drawing
De:WO,sc.l osu~

Info Ughl Info Dari(

AddConact
Font

_ Ho!v<colo!cLlS,!_

Top

0.00 ~ left
S~dow

0.00 Bottom
Right

..:.;

~00 1 .:.;

0 .00
X Offset

:;

0.00 .:.
Y Offset

H!ghhght R.tvt.rses Dlrecton

5.16. bra

129

5. fejezet : Bevitel a

billentyzet r l

9. Fogjuk meg a Round Rect Button elemet, s hzzuk a File's Owner elemhez a K eyboardinputsvi ew controll er . xi b ablakban (lsd az 5.17. brt). Vlasszuk ki a bgTouched : mveletet.

Enter some text

5.17. bra

Megjegyzs A Ro und Rect Button elem Tou ch up r nsi de esemnye sszekttetsben ll a bgTouched: mvelettel.

10. Mentsk el a XIB fjlt az Interface Builderben. 11. Mdostsuk a fjlt az Xcode-ban gy, hogy hozzadj uk az albbi, flkvrrel szedett utastst:

#i m rt <UI K t/UI Ki t.h > po i @i nterface K eyboard r nputsvi ewcontroller IBOutlet UITextField *textField;
}

UIViewcontroller {

@property (nonatomic , retain) UITextField *textField; -(IBAction) bgTouched:(id) sender; -(IBAction) don eEditing: (id) sende r; @ end

130

A beviteli lehetsgek szemlyre szabsa

12. A Keyboardinputsvi ewcontro ll er. m fjlhoz adjuk hozz az albbi, flkvrrel szedett utastst:
#import "Keyboardinputsviewcontroller.h" @implementation Keyboardinputsviewcontroller @synthesize textField; -(IBAction) bgTouched:(id) sender{ [textField resignFirstResponder];

-(IBAction) doneEditing:(id) sender{ [sender resignFirstResponder];

13. Nyomjuk meg a Command-R gombot az Xcode-ban, hogy teleptsk az alkalmazst az iPhone Simulatorra. Aztn prbljuk ki a kvetkezt: Kattintsunk a TextField nzetre, hogy elhozzuk a
billentyzetet.

Amikor vgeztnk, a Return gombra kattintva eltvoltha~uk a billentyzetet. Elmletileg a billentyzet eltvoltshoz brhova kattinthatunk a TextField elemen kvl.

Hogyan mkdik?
Ebben a pldban arra hasznltuk a Round Rect Button elemet, hogy betakarjuk vele az alkalmazsunk View ablaknak res terleteit. Lnyegben ez az elem hlknt funkcionl, amely a TextField nzeten kivli minden rintst csapdba ejt a View ablakban. gy amikor a felhasznl a billentyzeten s a TextField nzeten kivli terletre kattint (vagy koppint egy vals kszlken), a Ro und Rect Button beindtja a TouchUpinsi de esemnyt, amelyet a bgTouched: mvelet kezel. A bgTouched: mvelet sorn arra utastjuk a textFi eld elemet, hogy lemondjon elsdleges, First-Responder sttuszrl, amely a billentyzet eltnst okozza. Az elbbi pldban szemlltetett mdszer akkor is mkdik, ha tbbszrs TextField elemek vannak a kpemynkn. Feltehetleg hrom TextField elemnk/nzetnk lehet, nv szerint a text Fi e l d, a text Fi e l d2 s a text Fi e l d3. Ebben az esetben a bgTouched: m velet gy nz ki:
-(IBAction) bgTouched:(id) sender{ [textField resignFirstResponder]; [textField2 resignFirstResponder]; [textField3 resignFirstResponder];

131

5. fejezet: Bevitel a

billentyzetrl

gy amikor a bgTouched: mvelet akciba lp, mindhrom TextField elemet arra kri, hogy lemondjon elsdleges First-responder sttuszrL rtalmatlan, ha a res i gnFirstResponder mdszert alkalmazzuk egy olyan nzeten, amely jelenleg nem els reagl; gy az elz utasts biztonsgos, s nem okoz kivtelt a munkamenetben.

A REAGLS! LNC MEGRTSE Az elz gyakorlati rsz j plda a reaglsi lnc

mkdsre. Az iPhone-ban az esemnyek esemnykezelk sorn mennk t, ezt reaglsi lncnak nevezzk. Amint megrintjk a telefonunk kpernyjt, az iPhone esemnyeket generl, amelyek tovbbtdnak a reaglsi lncnak Minden objektum a reaglsi lncban ellenrzi, hogy kezelni tudja-e az esemnyt. A fenti pldban, ha a felhasznl a Label nzetet megrinti, az ellenrzi, hogy kezelni tudja-e az esemnyt. Mivel a Label esemny nem tudja kezelni az rintsesemnyt, az kiszll a reaglsi lncbL Kvetkeznek az a nagy httrelem vizsglja meg az esemnyt, amelyet ppen hozzadtunk Mivel ez kezelni tudja a Touch up rnside esemnyt, vgre is hajtja. sszegzsknt: a reaglsi lncban elrbb lv objektumok vizsgljk meg az esemnyt, s haj~k vgre, ha kpesek r. Brmelyik objektum lelltha~a az esemny terjedst a reaglsi lnc ban, vagy tovbbadhatja, ha csak rszben kpes kezelni.

A billentyzet automatikus megjelenitse az elem betltsekor


hogy azt szeretnnk, hogy rgtn a TextField legyen az aktv elem, s a bilanlkl jelenjen meg, hogy vrni kellene a felhasznl kzremkdsre. Ilyen esetekben a nzet becomeFi rstResponder fggvnyt hasznlhatjuk A kvetkez kd arra val, hogy a TextField elem legyen az els reagl, amint a View betltdik:
lentyzet Elfordul,

- (void)viewDidLoad { [textField becomeFirstResponder]; [super viewDidLoad];


}

132

Billentyzet

jelenltnek rzkelse

Billentyzet

jelenltnek rzkelse

A fentiekben szmos mdjt lttuk annak, hogyan rejtsk el a billentyzete, rniutn mr nem hasznljuk. m akad egy problma. Amikor a billentyzet megjelenik, a kperny jelents rszt elfoglalja. Ha a TextField elemnk a kperny aljn helyezkedik el, akkor a billentyzet knnyen eltakarha~a. A programoz felelssge, hogy megbizonyosadjon rla, hogy ez az elem a kperny lthat rszre kerl-e. Meglep, de erre az SDK nem figyel; a munka nehezt neknk kell elvgezni.

Megjegyzs Az iPhone jelenleg forgalomban lv billentyzete 216 pixelt 1 foglal el magassgban .

Mieltt

megismerkednk azzal, hogyan helyezhetnk mshova elemeket a kpernyn, amikor a billentyzet megjelenik, fontos, hogy megrtsnk nhny Irulesfogalmat a billentyzettel kapcsolatban: Szksg van arra, hogy programozottan kiderljn, a billentyzet lthat vagy rejtett. Ehhez az alkalmazsunkat regisztrlnunk kell a kvetkez kt bejelenrsre (notification): UIKeyboardwi ll ShowNot i fi ca ti on s UIKeyboardwi ll Hi de Noti fi ca ti on . Valarnint tisztban kell lennnk vele, hogy mikor s melyik TextField elem van hasznlatban, hogy thelyezhessk a kperny egy lthat rszre. Ezt a kt informcit kt deleglt protokollon keresztl tudha~uk meg: textFieldoidBeginEditi ng: s text Fi eldoi dEndEdi ting:, amelyek a UITextFi eldoelegate-ban rhetk el.
rthetbb

A kvetkez gyakorlati rszben mindez


Elemek thelyezse

vlik.

A programkd [ScrollingViews.ifp] a Wrox.com oldalrl tolthel le.

1. Hozzunk ltre egy j View-based Application projektet az Xcode segitsgvel, s nevezzk el scrollingviews-nek. 2. Tltsk fel az View ablakot a ScrollView elemmel (lsd az 5.18. brt). Mretezzk t a ScrollView elemet gy, hogy kitltse az egsz kpernyt.

egyedik genercis i Phone esetn a dupljt- a szerk.

133

5. fejezet: Bevitel a

billentyzetrl

OK

5.18. bra

5.19. bra

Aaoon

OUdct
scroiJVlew

UIScroiMew
UfTutf'eld

textfle.ld

+ -

Object ID Lodt
NotH

-l , Nothing (httt.rted)

Show With ~ lect<on

5.20. bra

134

Billentyzet

jelenltnek rzkelse

View

<

OK

5.21. bra
ro

VIew

OK

5.22. bra

3. Adjuk hozz a ScrollView ablakhoz a TextField elemet (lsd az 5.19. brt).

mez t

s a Round Rect Button

135

5. fejezet: Bevitel a

billentyzetrl

4.

Vlasszuk ki a File'sowner elemet a scrollingviewscontroller.xib ablakban, s hozzuk el az rdentityrnspector ablakot (lsd az 5.20. brt). Hozzunk ltre kt kivezetst: scrollview s textField.

5. Fogjuk meg a File's Owner elemet, s hzzuk a TextField nzetre (lsd a 5.21. brt). Vlasszuk ki a textField elemet.

6. Fogjuk meg a File's Owner elemet, s hzzuk a Scrol!View elemre (lsd az 5.22.
brt). Vlasszuk ki a scrollview elemet.

7. Fogjuk meg a TextField elemet, s hzzuk a File's Owner elemre (lsd az 5.23.
brt). Vlasszuk ki a delegate elemet.

ll

teszi, hogy a deleglt protokollokat (text Fi e l do idBegin Edi ti ng: s text Fi e l do i dEndEdi ti ng:) a ViewController kezelhesse.

Megjegyzs Ez a lps azrt fontos, mert

elrhetv

5.23. bra

8. Mentsk el a scrollvi ewsvi ewcontroll er. xi b fjlt az Interface Builderben. 9. Visszatrve az Xcode-ba, szrjuk be a sc ro ll i ngvi ewsvi ewcontro ll er. h fj lba:
kvetkez

flkvrrel szedett utastst a

136

Billentyzet

jelenltnek rzkelse

#import <UIKit/U IKit.h> @interface scrollingviewsviewcontroller urviewcontroller <UITextFieldoelegate> { IBOutlet UITextField *textField; IBOutlet UIScrollView *scrollview;

@property (nonatomic, retain) UITextField *textField; @property (nonatomic, retain) urscrollview *scrollview; @end

10. Szrjuk be a kvetkez flkvren szedett utastst a scrollingviewsviewcontro ll e r. m fjlba:


#import "scrollingviewsviewcontroller.h" @implementation scrollingviewsviewcontroller @synthesize textField; @synthesize scrollview; //---size of keyboard--CGRect keyboardBounds; //---size of application screen--CGRect applicationFrame; //---original size of scrollview--CGSize scrollvieworiginalsize; -(void) movescrollview:(urview *) theview { //---get the y-coordinate of the view--CGFloat viewcenterY = theview.center.y; //---calculate how much visible space is left--CGFloat freespaceHeight = applicationFrame.size.height keyboardBounds.size.height; //---calculate how much the scrollview must scroll--CGFloat scrollAmount = viewcenterY- freespaceHeight l 2.0; if (scrollAmount < 0) scrollAmount
=

O;

137

5. fejezet: Bevitel a

billentyzetrl

//---set the new scrollview contentsize--scrollview.contentsize = CGSizeMake( applicationFrame.size.width, applicationFrame.size.height + keyboardBounds.size.height); //- --scroll the scrollview--[scrollview setcontentoffset:CGPointMake(O, scrollAmount) animated:YES];
}

//---when a TextField view begins editing---(void) textFieldoidBeginEditing:(UITextField *)textFieldview { [self movescrollview:textFieldview];


}

//---when a TextField view is done editing- --(void) textFieldoidEndEditing:(UITextField *) textFieldview { [UIView beginAnimations:@"back to original size" context:nil]; scrollview . contentsize = scrollvieworiginalsize; [UIView commitAnimations];
}

//---when the keyboard appears---(void) keyboardwillshow:(NSNotification


{

*)

notification

/1---gets the size of the keyboard--NSDictionary *userrnfo = [notification userrnfo]; NSValue *keyboardvalue = [userrnfo objectForKey:UIKeyboardsoundsuserrnfoKey]; [keyboardvalue getvalue:&keyboardBounds];
}

//---when the keyboard disappears---(void) keyboardwillHide:(NSNotification


{ }

*)

notification

-(void) vieWWillAppear:(BOOL)animated
{

//---registers the notifications for keyboard--[[NSNotificationcenter defaultcenter] addobserver : self selector:@selector(keyboardwillshow:) name:UIKeyboardwillshowNotification object:self.view.window]; [[NSNotificationcenter defaultcenter] addobserver:self selector:@selector(keyboardwillHide:) name : UIKeyboardwillHideNotification object:nil];
}

138

Billentyzet

jelenltnek rzkelse

-(void) viewwilloisappear:(BOOL)animated { [[NSNotificationcenter defaultcenter] removeobserver:self name:UIKeyboardwillshowNotification object:nil]; [[NSNotificationcenter defaultcenter] removeobserver:self name:UIKeyboardWillHideNotification object:nil];

-(voi d) viewDidLoad { scrollvieworiginalsize = scrollview.contentsize; applicationFrame = [[UIScreen mainscreen] applicationFrame]; [super viewDidLoad];

-(BOOL) textFieldShouldReturn:(UITextField if (textFieldview == textField){ [textField resignFirstResponder];


}

*)

textFieldview {

return NO;

-(void) dealloc { [textField release]; [scrollview release]; [super dea ll oc] ;

11. Mentsk el a projektet az Xcode-ban, s nyomjuk meg a Command-R gombot az alkalmazs teleptshez az iPhone Simulatorra. Az 5.24. bra azt mutatja, hogy amikor a TextField elemre kattintuk, a billentyzet megjelenik, s a TextField elem (a tbbi elemmel egytt) a kperny kzepre grdl. A billentyzet elrejtshez nyomjuk meg a Return billentyt, s az elemek visszallnak az eredeti pozcijukba.

Hogyan mkdik?
Ez a plda azokat a klnfle mdszereket szemlltette, ahogyan a billentyzet jelenltt szlelhetjk, illetve ahogyan az aktulis elemet thelyezhetjk, hogy a billentyzet ne takarja el. Elszr is nzznk meg hrom egyni vltozt:
//--- size of keyboard--CGRect keyboardBounds;

139

5. fejezet: Bevitel a

billentyzetrl

//---size of application screen--CGRect applicationFrame; //---original size of Scrollview--CGSize scrollvieworiginalsize;

5.24. bra

A keyboardBounds a
billentyzet

billentyzet

mrett trolja

(fleg

billentyzet

magassgt). Habr a

magassgt ltalban szigoran 216-ra kdoljk, ez mgsem javasolhat,

mert a billentyzet mrete ksbb esetleg megvltozhat. Jobban tesszk, ha clinamikusan hatrozzuk meg a billentyzet mrett a program futsa sorn.

Az applicationFrame a

kperny

mrett trolja. A

kperny

mretnek meghatro-

zsakor minclig jobb, ha ez futs kzben trtnik. A scrollvieworiginalsize elmenti a ScrollView elem eredeti mrett. Ezltal visszallitha~uk

a ScrollView-t az eredeti mretre, miutn a felhasznl vgzett a szerkesztshogy az sszes elemet vissza kell helyeznnk az eredeti pozcijra).
betltdtt, elszr

sel

(elfo rdulhat,

Amikor a View hatrozzuk meg a

mentsk el a ScrollView elem mrett, valamint

kperny

nagysgt:

-(void) viewDidLoad { scrollvieworiginalsize = scrollview.contentsize; applicationFrame = [[UIScreen mainscreen] applicationFrame]; [super viewoidLoad];

140

Billentyzet

jelenltnek rzkelse

A vi ewwi llAppear: esemnyben (ez az eljrs aktivizldik,


kpernyn)

rnieltt

a View

feltnik

kt be jelentsre regisztrlhatunk UIKeyboardwi ll showNati fi ca ti on s UIKeyeltnik,

boardwi ll HideNotifi ca ti on. Amikor a billentyzet megjelenik (urKeyboardwi ll ShowNot ification), a keyboardwillshow: eljrs aktivizldott. Amikor a billentyzet keyboardwill Hi de: eljrs aktivizldott: -(void) viewwillAppear:(BOOL)animated { //---registers the notifications for keyboard--[[NSNotificationCenter defaultcenter] addobserver:self selector:@selector(keyboardwillshow:) name:UIKeyboardwillshowNotification object:self.view.window]; [[NSNotificationCenter defaultcenter] addobserver:self selector:@selector(keyboardwillHide:) name:urKeyboardwillHideNotification object:nil]; a

Mieltt

az elem

eltnik,

trljk a bejelents t, ha mr korbban bellitottuk

-(void) viewwilloisappear:(BOOL)animated { //---removes the notifications for keyboard--[[NSNotificationcenter defaultcenter] removeobserver:self name:UIKeyboardwillshowNotification object:nil]; [[NSNotificationCenter defaultCenter] removeobserver:self name:UIKeyboardwillHideNotification object:nil];

Arnikor a TextField elemre kattintunk, a keyboardwill show: eljrs hivdik meg. Ezzel az eljrssal megprbljuk megszerezni a billentyzet mrett azzal, hogy egy keyboardsounds referencit adunk t: //-- -when the keyboard appears---(void) keyboardwillshow:(NSNotification *) notification { //---gets the size of the keyboard--NSDictionary *userrnfo; [notification userrnfo]; NSValue *keyboardvalue; [userrnfo objectForKey:UIKeyboardBoundsuserinfoKey]; [keyboardvalue getvalue:&keyboardBounds];

141

5. fejezet: Bevitel a

billentyzetrl

Miutn a billentyzet megjelent, a text Fi e l doi dBegin Edi ti ng: eljrs hvdik meg. Ezzel a mdszerrelltha~uk azt, hogy melyik TextField elemet szerkesz~k, s ekkor mr elrnozdtha~uk a SercliView elemet, hogy a TextFiddet a fennmaradt lthat terlet kzepn helyezhessk el, s a billentyzet ne takarja ki. Ennek vgrehajtshoz a movescrollview: eljrst alkalmazzunk, amelyet a kvetkezkppen hatrozunk meg: //---when a TextField view begins editing---(void) textFieldoidBeginEditing:(UITextField *)textFieldview { [self movescrollview:textFieldview];
}

A movescrollview: metdusban kiszntjuk az elmozdtshoz szksges pixelek szmt,


majd a ScrollView elem segtsgvel elmozd~uk a hozz kapcsolt elemeket, amig a jelenleg aktv TextField elem a kperny lthat terletnek kzepre nem kerl. -(void) movescrollview:(UIView *) theview { //---get the y-coordinate of the view--CGFloat viewcenterY = theview.center.y; //---calculate how much visible space is left--CGFloat freespaceHeight = applicationFrame.size.height keyboardBounds.size.height; //---calculate how much the scrollview must scroll--CGFloat scrollAmount = viewcenterv - freespaceHeight l 2.0; if (scrollAmount
<

0)

scrollAmount

O;

//---set the new scrollview contentSize--scrollview . contentSize = CGSizeMake( applicationFrame.size.width, applicationFrame.size.height + keyboardBounds.size . height); //---scroll the scrollview--[scrollview setContentoffset:CGPointMake(O, scrollAmount) animated:YES];
}

Amikor a TextField elem lemond mretre:

els

reagl sttuszrl, a textFi el doi dEndEditing: el-

jrs hvdik meg. Ennl a pontnl visszalli~uk a ScrollView elemet az eredeti tartalom

//---when a TextField view is done editing---(void) textFieldoidEndEditing:(UITextField *) textFieldview { [UIView beginAnimations:@"back to original size" context:nil]; scrollview.contentsize = scrollvieworiginalsize; [UIView commitAnimations];

142

Billentyzet

jelenltnek rzkelse

Itt a urvi ew osztly begi nAni ma ti ons eljrst hasznljuk arra, hogy a ScrollView elem visszalljon az eredeti mretre. Ha nem ezt az eljrst hasznljuk, a ScrollView nagyon hirtelen ll vissza az eredeti mretre, egy villans t okozva. ppen rreltt eltnik a billentyzet, a keyboardwill Hi de: eljrs hvdik meg. Ebben az esetben mr nem kell sokat tennnk: //---whe n the keyboard disappears---(void)keyboardwillHide:(NSNotification { }

*)

notification

Vgl a dea ll oc eljrs sorn felszabadtjuk az sszes kivezets t, amelyet ltrehoz tunk. -(void) dealloc { [textField release]; [scrollview release]; [super dealloc];

A RETURN (VISSZATR) BILLENTY KEZELSE


Korbban lthattuk, hogyan kapcsolha~uk ssze a IBActi on-t a TextField elem oi dEndOn Ex i t esemnyvel, hogy a billentyzet eltnjn, arnikor a felhasznl a Return billentyt megnyomja. Elmletileg ezt a text Fi e l dshou l dRetur n: eljrssal is vgrehajtha~uk. Ez az eljrs akkor hvdik meg, amikor a felhasznl megnyomja a Return billentyt. -(BOOL) textFieldshouldReturn:(UITextField if (textFieldView == textField){ [textField resignFirstResponder];
} *)

textFieldview {

return NO;

SSZEFOGLALS
Ebben a fejezetben vltozatos mdszereket ismerhettnk meg a billentyzet kezelsre vonatkozan az iPhone-alkalmazsunkban. Alapveten a kvetkezkrl esett sz: Hogyan tntessk el a billentyzetet, arnikor befejeztk az adatbevitelt? Hogyan szleljk a billentyzet jelenltt vagy hinyt? Hogyan bizonyosodhatunk meg rla, hogy az elemeket nem blokkalja a billentyzet?

143

5. fejezet: Bevitel a

billentyzetrl

1. Hogyan rejtsk el a billentyzetet a unextFi e l d objektum kedvrt? 2. Hogyan szleljk, hogy a billentyzet lthat-e, vagy sem? 3. Hogyan tudhatjuk meg a billentyzet mrett?

A FEJEZET TUDNIVALI
Tma
A billentyzet eltntetse
Klnbz billentyzetfajtk

Alapelvek
Hasznljuk a res i g n Fi rstResponder eljts t a UITextFi e l d objekrumon, hogy lemondjon els reagl sttusztL Mdostsuk a billentyzet tpust a UITextFi e l d objektum Text Input Traits bellirsainak megvltoztatsval az Attributes Inspector ablakban. Hasznlhatjuk a b egi nAni ma ti ons trgyDi d End on Ex i t esemnyt, vagy vgrehajthatjuk a text Fi e l dShoul dRe tu r n: eljrst a nzetvezrlben (ne felejtsnk el megbizonyosodni rla, hogy a nzetvezrl osztlyunk a UITextFi e l d objektum delegltja). Regisztrljunk kt bejelentsre: UIKeyboardwi ll ShowNati fi ca ti on s UIKeyboardwillHideNotification. Hajtsuk vgre a text Fi e l doi dBegin Edi ti ng: eljrst a nzervezrlnkben.

megjelertse A Return
billenty

kezelse

Billentyzet
eltnsnek

megjelensnek s szlelse

szlelhetjk, melyik UITextFi e l d objektumot kezdi a fel hasznl szerkeszteni szlelhetjk, melyik UITextFi e l d objektum szerkesztst fejezte be a felhasznl.

Hajtsuk vgre a text Fi e l doi dEndEdi ti ng : eljts t a nzetvezrlnkben.

144

A kperny forgatsa
A FEJEZET FBB RSZEl A KVETKEZK:
a ngy
klnbz kpernytjols

tmogatsa, klnfle esemnyek,

az eszkz elforgatsakor

bekvetkez

az elemek nzetnek trendezse, amikor az eszkz tjolsa megvltozik, a


kperny

dinamikus elforgatsnak mdja futs kzben,


eltt.

az alkalmazs tjolsnak bellitsa a betlts

A 2. fejezetben bemutatott Hello World! alkalmazsnl lttuk, hogyan rhatjuk meg gy az iPhone-alkalmazst, hogy az mind az ll, mind a fekv mdot tmogassa. Ebben a fejezetben rszletesebben megismerjk a kpernytjolst. Elssorban azt vizsgljuk meg, hogyan kezeljk az alkalmazs tjolst, amikor az eszkzt elforgattuk, valamint hogyan rendezzk t az elemeket az eszkz elforgatsa utn gy, hogy az alkalmazsunk kihasznlhatja a kperny mretnek a vltozst.

Reagls az eszkz forgatsra


Az egyik szolgltats, amelyet a korszeru mobileszkzk tmogatnak, az eszkz aktulis tjolsnak - ll vagy fekv - felismersi kpessge. Az alkalmazsok ezzel a kpessggel jraigazthatjk az eszkz kpernyjt gy, hogy az j tjolst a lehet legjobban ki lehessen hasznlni. J plda erre aSafari az iPhone-on. Amikor fekv mdba forgatjuk az eszkzt, a Safari automatikusan elforgatja a nzetet, gy az oldal tartalmt szlesebb kpernyn tekinthe~k meg (lsd a 6.1. brt).

6. fejezet: A kperny forgat sa

6.1. bra

Az iPhone SDK szmos olyan esemnyt tartalmaz, amelyek kezelsvel biztosthatjuk, hogy az alkalmazsunk felismerje a tjols megvltozst. A kvetkez gyakorlati rszben ezt prblhatjuk ki.
Klnbz kpernytjolsok tmogatsa
oldalrltlthet k.

A programkd [ScreenRotations.:(jp) a Wrox.com

l . Hozzunk ltre egy j View-based alkalmazsprojektet az Xcode-ban, s nevezzk el screenRotari ons-nek.


2. Nyomjuk meg a Command-R gombot, hogy az alkalmazst az iPhone Simulatorban teszteljk 3. Mdostsuk az iPhone Simulator tjotst gy, hogy nyomjuk meg vagy a Command ~ (ezzel jobbra forgatjuk), vagy a Command ~ (ezzel balra forgatjuk) billentykombincit. Az alkalmazs kpemytjolsa nem vltozik meg az eszkz tjolsnak a mdostsval (lsd a 6.2. brt), az llapotsor fggleges.

6.2. bra

146

Reagls az eszkz forgatsra

Hogyan mkdik?
Az Xcode-dal ltrehozott iPhone-alkalmazsprojekt alaprtelmezs szerint csak az ll tjolsi mdot tmogatja. Ha az alaprtelmezett ll mdtl eltr kpernytjolst szeretnnk tmogatni, rjuk fell a shouldAutorotateTointerfaceorientati on: metdust egy elemvezrlben. Alaprtelmezs szerint ez az esemny megjegyzssel van elltva a screen Rotati onsvi ewcontro ll er. m fjlban:

l* ll override to allow orientations other than the default portrait orientation .


- (BOOL)shouldAutorotateTointerfaceorientation: (UIInterfaceorientation)interfaceorientation { ll Return YES for supported orientations return (interfaceorientation == UIInterfaceorientationPortrait);

*l
Megjegyzs Az iPhone opercis rendszere automatikusan kezeli a kperny forgatst. Amikor az opercis rendszer rzkeli a kpernytjols megvltozst, a shouldAutorotateTointerfaceorientation: esemnyt vltja ki. A fejleszt dnti el, hogy az alkalmazs hogyan jelenjen meg a cltjolsban.

Amikor egy elemet betltnk, s az eszkz tjolsa megvltozik, a shouldAutorotateToInterfaceori entati on: metdus hvsa trtnik meg. Ez az esemny egyetlen paramtert tovbbt: az eszkz j tjolsi mdjt. Az esemny visszatr rtke hatrozza meg, hogy tmogatjuk-e az aktulis tjolst. Ha az sszes kpernytjolst szeretnnk tmogatni, a visszaadott rtk a YES legyen: - (BOOL)s houldAutorotateTointerfaceOrientation: (UIInterfaceorientation) interfaceorientation { retu rn YES;

Ez azt jelenti, hogy az alkalmazsunk az sszes tjolsba elfordul (az llapotsor minclig fell lesz), ha elforgatjuk az eszkzt. Egy specifikus tjolsi md tmogatshoz hajtsunk vgre egyenlsgtesztet a tmogatott tjols megadshoz. A kvetkez kdrszlet azt mutatja be, arnikor csak a bal oldali fekv tjolst tmogatjuk

147

6. fejezet: A kperny forgatsa - (BOOL)shouldAutorotateTointerfaceorientation: (UIInterfaceorientation)interfaceorientation { return (interfaceorientation


==

urrnterfaceorientationLandscapeLeft);

Ez azt jelenti, hogy az alkalmazs csak fekv mdban jelenik meg (lsd a 6.3. brt), s a Home gomb a bal oldalra kerl (az lland neve ezrt unnterfaceori entati onLandscapeLeft).

6.3. bra

6.4. bra

148

Reagls az eszkz forgatsra Ha a felhasznl elforgatja az eszkzt ll vagy fekv mdba gy, hogy a Home gomb a jobb oldalon van (un nt:erfaceori ent:at:i onLandscapeRi gh t:), az alkalmazs nem vltoztatja meg a tjolst (lsd a 6.4. brt).

Megjegyzs A UIInt:erfaceori ent:at:i onLandscapeLeft:-et s a UIInt:erfaceori ent:at:i onLandscapeRi ght:-ot a kvetkezkppen klnbztethetjk meg egyszeren : a UIInt:erfaceorient:at:ionLandscapeLeft: a bal oldalon elhelyezked Home gombra utal, mg a UIInt:erfaceorient:at:ionLandscapeRight: a jobb oldalon elhelyezked Home gombra .

J
Klnbz kpernytjolsok
Eddig a kvetkez kpernytjolshoz kapcsold llandkat lthattuk: UIInt:erfaceOri ent:at:i onPort ra i t, UIInt:erfaceori entati onLandscapeLeft s UIInt:erfaceorientation LandscapeRight. A kpernytjols

megadsra sszesen ngy llandt hasznlhatunk: UIInt:erfaceorientationPortrait:- ll mdban jelenti meg a kpernyt UIInte rfaceorient:ationPort:rait:upsideoown - ll mdban jelenti meg a kpernyt, de a Home gomb a kperny fels rszn tallhat. UII nt:erfaceorientat:ionLandscapeLeft: - fekmdban jelenti meg a kpernyt, mikzben a Home gomb a bal oldalon van. UIInt:erfaceorient:at:ionLandscapeRight
fekv mdban jelenti meg a kpernyt, mikzben a Home gomb a jobb oldalon van.

6.5. bra

A UIInterfaceori ent:ati onPortrai tUpsi deoown md hasznlata ltalban nem ajnlatos, ugyanis knnyen megtvesztheti a felhasznlkat (lsd a 6.5. brt). Ha az alkalmazsunk tbbfle kpernytjolst is tmogat, rjuk fell a shoul dAutorotat:eTointerfaceori ent:at:i on: metdust, s a 11 logikai V AGY mveleti jel segitsgvel adjuk meg az sszes tmogatui kvnt tjolst:

149

6. fejezet: A kperny forgatsa

- (BOOL)shouldAutorotateTointerfaceorientation: (UIInterfaceorientation)interfaceorientation { return (interfaceorientation == UIInterfaceorientationPortrait l l interfaceorientation == UIInterfaceorientationLandscapeRight);


}

Az

elz

kdrszlettel az alkalmazsunk tmogatja a jobb oldali ll s

fekv

mdokat.

A forgats kezelse
Az iPhone SDK
elemvezrlje

szmos olyan esemnyt tartalmaz, amelyeket a

kperny

forgatsa alatt lehet kezelni. A forgats alatti esemnyek kezelsnek kpessge fontos, hiszen ennek rvn rendezhetjk t az elemeket, vagy llithatjuk meg a mdialejtszst, amg a kperny elfordul. Az albbi esemnyeket kezdhetjk: A willAnimateFirstHalfofRotationTointerfaceorientation: willAnimatesecondHalfOfRotationFrominterfaceorientation: willRotateTointerfaceorientation: willAnimateRotationTointerfaceorientation: rszletesebben is megvizsgljuk ezeket az esemnyeket.

kvetkezkben

wi liA ni mate fi rstHalfOfRotation T ol nterfaceOrientation:


A wi ll Ani mate FirstHal fOfRotati onTointerfaceori entati on: esemny kzvetlen l az elem elforgatsa eltt kvetkezik be. A metdus a kvetkez: - (void)willAnimateFirstHalfOfRotationTornterfaceorientation: (UIInterfaceorientation) tointerfaceOrientation duration: (NSTimernterval) duration {

A tornterfaceorientation paramter azt a tjolsi mdot jelzi, amelyre az elem vlt, a duration pararnter pedig a forgats els felnek idtartamt jelli msodpercekben. Az esemnybe beszrha~uk azt a prograrnkdot, amely azokat a feladatokat hajtja vgre, amelyeket a forgats eltt el szeretnnk vgezni, pldul a mdialejtszst vagy az animcik felfggesztst.

150

Reagls az eszkz forgatsra

wi IIAnimateSecondHalfOfRotation From lntertaceOrientation:

A willAnimatesecondHalfofRotationFromrnterfaceorientation:

esemny akkor kvetkezik be, arnikor a forgats mr flig megtrtnt (lsd a 6.6. brt). A metdus a kvetkez: - (void)willAnimatesecondHalfofRotationFromrnterfaceorientation: (UIInterfaceorientation) fromrnterfaceorientation duration: (NSTimeinterval) duration {

6.6. bra

A frominterfaceorientation pararnter az eredeti tjolsi mdot jelzi, rnig a duration


pararnter a forgats msodik felnek idtartamt jelli msodpercekben. Ebben az esemnyben jellemzen akkor hajtjuk vgre a feladatokat, arnikor a forgats mr flig megtrtnt, pldul az elemek trendezst vagy a mdialejtszs tovbbindtst.

wiiiRotateTolnterfaceOrientation:
Az elz kt esemny egyms utn kvetkezik be: elszr a willAnimateFirstHalfOfRotationTointerfaceorientation:, majd a willAnimatesecondHalfofRotationFrominterfaceOrientation. Ha nem szksges a forgatst kt kln esemnnyel kezelni, hasznljuk az egyszerbb wi ll RotateTointerfaceori en ta ti on: esemnyt. A wi ll RotateTointerfaceori entati on: esemny a tjols elkezdse eltt kvetkezik be. A kt elz esemnnyel ellenttben ez a folyamat egyetlen lpsbl ll. Ha ezt az esemnyt kezeljk, a willAni mate FirstHal fOfRotati onTointerfaceori entati on: s a wi ll Ani matesecondHa l fofRotati on FrominterfaceOri entati on: esemnyek nem kvetkeznek be.

151

6. fejezet: A kperny forgatsa

A metdus a

kvetkez:

- (void)willRotateTointerfaceorientation : (UIInterfaceorientation) tointerfaceorientation duration: (NSTimeinterval) duration {

A tointerfaceorientation paramter azt a tjolsi mdot jelzi, amelyre az elem vlt, a


duration paramter pedig a forgats
idtartamt

jelli msodpercekben.

willAnimateRotationTolnterfaceOrientation:
A wi ll RotateTointerfaceori entati on: esemnyen kvl mg egy esemnyt kezelhetnk a
forgats elkezdse vetkezik be.
eltt:

a wi llAnimateRotati onTointerfaceori entati on:

esemnyt.
eltt

A wi ll Ani mateRota ti onTointerfaceOri entati on: esemny a forgats animlsa

k-

MegjegyzsHamind a willRotateTointerfaceorientation:, mind a willAni mateRotati onTointerfaceori entati on: esemnyt kezeljk, a korbbi kvetkezik be elszr, azutn a ksbbi.

A metdus a

kvetkez:

- (voi d)wil lAnimateRotationTointerfaceorientati on: (UIInterfaceorientation) interfaceorientation duration: ( NSTimeinterval ) duration {

Az interfaceorientation paramter hatrozza meg azt a tjolsi mdot, amelybe a forgatst vgezzk.

Megjegyzs Ha kezeljk ezt az esemnyt, a willAnimateFirstHalfofRotationTointerfaceorientation: s a willAnimatesecondHalfofRotationFromInterfaceori entati on: esemnyek nem kvetkeznek be.

Az albbi gyakorlati rszben

megfigyelhet,

hogyan rendezzk t a felhasznli fellet

elemeit, amikor megvltozik az eszkz tjolsa.

152

Reagls az eszkz forgatsra

Elemek thelyezse az orientci megvltozsakor

1. Kattintsunk ktszer a korbban ltrehozott projekt screenRotationsviewcontroller.xib fjljra, s adjunk hozz egy Round Rect Button gombot az elemhez (lsd a 6.7. brt).

Obs~rve

this button earefully_.

Slzt & Pasitlan


F...".

- -20

:i
20
37

W
AI,IIOStr:l"i

-no

Ho
pt<Jct:ment

AUg__ nment

~.r'D-n

glll!IE<

~!El

6.7. bra

2. Figyeljk meg a mrett s az elhelyezkedst a Size Inspector ablak segtsgveL A helyzete (20, 20), a mrete pedig 280 X 37 kppont. 3. Forgassuk el az elemet az ablak jobb fels sarkban tallhat nyl ikonra kattintva (lsd a 6.8. brt). 4. Helyezzk t a Round Rect Button elemet a View ablak jobb als sarkba (lsd a 6.9. brt). Figyeljk meg az elhelyezkedst.

Vew

his button carefully ..

6.8. bra

5. Jelljk ki a File's Owner elemet a screenRotationsviewcontroller.xib ablakban, s hozzunk ltre egy btn nev (uiButton-tpus) kivezetst az Idencity Inspector ablakban (lsd a 6.1 O. brt).

153

6. fejezet: A kperny forgatsa


')O"
~Yi

View

'

...

su.
\ fr.ltnf:

Sin &~.-os1tlon

l"

:j
y H

180

'243
~

w 28i)
Aucosizlng

HD
Observe this button carefully .
Al~nmen1

CD

[L

a~

13

Plan!f'rM'ftl

6.9. bra

+ -

N01.mt

Flle's Owner

ObjKt ID
Loc.k
1

-l

N;h~ng Onherlted}
Show W1th SeJect.Otl

NotH

6.10. bra

6. Conttol-kattintssal kapcsoljuk ssze a Icivezetst a File's Owner elemmel, s hzzuk r a Round Rect Button elerru:e (lsd a 6. 11. brt). Jellj k ki a bt n kivezetst. 7. Mentsk el a projektet az Interface Builderben.

154

Reagls az eszkz forgatsra

6.11. bra

8. Visszatrve az Xcode-ba, szrjuk be a


onsviewcontroller.h fjlba: #import <UI K UIKit.h> it/ @interface screenRotationsviewcontroller IBOutlet UIButton *btn;

kvetkez

programkdot a screenRota ti-

UIViewcontroller {

@ property (nonatomic, retain) UIButton *btn; @end

9. Adjuk hozz a
fjlhoz:

kvetkez

programkdot a screenRota ti onsvi ewcontro ll er. m

@implementation screenRotationsviewcontroller @synthesi ze btn;

- (voi d) willAnimatesecondHalfofRotationFrominterfaceorientation: (UIInterfaceorientation) frominterfaceOrientation duration : (NSTimeinterval) duration { UIInterfaceorientation destorientation = self.interfaceorientation; if (destorientation == UIInterfaceorientationPortrait) { //---if rotating to portrait mode--btn.frame = CGRectMake(20,20,280,37);
}

155

6. fejezet: A kperny forgatsa

else
{

//---if rotating to landscape mode--btn.frame = CGRectMake(180,243,280,37);


} }

- (void)dealloc { [btn release]; [super dealloc];


}

10. Mentsk el a projektet, s nyomjuk meg a Command-R kombincit az Xcode-

ban, hogy az alkalmazst az iPhone Simulatorra teleptsk.

11. Amikor az iPhone Simulator ll mdban fut, a Round Rect Butto n elem a bal fels sarokban jelenik meg. Ha azonban mdos~uk a tjolst fekv mdra, tkerl a jobb als sarokba (lsd a 6.12. brt).

6.12. bra

Hogyan mkdik?
Ebben a projektben azt vizsgltuk meg, hogyan rendezhetjk t az alkalmazsunk elemeit, amikor az eszkz tjolsa megvltozik. Elszr ltrehozunk egy kivezetst, s sszekapcsoljuk a Round Rect Button elemmel a View ablakban. Az eszkz forgatsakor a wi ll Ani matesecondHa lfOfRotati on Frominterfaceori entati on: esemnyt kezeljk, mert gy megtudha~uk, hogyan vltozik az eszkz tjolsa. Ebben a metdusban az j tjoJsi mdot egyrszt a frominterfaceori en ta ti on paramterben kapha~uk meg, vagy az aktulis elem (self) interfaceori entati on tulajdonsgn keresztl: urrnterfaceorientation destorientation
=

self.interfaceorientation;
megfelelerr

Ennek az informcinak a birtokban az elemet az j tjolsnak el a frame tulajdonsg mdostsval:

rendezzk

156

A kperny programozott forgatsa

if (destorientatio n ;; UIInterfaceorientationPortrait)
{

btn.frame; CGRectMake(20,20,280,37); else


{

btn.frame; C GRectMake(180,243,280,37);

A NZETELEMEK THELYEZSNEK A TULAJDONSGAI


Az elz pldban a frame tulajdonsg segtsgvel mdositottuk egy elem pozcijt futs kzben. A frame tulajdonsg defulja azt a tglalapot, amelyet az elem elfoglal a tartalmaz nzethez kpest (ahhoz az elemhez, amely magban foglalja). A frame tulajdonsggal bellthatjuk az elemek pozcijt s mrett. A f rame tulajdonsg mellett hasznlhatjuk a center tulajdonsgot is, amely az elem kzppontjt adja meg, s ugyancsak tekintettel van a tartalmaz nzetre. Amikor valamilyen animcit hajtunk vgre, ltalban a cente r tulajdonsggal vltoztatjuk meg az elem pozcijt.

A kperny programozott forgatsa


Az elz rszben lttuk, hogyan kezeli az alkalmazs az eszkz tjolsnak a vltozst az elforgatskor. Elfordul azonban (pldul, amikor jtkprogramot fejlesztnk), hogy azt szeretnnk, ha az alkalmazs az eszkz tjolstl fggetlenl, megadott tjolsi mdban jelenne meg. Nzznk meg kt esetet: az alkalmazs futsa kzben forgatjuk el a
kpernyt,

vagy

egy adott tjolsi mdban jelentjk meg a kpernyt, amikor a nzetet betltttk

Forgats programfuts kzben


Futs kzben gy forgathatjuk el programozottan a kpernyt, hogy a setori entati on: metdust alkalmazzuk a uroevi ce osztly egy pldnyra. A korbban ltrehozott projektet hasznlva, ttelezzk fel, hogy azt szeretnnk, hogy a felhasznl mdostsa a kperny tjolst, amikor megnyomja a Round Rect Button elemet. Ezt a kvetkezkppen programozhatjuk le: -(IBAction) btncl i cked : (i d) sende r{ [ [uroevi ce currentoevice] setOrientation :urrnterfaceorientationLandscapeLeft];

157

6. fejezet: A kperny forgatsa

A setori entati on: metdus egyetlen paramtert fogad, amely az j tjolsi mdot adja meg.

Megjegyzs Miutn programozottan mdostottuk az alkalmazs tjolst, az tovbbra is vltoztathat marad az eszkz fizikai elforgatsval. A shouldAutorotateTointerfaceorientation: metdus belltstl fgg, hogy gy melyik tjolsokra vlthatunk.

A nzet adott tjols megjelenitse a betltskor


Betlts utn az elemek ll mdban jelennek meg alaprtelmezs szerint. Ha az alkalmazsunk azt ignyli, hogy a betlts utn az elem egy bizonyos tjolsi mdban jelenjen meg, az albbiak szerint llitsuk be az llapotsor tjolst:
- (void)viewoi dLoad { [UIApplication sharedApplication].statusBarorientation =UIInterfaceorientationLandscapeRight; [super viewoidLoad];

Az elz rszben bemutatott setorientation: metdus nem alkalmazhat az elemek tjolsnak mdostsra futs kzben:
//---does not work during view loading time--[[UIDevice currentoevice] setOrientation:UIInterfaceorientationLandscapeLeft];

Ugyangy az llapotsor tjolsnak mdostsa sem lehetsges futs kzben (miutn betltttk az elemet):
/1---does not work during run time--[UIApplication sharedApplication].statusBaror ientati on UIInterfaceorientationLandscapeLeft;

Megjegyzs Az j tjolsi mdot mindenkppen meg kell adnunk a shouldAutorotateTointerfaceori en ta ti on: esemnyben. Ezt az alkalmazs i nfo. pl i st fjljban is megadhatj uk, ha az Ini ti a l Interfaceori en ta ti on kulcs rtknek a kvnt tjolsi mdot adjuk.

158

A kperny programozott forgatsa

SSZEFOGLALS
A fentiekben megvizsgltuk, hogyan kezelik az elemvezrl osztly klnfle esemnyei a kperny tjolsnak vltozsait. A kpernytjolso k megfelel kezelse nveli az alkalmazsunk hasznlhatsgt, fokozza a felhasznli lmnyt.

1. Az t szeretnnk, hogy az alkalmazsunk csak a jobb s bal oldali


kat tmogassa. Hogyan kell mdostani a programkdot? 2. Mi a klnbsg egy nzet frame s center tulajdonsga kztt?

fekv

tjolsi mdo-

A FEJEZET TUDNIVALI
Tma
A forgats kezelse Ngy tmogatott tjolsi md

Alapelvek
A shouldAutorotateTointerfaceori entati on: metdus megvalstsa. UIInterfaceorientationPortrait UIInterfaceorientationLandscapeLeft UIInterfaceorientationLandscapeRight UIInterfaceorientationPortraitUpsideoown willAnimateFirstHalfofRotationTointerfaceorientation: willAnimatesecondHalfOfRotationFrominterfaceorientation: willRotateTointerfaceorientation: willAnimateRotationTointerfaceorientation: Az elemek pozicionlst s mrett mdosthatjuk a frame tulajdonsggal.

bekvetkez

Az eszkz elforgatsakor esemnyek

Az elemek pozcijnak mdostsra szolgl tulajdonsgok

Az elemek pozicionlst mdosthatjuk a center tulajdonsggaL

159

-:---~~~-::>:-,
'=:::~-:::--.

~:_:~~-

...._, , "-..::

e ) RSZ
i Phone-alkalmazsok
kszitse
7.
Elemvezrlk ......................................................

163

8. Eszkzsv- s navigcis alkalmazsok ............ 187 9. Segdprogramok ................................................ 215

Elemvezrlk
A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan ksztsnk ablakalap alkalmazst, majd adjunk hozz manulisan egy elemvezrlt s egy View ablakot? Hogyan hozzunk ltre dinamikusan elemeket futs kzben? Hogyan fzzk egyms utn az elemek esemnyeit az ramkd rvn? Hogyan vltsunk msik elemre futs kzben? Hogyan animljuk az elemvltsokat?
esemnykezelvel

a prog-

Eddig egyetlen elemet hasznl alkalmazsokkal foglalkoztunk, vagyis olyan alkalmazsokkal, amelyekben egy elemvezrl van. Az elz fejezetek mind az iPhone SDK-ban tallhat eleroalap alkalmazssablont hasznltk, hiszen ezzel a legegyszerbb elkezdeni az iPhone-programozst. Eleroalap alkalmazsok ltrehozsakor alaprtelmezs szerint egy elemvezrl van (az iPhone SDK rvn <project__name>viewcontroller nven). A valsgban azonban gyaktan van szksgnk egynl tbb elemvezrlre, amelyek kzl mindegyik egy msik elemet jelent meg eltr informcikkal. A tbbnzetes alkalmazsokta j plda az iPhone-ban gyrilag megtallhat Wearher (idjrs) alkalmazs. A f elem a kivlasztott rgi idjrst mutatja, m a kpernyt elhzsval tovbbi helyszillek idjrst is megnzhetjk. Az i ikonnal pedig ms elemre is vlthatunk, s tovbbi helyeket is megadhatunk. Ebben a fejezetben megvizsgljuk, hogy hogyan hozzunk ltre tbb nzetet az alkalmazsunkban, majd futs kzben hogyan vltsunk programozottan egyikrl a msikra. Megismerjk azt is, hogy az iPhone SDK-ban elrhet beptett animcis mdszerekkel hogyan animljuk az elemvltsokat.

7. fejezet : Elemvezrlk

Ablakalap alkalmazs ltrehozsa


Az albbiakban megismerkednk az iPhone SDK-val ltrehozhat alkalmazssablonok msik tipusval, az ablakalap alkalmazssablonnal. Az elemalap alkalmazssablonnal ellenttben az ablakalap alkalmazssablon alaprtelmezs szerint nem tartalmaz elemvezrlt, pusztn az iPhone-alkalmazs vzt foglalja magban, a tbbit pedig a fejlesztre bzza: a sajt elemeket s elemvezrlket magunknak kell hozzadnunk gy az ablakalap alkalmazs j lehetsget nyjt arra, hogy megrtsk az elemvezrlk mkdst, s rtkeljk azt a munkt, amely az elemvezrlk s az XIB fjlok sszekapcsolshoz szksges. Mindenekeltt egy ablakalap alkalmazs megrshoz hajtsuk vgre az albbi gyakorlati rsz utastsait, majd kvetkez lpsknt adjunk hozz egy elemvezrlt. Ehhez s a fejezet tovbbi gyakorlataihoz le kell tltennk a megjellt projektfjlokat.

11@1 Elemvezrl hozzadsa az Interface Builder hasznlatval


A p rogramkd [WinBasedApp.~J a Wrox .com
oldalrlletlthet

!!i WinB.ue.dAppAppOelegate.m - W1nBa.sedApp

( -~~~~~!:_-:_~~~l__f?!~~L -~MM<w

File frAme
Cor~r~ph.cs . fr-~mewortc

Foundatlon1r.tme.worlt
MU\Wlndow.xb

WinlasedApp .. lf'lfo.pOs:t

Errors and Warmngs

Findluults SCM
. . . . . . ctSymbob

_..(!J Bookmv1u
lmpkmtntatlon ftles
Y . NIBFiiH

~ .,.JnWlnd-.xob

-OQOU -

<No se:lecud svmbol>

Creoted by Wel..tteo"oQ Leo on ?128/09. Ccpyrt~t _Jl~N.llte- 2889. Ali r l~ rese.rved.

tliiPOTt " V l - l e q o t e . h '

ttl!ple.ntatton W l - letpte

- (votd)oppt icotlonDtcFintsti...ol.rd'lino:(lJIAQI:Il teotton *}q:lpllcotton { 11 OVernae. potnt tor custc.t:otton after OJ'IPL tcatton IOIIleh
[ ,. f'l(b;

.akeKeyAnd\ltsible] ;

7.1. bra

164

Ablakalap alkalmazs ltrehozsa

1. Az Xcode segtsgvel hozzunk ltre egy ablakalap alkalmazsprojektet, s nevezzk el wi nBasedApp-nek. Figyeljk meg az ehhez a projekttpushoz ltrehozott fjlokat (lsd a 7.1. brt). A tbbi, szoksos fjltl eltren itt csak egy XIB fjl (Mai nwi ndow. xi b) s kt deleglt fjl (wi nsasedAppAppDe l e gate. h s wi nBasedAppAppDe l eg a te. m tallhat. ) 2. Az alkalmazs tesztelshez a Command-R gombot megnyomva az iPhone Simulatoron egy res kperny jelenik meg, ugyanis az ablakalap alkalmazssablon egy egyszer iPhone-alkalmazshoz csupn egy vzszerkezettel rendelkezik, amely csak egy ablakot s az alkalmazs delegltjt tartalmazza. 3. Visszatrve az XCode-ba, ahhoz, hogy az Interface Builderrel szerkessznk, kattintsunk ktszer a Mainwindow xi b-ra. A Mainwindow. xi b ablakban ngy elem tallhat (lsd a 7.2. brt):

flle's OwMr

firn Rttpondtr

'Ntn

~.nd

Ap .

'Wu~ow

7.2. bra

a fjl tulajdonosa, az
els

reagl,

az ablakalap alkalmazs alkalmazsdelegltja, az ablak.

4. A view controller elemet a Library ablakbl hzzunk t a Mainwindow.xib ablakba (lsd a 7.3. brt). Ezt a view controller elemet hozzkapcsoljuk egy olyan elemhez, amelyet hozzadunk a projekthez.

165

7. fejezet: Elemvezrlk
Ma1nWondow.xib

file's Owne.r

First Responder

WIR bse:d Ap

WindOW

Table V1ht" ...

lm.tge Picke:r..

ObJtct

t.

View Controlfer

,,

Provde:s view management funct1ona.hty for

tootban, na'ltg.auon bars. and appllcaton 111ews. The UMewController c:la.ss .also suppons modoal vlevs and rOQllng views whe:n
dt:VIte one:nt.ulor'll changes .

7.3. bra

5. Kattintsunk jobb gombbal a Classes csoportra az Xcode-ban, s adjunk hozz egy j fjlt. Vlasszuk a urviewcontroller alosztlyelemet, s nevezzk t MyViewcontroller-re. Mivel az XIB fjlt a ksbbi lpsek sorn manulisan adjuk hozz, trljk a "With XIB for user interface" jellngyzetet. Az XCode ekkor a 7.4. brnak megfelelen nz ki. Az Interface Builderben korbban hozzadott view controll er elem szmra a kt fjl szolgl majd view controll er osztlyknt. 6. Kattintsunk jobb gombbal a Resources csoportra az Xcode-ban, s adjunk hozz egy j fjlt. Vlasszuk a View XIB elemet, s nevezzk t Myview.xib-re. Az XCode-nak a 7.5. bra szerint kell kinznie. 7. Az Iterface Builderben vlasszuk a view controller ablak Mainwindow.xib elemt, s nzzk meg az Idencity Inspector ablakt. A Class legrdl listban vlasszuk a MyViewcontroller-t Osd a 7.6. brt). Az elemvezrl neve My view controller-re vltozik.

166

Ablakalap alkalmazs ltrehozsa

0
OweMew

Clusts

':!] WinBosedAppAppO.I<gt

wMy\ttewc:onttoller .h Other Sources

~ WinhndAppAppDe.lt9i-t

{;j MyVt'NContro llt:r.m


Resourcu

farrvwnrks

7.4. bra
()

o-ww
Groups & FHu
Wm&.s~pp

Oa.sns
!C. WinlbsedAppAppOt!:leg.at ..: _W!nlb.sedAppAp.,Oeleg.at

~
~

MvVlewControlltr.h

MVVewController.m

Othe.r SOurcu
Resources
~ll1~ncfow.XIb

. WinhstdApp lnfo.phst

"1 MWie'wControllt.r.h

7.5. bra

File's Owntr

FtrSl Responder Win Bued Ap .

Window

UIT;ableVewControlter UMtwControtJer

7.6. bra

167

7. fejezet:

Elemvezrlk

8. Az Attributes Inspector ablakban nzzk meg a My view controller-t, majd az NIB Name (NIB-nv) legrdl listban vlasszuk a Myvi ew-t Osd a 7.7. brt) .

Tit le:

Nil NaiM

8
7.7. bra

MWltw
AutorestZe View To Fill Sau n

9. Az XCOde-ban kattintsunk ktszer a Myview.xib fjlra ahhoz, hogy az Interface Builderrel szerkesszk. A MyViewcontroller ablakban vlasszuk a File's Owner elemet, majd az Idencity Inspector ablakban az osztly neveknt vlasszuk a Myview .xib-et Osd a 7.8. brt) . Ez azt jelenti, hogy az XIB fjlt a Myviewcontroller osztly vezrli.

7.8. bra

10. A Control billenty nyomva tartsval kattintsunk, s hzzuk a File's Owner elemet a view elemre. Vlasszuk a view elemet.

168

Ablakalap alkalmazs ltrehozsa

Megjegyzs Ez a lps azrt fontos, mert jelzi, hogy a MyViewController kontrolllja a View ablakot. A lps kihagysa futsi hibt okoz.

11. A View ablakban kattintsunk ktszer a Myvi ew. xi b fjlra, majd adjunk hozz egy Button elemet a View ablakhoz (lsd a 7.9. brt). 12. Visszatrve az Xcode-ba, szrjuk be a kvetkez programkdbl a flkvr sorokat a wi nBasedApp AppDe l eg a te . h fjlba:
#import <UIKit/UIKit.h> @class MyViewcontroller;

g;,'"'l "

~1/oew

# U

i(
7.9. bra

OK

)l

@interface WinBasedAppAppDelegate : NSObject <U IApplicationoelegate> { urwindow *window; //---create an instance of the view controller--MyViewcontroller *myviewcontroller;

@property ( nonatomic, retain) IBOutlet UIWindow *window; //--- expose the view controller as a property--@ property (nonatomic, retain) IBOutlet MyViewcontroller *myviewcontroller; @end

A wi nBasedAppAppDe l eg a te. m fjlba szrjuk be a programkd ot:


#import "winBasedAppAppDelegate . h" #import "MyViewcontroller.h" @implementation winBasedAppAppDelegate @synthesize window; //---synthesize the property- -@synthesize myviewcontroller;

kvetkez

flkvrerr szedett

169

7. fejezet: Elemvezrlk

- (void)applicationDidFinishLaunching:(UIApplication *)application {

ll override point for customizatien after application launeh //---add the new view to the current window--[window addsubview:myviewcontroller.view];
[window makeKeyAndvisible];
}

- (void)dealloc { [myviewcontroller release]; [window release]; [super dealloc];

@end

13. A Mainwindow. xi b ablakban Control-kattintssal hzzuk r a wi n Based Ap p App


Delegate elemet a My view controll er-re (lsd a 7.10. brt) . Vlasszuk a myvi ewcontroll er elemet. Ezzel az ablakot hozzrendeltk az elemvezrlhz.
MalnWindow.xlb

7.10. bra

14. Nyomjuk meg a Command-R gombot ahhoz, hogy az alkalmazst az iPhone Simulatoron teszteljk Ekkor ltnunk kell az alkalmazs f kpernyjn megjel en gombot (lsd a 7. 11. brt).

Megjegyzs Gyakorlsknt ltrehozhatunk egy olyan mveletet, amely a gomb megnyomsakor egy figyelmeztet elemet jelent meg.

170

Ablakalap alkalmazs ltrehozsa

Hogyan mkdik?
Amikor ablakalap alkalmazssablonnal hozunk ltre egy iPhone-projektet, az Xcode mindssze a projekthez szksges minimlis szm elemet tartalmazza: a Mainwindow. xi b fjlt s az alkalmazsdelegltat. Nyilvnvalan hozzadjuk a sajt elemvezrlnket s elemnket. Az elz gyakorlati rszben elszr hozzadtuk a view controller elemet, majd a Mainwindow.xib ablakot. Ezutn hozzadtunk a urviewcontroller osztly egyik pldnyt (amelyet MyViewControllernek neveztnk), hogy hozzkapcsoldhasson az imnt hozzadott elemvezrlhz. A vezrlosz tly tartalmazza azt a programkdot, amelyet arra runk, hogy az elem s a felhasznl kztti interakcikat kezdje. Az Interface Builderben egy elemet kpvisel XIB fjlt is hozzadtunk a projekthez (Myview.xib). Figyeljk meg, milyen lpseket kell vgrehajtanunk a relevns osztlyok, valarnint a megfelel 7.11. bra XIB, illetve view cont ro ll e r elemek sszekapcsolshoz. Az alkalmazs futst kveten hozzadjuk a myviewcontroller objektum ltal kpviselt elemet az ablakhoz, s gy az az addsubview: pldny urwi ndow metdusnak hasznlatvallthatv vlik:
[window addsubview:myviewcontroller.view];

Elemvezrl

programozott hozzadsa

Az elemvezrl s az Interface Buildert hasznl elemek hozzadsa mellett gyakran alkalmazott technika az elemek futs kzbeni programozott ltrehozsa is. Ez nagymrtk rugalmassgot biztost, klnsen akkor, ha olyan jtkokat ksztnk, amelyeknl az alkalmazs felhasznli fellete folyamatosan vltozik. A kvetkez gyakorlati rszben megvizsgljuk, hogy hogyan hozhatunk ltre egy elemet a ur viewcont ro ll e r osztly egy pldnyval, majd hogyan adhatunk hozz programozottan elemeket.

171

7. fejezet:

Elemvezrlk

Elemvezrl

hozzadsa programozottan

1. Ugyanazt a projektet haszn lva kattintsunk a jobb gombbal az Xcode-ban a Classes csoporton, s ad junk hozz egy j fj lt. Vlasszuk a urview controller alosztlyelemet, s nevezzk t Mysecondvi ew cont roll e r-re. Az X Code a 7.12. brnak
megfelelen

nz ki.

Stmulator - 3.0 l De bug


Grnups & Fllu ." WinlutdApp Ousu r.~ Winll.lsedAppAppafle

file-

G_. MySuondVteWController.h

MySecondVteWControlltr.m

~ GJ

Winll.lsedAppAppDele
MyVJewCon~rolle.r. h

"" NyVtewControlltr.m

MtfSttonc:MewContro

(;} ~condViewContro

Oth.tr Sources

7.12. bra

2. A Wi nBasedAppAppDe l e gate . h fjlban adjuk meg a


programkdot: #impo rt "wi nBasedAp pAppDelegat e . h" #i mpo rt "Myvi ew contro ll er. h" #import "Mysecondvi ewcontro ll er . h" @m ementation WinBasedAppAppDelegate i pl @ synthesi ze window; @ synthesi ze myvi ew control le r ;

kvetkez

flkvren szedett

/ /-- -create an instance of the second view controller- -MySecondviewcontroller *mysecondviewcontroller; - (voi d) appl icationDidFinishLaunch i ng: (UIApplication *) appl i cati on { //---instantiate the second view controller--mysecondviewcontroller = [[MySecondviewcontroller alloc] initwithNibName : nil bundl e: ni l] ; //---add the view from the second view controller--[window addsubview:mysecondviewcontroller.view];

172

Ablakalap alkalmazs ltrehozsa //---comment this out so that it doesn't load the myviewcontroller--//[window addsubview:myviewcontroller.view]; [window makeKeyAndvisible];

- (void)dealloc { [mysecondviewcontroller release]; [myviewcontroller release]; [window release]; [super dealloc];

3. A MySecondviewcontroller.h fjlba szrjuk be a programkdo t:


#import <UIKit/UIKit.h>

kvetkez

flkvren szedett

interface MySecondviewcontroller : UIViewcontroller { @ //---create two outlets - label and button--UILabel *label; UIButton *button;

//--- expose the outlets as properties--@property (nonatomic, retain) UlLabel *label; @property (nonatomic, retain) UIButton *button; @end

4. Adjuk hozz a MySecondvi ewcontro ll er . mmetdust a vi ewoi dLoad() fjlhoz:


//-- -synthesize the properties --@synthesize label, button; - (void)viewoidLoad { //--- create a CGRect for the posltloning --CGRect frame; CGRectMake(lO, 10, 300, 50); //--- create a Label view- -label ; [[UILabel al l oc] initWithFrame:frame]; label .textAlignment ; UITextAlignmentcenter ; l abe l . font ; [UI Font fontwi th Name: @"'verdana'" si ze: 20] ; label.text; @'"This is a label'"; //--- create a Button view--frame ; CGRectMake(lO, 250, 300, 50); button; [UIButton buttonwithType:UIButtonTypeRoundedRect]; button.frame ; frame; [button setTitle:@'"OK'" forState:UIControlStateNormal]; button.backgroundcolor; [UIColor clearcolor];

173

7. fejezet:

Elemvezrlk

[self.view addsubview:label]; [self.view addsubview:button]; [super viewoidLoad];


}

5. Nyomjuk meg a Command-R gombot, hogy az alkalmazst az iPhone Simulatoron teszteljk Lthatv vlnak a cmke- s a gombelemek az alkalmazs f kpernyjn Osd a 7.13. brt).

Hogyan mkdik?
A2 elz gyakorlati rszben a projektnkhz hozzadtunk egy view cont ro ll er elemet, a urvi ewcontroller osztly egy pldnyt s egy XIB fjlt, ez a gyakorlat azonban egyszeren ltrehozza a urvi ewcontroller osztly egy pldnyt, s programozottan hozzadja az elemeket a f View ablakhoz. Miutn az alkalmazs befejezte a futst, az alkalmazsdelegltban ltrehozzuk a nemrgiben megvalstott urvi ewcontro ll er osztly egy pldnyt:

7.13. bra

//---instantiate the view controller--mySecondviewController ; [[MySecondViewcontroller alloc] initWithNibName:nil bundle:nil]; XIB fjira nincs szksgnk, hiszen a ksbb hasznland klnbz elemeket programozottan adjuk hozz. Ezrt az i ni twi th Ni bName: paramter ni l-re llthat. A urviewcontroller osztly ltal kpviselt View ablak betltshez a addsubview: pldny urwi ndow metdust hasznljuk: //---add the view from the view controller--[window addsubview:mysecondviewcontroller.view]; Futs alatt az elemek programozott ltrehozshoz fell kell rni a vi ewoi dLoad() osztly urviewcontroller metdust. Itt a cmke- s a gombelemek pldnyait manulisan hozzuk ltre, egyttal meghatrozva a pozcijukat s aszveges felrataikat. Vgl hozzadjuk ket a f View ablakhoz:

174

Ablakalap alkalmazs ltrehozsa - (void)viewoi dLoad { //---create a CGRect for the posltloning--CGRect frame= CGRectMake(lO, 10, 300, 50); //---create a Label view--label = [[UILabel alloc] initWithFrame:frame]; label .textAlignment = UITextAlignmentcenter; label .font= [UIFont fontWithName:@"Verdana" size:20]; label .text= @"This is a label"; //---create a Button view--frame= CGRectMake(lO, 250, 300, 50); button = [UIButton buttonwithType:UIButtonTypeRoundedRect]; button.frame = frame; [button setTitle:@"OK" forState:urcontrolStateNormal]; button.backgroundcolor = [urcolor clearcolor]; //---add the views to the current view--[self.view addsubview:label]; [self.view addsubview:button]; [super viewoidLoad];

Mveletek ltrehozsa s sszekapcsolsa


A fentiekben kiderlt, hogy elemek hozzadsa futs kzben programozottan is trtnhet. Lttuk, hogy hogyan adhatunk cmke- s gombelemeket a f elemhez/ nzethez. Ugyanakkor kezelnnk kell a gombelemekkel dinditott esemnyeket: ha a felhasznl a gombot megnyomja, valaminek trtnnie is kell. A 3. fejezetben megismertk a kivezetsek s a mveletek hasznlatr, s azt, hogy hogyan kapcsoljuk hozzjuk a programkdot az Interface Builderrel. A kvetkez gyakorlati rszben az elemeket a programkddal hozzuk ltre, gy nem hasznlha~uk az Interface Buildert a mveletek s a kivezetsek hozzkapcsolsra-ezt ugyancsak a programkd segtsgvel kell megtennnk
Mveletek

elemekhez kapcsolsa

1. Az

elz

mveletet

rszben ltrehozott projektet hasznlva, deklarljuk a buttoncl i cked: (lsd flkvrrel szedve) a MySecondviewcontroller.h fjlban az albbi-

ak szerint: #import <UIKit/UIKit.h> @interface MySecondviewcontroller : urviewcontroller { UlLabel *label; UIButton *button;

175

7. fejezet: Elemvezrlk
@property (nonatomic, retain) UlLabel *label; @property (nonatomic, retain) UIButton *button; //---declaring the IBAction---(IBAction) buttonclicked : (id) sender; @end

2. A MySecondvi ewcontro ll er. mfjlban hajtsuk vgre a buttoncl i c ked:

mveletet:

-(IBAction) buttonclicked: (id) sender{ urAlertview *alert = [[UIAlertView alloc] initWithTitle:@"Action invoked!" message:@"Button clicked!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [al ert show]; [al ert release];

3. A Touch

mveleten

bell ahhoz, hogy a gombelem relevns esemnyhez (up flkvrrel lthat:

rnside buttonclicked: ) kapcsoldjunk, adjuk meg az albbi programkdot,

amely a l oadvi ew()


- (void)viewoidLoad {

mveletben

CGRect frame= CGRectMake(lO, 10, 300, 50); //---create a Label view--label = [[UILabel al l oc] initWithFrame:frame]; label.textAlignment = UITextAlignmentcenter; label .font [UIFont fontWithName:@"Verdana" size:20]; label.text =@"This is a label"; //---create a Button view--frame= CGRectMake(lO, 50, 300, 50); button = [[UIButton buttonwithType:UIButtonTypeRoundedRect] initWithFrame:frame]; [button setTitle:@"OK" forstate:urcontrolstateNormal]; button.backgroundcolor = [urcolor clearcolor]; //---add the action handler and set current class as target--[button addTarget:self action:@selector(buttonclicked:) forcontrolEvents:UIControlEventTouchUpinside];

176

Ablakalap alkalmazs ltrehozsa //---add the views to the ll current view--[self.view addsubview:label]; [self.view addsubview:button]; [super viewoidLoad];

4. Nyomjuk meg a Command-R gombot ahhoz, hogy az alkalmazst az iPhone Simulatoron teszteljk Az OK gomb megnyomsa utn egy figyelmeztets jelenik meg (lsd a 7.14. brt).

Aciion mvoked!

Bunon chcked'

7.14. bra

VEZRLELEM-MVELETEK Az objektumok vezrlsre az albbi

mveleteket

hasznlhatjuk:

urcontrolEventTouchoown urcontrolEventTouchoownRepeat urcontrolEventTouchoragrnside urcontrolEventTouchoragoutside urcontrolEventTouchDragEnter urcontrolEventTouchoragExit urcontrolEventTouchuprnside urcontrolEventTouchupoutside urcontrolEventTouchcancel urcontrolEventvaluechanged urcontrolEventEditingoidBegin

177

7. fejezet:

Elemvezrlk

UIControlEventEditingchanged UIControlEventEditingoidEnd UIControlEventEditingoidEndonExit UIControlEventAllTouchEvents UIControlEventAllEditingEvents UIControlEventApplicationReserved UIControlEventSystemReserved UIControlEventAllEvents


mvele t

Valamennyi

rszletes lersa m egtallhat a http: 11 de ve l ope r. ap pl e . com/

iphone/library/ documentation/ UIKit/ Reference/ UIControl_Class / Reference/ Reference . html#// apple_ref/doc/ constant_group/ Control_Events cnen.

Vlts msik nzetre


E ddig az egyetlen nzettel dolgoz alkalmazsokrl volt sz. A valsgban azonban gyakran elford ul, hogy jval tbb nzetnk van, s mindegyik msmilyen informcit hordoz. Attl fggen, hogy a felhasznl rnit vlaszt ki, a kvetkez mvelet vgrehajtshoz lehet, hogy egy msik nzetre kell vltania. A kvetkezkben megnzzk, hogy hogyan vlthatunk a felhasznl ltal kivlasztott nzetre.
Nzetek kztti vlts

l. Az elz rszben ltrehozott projektet hasznlva, adjuk h ozz a kvrrel szedett utastsokat a Mysecondvi ewcontro ll er . m fjlhoz:
#import "MySecondviewcontroller.h" #import "MyViewcontroller.h" @ implementation Mysecondvi ewcontroller @ synthesize label , button; //- - - create an instance of the view controller- -Myviewcontroller *myviewcontrolle r ;

kvetkez,

fl-

178

Vlts msik nzetre

-(IBAction) buttonclicked: (id) sender{ //---add the view of the view controller to the current view--myviewcontroller = [[MyViewcontroller alloc] initWithNibName:@"MyView" bundle:nil]; [self.view addsubview:myviewcontroller . view]; //---comment out this section--/* urAlertview *alert = [[UIAlertview alloc] initWithTitle:@"Action invoked!" message:@"Button clicked!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; */

- (voi d) dealloc { [myViewcontroller release]; [l abe l re l eas e] ; [super dealloc];

2. A bt nel i c ked: fjlban deklarljuk a MyVi ewcontroll er. h mveletet:


#import <UIKit/UIKit . h> @interface MyViewcontroller : UIViewcontroller {

-(IBAction) btnclicked:(id) sender; @end

3. A MyViewcontroller .m fjlban definiljuk a btnclicked: mveletet az albbi flkvrrel szedett programkd szerint:
-(IBActi on) btncl icked: (i d) sender{ //--- remove the current view; essentially hiding the view--[self.view removeFromSuperview];

4. Ahhoz, hogy az Interface BuiJderben szerkessznk, kattintsunk dupln a Myvi ew. xi b fjlra . A Control billentyt nyomva tartva hzzuk a View ablakban lv OK gombot a Myvi ew. xi b ablakban a File's Owner elemre, majd vlasszuk a btncl i c ked: -t.

179

7. fejezet:

Elemvezrlk

5. Ismt az XCode-ban nyomjuk meg a Command-R gombokat az alkalmazs tesztelshez. Hamost az OK gombra kattimunk a f nzetben, a msodik nzethez jurunk Osd a 7.15. brt). A nzetelem bezrshoz kattintsunk az OK gombra.

7.15. bra

Hogyan mkdik? Ebben a gyakorlati rszben az addsubview: metdussal az pp tvltunk) egyszeren hozzadjuk az aktulis nzethez:
elemvezrl

nzett (amelyre

//---add the view of the view controller to the current view--myviewcontroller = [[MyViewcontroller alloc] initWithNibName:@"MyView" bundle:nil]; [self. view addsubview:myviewcontroller.view];

Egy nzet elhagyshoz hasznljuk a removeFroms uperview : metdust:


//---remove the current view; essentially hiding the view--[self.view removeFromsuperview];

180

A nzetvltsok animlsa

A nzetvltsok animlsa
Az
elz

rszben megismert nzetvltsok prhuzamosan trtnnek- a kt nzet azonnal,

brmilyen vizulis klnlegessg nlkl vl* egymst. Az iPhone egyik legfontosabb termktulajdonsga az animcis kpessge. Ezrt nzetvltsnl a kpernyt egy kicsit rdekesebb tehe~k nhny egyszer animci megjelertsvel, pldul ha az egyik nzetet odbb hzzuk a msik felfedshez. Ezt a kvetkezkppen valstha~uk meg.
Az tmenet animlsa

1. Ugyanazt a projektet hasznlva, adjuk hozz a kvetkez, flkvrrel szedett programkdot a MySecondvi ewcontroll er .m fjlhoz:
-(IBActi on) buttonclicked: (id) sender{ myviewcontroller
=

[[Myviewcontroller alloc] initWithNibName :@"Myview" bundle:nil];

[UIView [UIView [urview [UIView

beginAnimations:@"flipping view" context:nil]; setAnimationouration:l]; setAnimationcurve:UIViewAnimationcurveEaseinOut]; setAnimationTransition: urviewAnimationTransitionFlipFromLeft forview:self.view cache:YES];

[self.view addsubview:myviewcontroller.view]; [UIView commitAnimations];

2. A MyViewcontroller.m fjlban adjuk meg a


ramkdot: -(IBActi on) btnclicked:(id) sender{

kvetkez

flkvren szedett prog-

[urview beginAnimations:@"flipping view" context:nil]; [UIView setAnimationDuration:l]; [urview setAnimationcurve:urviewAnimationcurveEasern]; [UIView setAnimationTrans1t1on: UIViewAnimationTransitionFlipFromRight forview:self.view.superview cache:YES]; [self. view removeFromsuperview]; [UIView commitAnimations];

181

7. fejezet:

Elemvezrlk

3. Nyomjuk meg a Command-R gombokat az alkalmazs tesztelshez az iPhone

Simulatorban. Mindkt elemen kattintsunk az OK gombra, s figyeljk meg, milyen irnyban csszik el a kt nzet egymson (lsd a 7.16. brt).

7.16. bra

Hogyan mkdik?
Elszr

is vizsgljuk meg a MySecondviewcontroller-hez alkalmazott animcit. Az armci els lejtszsnl a begi nAni ma ti ons: osztly urvi ew metdusnak hvsval inditjuk az animcis blokkot: [UIView beginAnimations:@"flipping view" context:nil];

Az animci msodpercekben mrt hosszt a setAnimationouration: metdus hatrozza meg. Ezt a kvetkezkppen llithatjuk be egy msodpercre: [UIView setAnimationDuration:l]; Egy animcin bell az animcis tulajdonsg vt a setAni ma ti oncurve: metdus lltja be: [urview setAnimationcurve:UIViewAnimationcurveEaseinOut];

182

A nzetvltsok animlsa

Az animci vhez a

kvetkez

llandkat

hasznlha~uk: idtarta

urviewAnimationcurveEasernout- hatsra az animci lassan indul el, mnak kzepn felgyorsul, majd a vge fel ismt lelassul. urvi ewAni ma ti oneu rveEasern - hatsra az animci lassan indul el, majd ladva felgyorsul.

elreha

UIViewAnimationCurveEaseout- hatsra az animci gyorsan indul el, majd a vge fel lelassul. urviewAnimationcurveLinear- hatsra az animci egyenletes tempban jtsz-

dik le.
Az adott nzetre az animci lejtszsa sorn alkalmazand tmenet tpust a setAnimati onTran si ti on: metdus lli~a be: [urview setAnimationTransition: urviewAnimationTransitionFlipFromLeft forview:self.view cache:YES]; A ca ch e: paramter azt hatrozza meg, hogy az iPhone gyorsttrazza-e a nzet kpt, s hasznlja-e azt az tmenet sorn, vagy sem. A kp gyorsttrazsnak a hatsra gyorsabb lesz az animcis folyamat. Az animci tmenethez az albbi llandkat hasznlhatj uk: urvi ewAni ma ti onTran sitionNone -nincs tmenet. urvi ewAni ma ti onTran si ti on Fl i pF romLeft - a nzetet egy balrl jobbra forgatja.
fggleges

tengely krl

urvi ewAnimati onTransi ti on Fl i pFromRi ght- az nzetet egy rl jobbrl balra forga~a.

fggleges

tengely k-

urviewAnimationTransitioncurlup- az nzetet alulrl felhajtja. UIViewAnimationTransitioncurloown- az nzetet


fellrl

lehajtja.

Az animci lellitshoz, hvjuk a commitAnimations: metdust: [UIView commitAnimations]; A MyViewcontroller-en lejtszott animci hasonl a MySecondviewcontroller-en
lv

hz/lejtszotthoz, kivve azt, hogy az animland nzetet t kell lltani self.view.superview-ra: [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forview:self.view.superview cache:YES];

183

7. fejezet: Elemvezrlk

SSZEFOGLALS
Ebben a fejezetben elszr az ablakalap alkalmazsprojekteket ismertk meg. Az ablakalap alkalmazssablon j kiindulpont lehet ahhoz, hogy valban megrtsk egy iPhonealkalmazs felhasznli felletnek rszleteit. Azt is megvizsgltuk, hogyan vlthatunk kt nzet kztt, illetve hogyan hasznljunk animcikat az tmenet folyamathoz. A kvetkez fejezetben az iPhone SDK ltal tmogatott alkalmazssablon-tpusokat ismerhetjk meg: az eszkzsv-alkalmazsokat. Az eszkzsv-alkalmazs a tbbnzetes alkalmazsok egy jabb ltalunk ltrehozhat tpusa, ehhez minden httrmunka a rendelkezsnkre ll.

1. rjunk egy kdrszlete t, amellyel programozottan hozhatunk ltre egy elemvezrl t.

2. rjunk egy kdrszletet, amellyel futs kzben hozhatunk ltre egy nzetet. 3. rjunk egy kdrszletet, amellyel egy nzet esemnyeit egyms utn fzz k egy esem nykezelveL

A FEJEZET TUDNIVALI
Tma
Elemvezrl

Alapelvek

hozzadsa

Az UIViewController alosztly egy pldnynak hozzadsa a projektnkhz. label ; [[UILabel alloc] initWithFrame:frame]; label .textAlignment ; UITextAlig nmentce nter; label .font ; [UIFont fontwithName:@"Verdana" size: 20]; label . text; @ "This is a label"; frame ; CGRectMake (lO, 250, 300, 50); button ; [[UIButton buttonWithType:UIButtonTypeRoundedRect] initwithFrame:frame]; [button setTitle:@"OK" forstate:urcontrolStateNormal]; button.backgroundcolor ; [UIColor clearcolor]; button addTarget:self action: @ selector(buttonclicked : ) forcontrolEvents: urcontrolEventTouchUpinside]; myviewcontroller ; [[MyViewcontroller alloc] initWithNibName: @ "Myview" bund l e : ni l] ; [self.view addsubview:myviewcontroller.view];

Egy Labe l d em ltrehozsa programkddal

Egy Button dem ltrehozsa programkddal

Egy nzet esemnyeinek egyms utn fzse egy


esemnykezelvel

Vl ts msik nzetre

184

A nzetvltsok animlsa

Tma
Egy nzet tmenetnek
animlsa

Alapelvek urview beginAnimations: @ "flipping view" context:nil]; [UIView setAnimationouration:l]; [UIView setAnimationcurve: urviewAnimationcurveEasernout]; [UIView setAni mationTransition: urviewAnimationTransitionFlipFromLeft forview:self.view cache :YES]; [self.view addsubview:myviewcontroller.view] ; [UIView commitAnimations];

185

Eszkzsv- s navigcis alkalmazsok


A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan hozzunk ltre eszkzsv- (Tab Bar) alap alkahnazsokat? Hogyan jelentsk meg az eszkzsv-alkahnazsokat a klnbz tjolsoknl? Hogyan hozzunk ltre navigcialap alkahnazsokat? Hogyan jussunk el az egyik nzetablakbl a msikba egy navigcialap alkalmazsban?
,-.

Az

elz fejezetben volt sz arrl, hogyan hozhatunk ltre egy tbbnzetes alkahnazst tbb nzetvezrl hasznlatvaL A tbbnzetes alkahnazsok annyira gyakoriak, hogy az iPhone esetben egy kln alkalmazskategrit kpviselnek: az eszkzsvalkahnazsokat. Az eszkzsv-alkahnazsok rsze egy eszkzsv, amely ltalban a kperny aljn tallhat. Az eszkzsvon vannak az eszkzsvelemek, amelyeket ha megrintnk, megjelenik egy adott nzet. Az eszkzsvra j plda a Phone-alkalmazs az iPhone-ban (lsd a 8.1. brt).

1
4

2 5
8

3 6
9
#

*
+~
~

o
:"!'"~

lll... a ...
,.,_,

,,...,r,

8 .1. bra

8. fejezet : Eszkzsv- s navigcis alkalmazsok

A Phone-alkalmazs t eszkzsvelemet tartalmaz: Favorites (kedvencek), Recents (legutbbi), Contacts (nvjegyek), Keypad (trcsz) s Voicemail (hangposta). Ha pldul megrintjk a Favorites elemet, megjelenik a kedvenc nvjegyek szerkeszthet listja. A Contacts megrintsvel az iPhone-on trolt sszes nvjegy listja lthatv vlik. Az eszkzsv-alkalmazsok mellett egy msik, az iPhone-on gyakran megtallhat alkalmazstipus a navigcialap alkalmazs. A navigcialap alkalmazsokban egy olyan felhasznli fellet van, amely lehetv teszi, hogy a felhasznJk lefrjanak egy elemhierarchiban. A kperny tetejn tallhat egy navigcis sv, amely az ppen a vererotrba tett elemet mutatja. A 8.2. brn lthat egy navigcialap alkalmazs: a Settings (bellitsok).

8.2. bra

A Settings alkalmazsban gy frhatunk le egy alkalmazs bellitsaiba, hogy kivlasz~uk az adott elemet, s ezzel tovbblpnk egy msik kpernyre. Ha vissza akarunk trni az elz kpernyre, egyszeren megrin~k a kperny bal fels sarkban lv kis gombot. A kvetkezkben megismerkednk azzal, hogy hogyan ksztsk el ezt a kt alkalmazstipust az iPhone SD K ltal knlt sablonokkal.

188

Eszkzsv-alkalmazsok

Eszkzsv-alkalmazsok
Eddig az iPhone SDK-ban lv alkalmazssablonok kzl kettt ismertk meg: a nzetala p alkalmazsokat (View-based Application) s az ablakalap (Window-based) alkalmazsokat. A nzeralap alkalmazssablon a legmegfelelbb a kezdeti lpsekhez, az ablakalap alkalmazssablon pedig az iPhone-alkalmazsok vzt adja, gy lehetv teszi, hogy magunk hozzunk ltre mindent. Eszkzsv-alkalmazsok rshoz hasznlhatjuk az ablakalap alkalmazssablont vagy - ami knyelmesebb - az eszkzsvalkalmazs- (fab Bar Application) sablont, amely az SDKrsze. A kvetkez gyakorlati rszben az eszkzsvalkalmazs-sablont hasznljuk a projekt ltrehozshoz s az alapul szolgl architektra megvalstshoz. Tltsk le az itt feltntetett projektfjlokat.
Eszkzsv-alkalmazsok ksztse

A [fabBarApplication.ifp} kdfjl a ll7rox.com oldalt-6/lbithet le.

1. Hozzunk ltre egy j Tab Bar Application projektet az Xcode segtsgve!, s nevezzk el TabBarAppl i ca ti on-nek. 2. Vizsgljuk meg a projekt tartalmt Osd a 8.3. brt) . Az alkalmazsok szoksos deleglt fjljai mellett tartalmaz egy nzetvezrlt (Fi rstvi ewcontro ll er) s kt XIB fjlt is: Mainwindow. xi b s secondvi ew. xi b. 3. A TabBarApp l i ca ti onAppoe l egate. h fjl tartalma a
kvetkez:

#import <UIKit/UIKit.h> @ interface TabBarApplicationAppDelegate : NSObject <UIApplicationoelegate, UITabBarcontrolleroelegate> { UIWindow *window; UITabBarcontroller *tabBarcontroller;

@ property (nonatomic, retain) IBOutlet UIWindow *window; @ property (nonatomic, retain) IBOutlet UITabBarcontroller *tabBarcontroller; @ end A megszekott urvi ewcontro ll er osztly helyett most az UITabBarcontro ll er osztlyt hasznljuk, amely az urvi ewcontro ll e r osztlybl szrmazik. A TabBarcontra 1ler egy olyan specilis urviewcontroller osztly, amely nzetvezrlk gyjtemnyt tartalmazza.

189

8. fejezet: Eszkzsv- s navigcis alkalmazsok

, Device_:- 3.0
Groups & Files

l Debu_L

a-C or~ ra phlcs .fr.~m@Work

Class u
FlrstVtewController.h

" "'
111

FirstViewController.Pl RrstViewController.m
Foundation.framework

FlntVie:WController.m

T.l.b8arApphc:atonAppDele:gate.h
TabBarApphc:o~nonAppOelegatt . m

main.m

Other Soura:s

Resourcu
Fr.uneworits

~ McunWindow.xib SecondVI.ew.xib [i] T.l. b BarApphcahon ~ lnfo.pltst

It:

;., liibBarAp'L'

Products . . . Targets

,. ..,J Exuutablts
,;) Errars Mld WMnlng s
'l'

~ UIKa.frame:work
111

.u m.app TabBMAppltcation_Prefix.pch
n.bBarApphcationAppOeleg;~tr. . h

TabBiilrAppliuuonAppOelegate.m

Find RHu lts firstViewController_h l

L:!J Bookmarks
SCM Project Symbols . . . lmpJeme:ntuion Ftles

<No s.electec

~~ 1

FtrstYiewControL l er .t.

//

TobBw'Appl icat1on

1//

ll NIB Filts

~ SecondView.xib ~ MarnWlndowJub

ll Creoted by We\-Heng Lee on 7/16/ffi. ll Copyn~;t~t _/1y(OIIIPQI'rff'QIIe_ 2e99. Ali riftlt!: reserved.
l!

8.3. bra 4. Amikor az alkalmazs te, azaz egy olyan


betltdtt,

az unabs arcontroller pldny aktulis nzeamely


egyrtelmen

elforduls

is

betl tdik,

lthat a TabBa r-

Applica ti o nAppoe l egate. m fjlban: i mport "TabBarAppl i cati onAppoelegate . h" @m i plementation TabBarAppli cat i onAppDelegate @synt hesi ze wi ndow; @synthesize t abBarControlle r ; - (voi d) appl icationDidFinishLaunching: ( UIAppl i cati on *) application { ll Add the tab bar controller's current view as a subview of the window [window addsubview:tabsarcontroller.vi ew];

5. Kattintsunk ktszer a Mainwi ndow. xi b fj !ra ahhoz, hogy az Interface Builderrel szerkesszk. Figyeljk meg a nzet aljn, az eszkzsvnzeten bell lthat kt Tab BarItem nzetet.

Megjegyzs Ezek az eszkzsvelemek voltakppen egy nzetvezrlbl s


egy Tab Bar !tem objektumbl llnak.

6. Kattintsunk a First felirat els eszkzsvelemre Osd a 8.4. brt). Az Idencity Inspector ablakban lthatjuk, hogy ez egy olyan lementl osztlya a Fi r stvi ewcon t roll e r.
nzetvezrl,

amelynek az unp-

190

Eszkzsv-alkalmazsok
n

Clus

FirstViewConuoUer

First View
+ -

"""'t

......
Objt ID

lod

NothJng llnhented)

=+Il

Show With Sderuon

8.4. bra
,.._, Tab Bar Controller
."

IT) '

NIS Niime

,.--

SecondV~

Auloreuze Vtew To Fill Saeen

View

ll

LN.de

Sw!ru!~:>Y

--

ITI
S.Cond

8.5. bra

191

8. fejezet: Eszkzsv- s navigcis alkalmazsok

7. Kattintsunk a msodik eszkzsvelemre, s nzzk meg az Iden ti ty Inspector ablakot. Lthat, hogy az alap urviewcontroller osztlyra mutat. Ezutn nzzk meg az Attributes Inspector ablakot (lsd a 8.5. brt) . A View ablak ekkor egy msik NIB fjlbl - secondvi ew - tltdik be.

Megjegyzs Ha azt szeretnnk, hogy a felhasznlk hasznlhassk a msodik


nzet felhasznli fel lett, hozz kell adnunk egy
nzetvezrl

osztlyt, hogy

hozzkapcsoihassunk kivezetseket s mveleteket. (Lsd ksbb.)

8. Az Xcode-ban nyomjuk meg a CommandR gombo kat, hogy az alkalmazst az iPhone Simulatoron futtassuk (lsd a 8.6. brt) . A kt nzet kzti vltshoz rintsk meg az eszkzsvelemeket a kperny aljn.

Hogyan mkdik?
Az eszkzsv-alkalmazsok titka tulajdonkppen az UITabBarcontroller osztly hasznlatban rejlik. Ha dupln kattintunk a Mainwindow. xi b fjlra, ltha~uk, hogy rendelkezik egy eszkzsv-vezrl elemmel (Tab Bar Controller) (lsd a 8.7. brt). Az eszkzsv-vezrl nzetvezrlk gyjte mnyt tartalmazza. Ebben a pldban kt nzetvezrl tallhat benne. Az unabBarcontroller pldnyorr belli els nzetvezrl mindig lthat, amikor elhelyezzk az aktulis nzeten:

First View
Optianaily move this view nto a separate nib file and set the nib name in the First View Controller Attributes.

8.6. bra

- (void)applicationDidFinishLaunching:(UIApplication *)application {
ll Add thetabbar controller's current view as a subview of the window [window addsubview:tabBarcontroller.view];
}

Amikor a felhasznl megrinti az eszkzsv elemeit, a nzeteket.

megfelel nzetvezrl

betlti a

192

Eszkzsv-alkalmazsok

,. . - -"'
View Controllen

ntte

aus
View Controller View Controller

first 54!cond

--'-'Top & u

Tit le
NIB Name

8.7. bra

Megjegyzs A Mainwindow _xi b ablakot gy is meg lehet nzni, hogy a megjelentst tlltjuk listanzetre (a msodik gomb az ablak bal fels sarkban). gy gyorsan ttekinthetjk az eszkzswezrlben tallhat nzetvezrlk
gyjtemnyt .

Elemek elhelyezse az eszkzsvon


Az elzekben megnztk, hogyan fejlessznk eszkzsv-alkalmazst az SDK ltal felknlt sablonnal. Az alkalmazssablon alaprtelmezs szerint csak kt eszkzsvelemet tartalmaz, gy most megvizsgljuk azt, hogy hogyan adjunk hozz tovbbi elemeket egy meglv eszkzsvhoz.
Elemek elhelyezse az eszkzsvon

1. Ugyanazt a projektet hasznlva, az Interface Builderben hzzunk egy eszkzsvelemet (Tab Bar item) a Library ablakbl az eszkzsvnzetre (lsd a 8.8. brt). 2. Vlasszuk ki az jonnan hozzadott eszkzsvelemet, s nzzk meg a hozz tartoz Attributes Inspector ablakot. A Badge tulajdonsgot lltsuk 5-re, az Identifier tulajdonsgot pedig Search-re (keress) (lsd a 8.9. brt). Figyeljk meg, hogy milyen vltozs kvetkezett be az eszkzsvelem kinzetben.

193

8. fejezet: Eszkzsv- s navigcis alkalmazsok

8.8. bra

Megjegyzs Az eszkzsvelem kivlasztshoz kattintsunk a kzepbe; ha az


elemen kvlre kattintunk, akkor a nzetvezrlt vlasztjuk ki.

.~Tab

Bar Controller

... l

Image

l
f!!E:n;oblod

T>g

View

8.9. bra

194

Eszkzsv-alkalmazsok

Megjegyzs A Badge tulajdonsggal szmokat vagy szveget rhatunk az eszkzsvelemre, gy az vizulis emlkeztetknt figyelmeztetheti a felhasznlkat.

3. Az Xcode-ban kattintsunk jobb gombbal a Resources (erforrsok) mappra, s vlasszuk az Add >- New File (hozzads >- j fjl) menpontot. Kattintsunk a User Interfaces kategrira, majd vlasszuk a View XIB lehetsget. A fjl neve legyen searchview . xi b. 4. Kattintsunk jobb gombbal az Xcode Classes mappjra, s vlasszuk az Add >New File parancsot. Vlasszuk a Cocoa Touch Classes kategrit, majd az UIViewcontroller alosztlyt. A fjl neve legyen searchviewcontroller .m (ne jelljk be a "With Xib for user interface" lehetsget, mert mr ltrehoztuk a XIB fjlunkat az elz lpsben). 5. Kattintsunk ktszer az jonnan ltrehozott searchview. xi b fjlra, ezzel megnyitjuk az Interface Builderben. Adjunk hozz egy Search Bar nzetet (lsd a 8.10. brt) .
SearchView xib

;;;T[!J]

o,

s;..;

~id~

8.10. bra

6. Vlasszuk ki a File's Owner elemet a searchview.xib ablakban, s nzzk meg az Idencity Inspector ablakt. Az osztlya legyen searchviewcontroller. 7. A Control billenty nyomva tartsval hzzuk a File's Owner elemet a View-ra, majd vlasszuk a view lehetsget. 8. Control-kattintssal hzzuk a Search Bar nzetet a File's Owner elemre (lsd a 8.11. brt), s vlasszuk a del egate-et.

195

8. fejezet: Eszkzsv- s navigcis alkalmazsok

(l_

-~.

-------/[

8.11. bra

9. A Mainwindow. xi b fjlban vlasszuk ki az eszkzsvelemet, s nzzk meg az Iden ti ty Inspector ablakt (lsd a 8.12. brt). A IB-neve legyen: searchvi ew.

8.12. bra

196

Eszkzsv-alkalmazsok

10. A Search Tab Bar elem Idencity Inspector ablakban llitsuk be az osztly nevt a kvetkezre: Searchvi ewcontro ll er (lsd a 8.13. brt).

Megjegyzs E nlkl a lps nlkl


tseket s
mveleteket

futsidej hibt kapnnk, amikor kiveze-

hozunk ltre a View Controller osztlyban .

View
.oat,::Jrom' ~

+
sO~o~tltts
Outlot

Typo

Q
"

.....

No~mt.

8.13. bra

11. Mentsk el a fjlt az Interface Builderben. 12. Visszatrve az Xcode-ba, szrjuk be a dot a searchviewcontroller. h fjlba:
#import <UIKit/UIKit.h> @interface searchviewcontroller : UIViewcontroller <UISearchBaroelegate> {
kvetkez

flkvren szedett programk-

@end

13. Szrjuk be a ler.m fjlba:

kvetkez

flkvren szedett programkdot a searchvi ewcontro 1-

197

8. fejezet: Eszkzsv- s navigcis alkalmazsok #import "searchviewcontroller.h" @ implementation searchviewcontroller - (void)searchBarsearchButtonclicked:(ursearchBar *)searchBar
{

/ /---hide the keyboard-- [searchBar resignFirstResponder];


}

14. N yomjuk meg a Command-R gombokat ahhoz, hogy az alkalmazst az iPhone Simulatoron teszteljk Ekkor megrinthetjk az eszkzsv harmadik elemt (Search) is, hogy megjelenjen a keressv (lsd a 8.14. brt). A keressv megrintsvel automatikusan felbukkan a billentyz et is. A gpels befejeztvel a billentyzeten lv Search gombra kattintva rejthetjk el magt a billentyzetet.

First View
Optionalty move this view into a separate nib file and set the nib name n the First View Controller
Al1ributes

8.14. bra

Hogyan mkdik?
Ebben a pldban hozzadtunk egy T ab Bar Item nzetet a Tab Bar nzethez, majd szszekapcsoltuk egy XIB fjllal s a megfelel nzetvezrl osztllyal. j Tab Bar Item nzeteket egyszer hozzadni: hzzunk egy eszkzsvelemet a Library ablakbl a Tab Bar nzetre. De megtehetjk ezt a Tab Bar Controller elem Attributes Inspector ablakbl a Mainwindow. xi b hasznlatval is (lsd a 8.15. brt). A plusz (+) gombra kattintva adhatunk hozz j nzetvezrlket, a Tab Bar nzet pedig automatikusan beszr egy j Tab Bar !tem nzetet.

198

Eszkzsv-alkalmazsok
Mainl'<indow.xib
S.orch Flold

o
r
View Controlle.rs

Title
First Second Fllt 's Owner
F1nt Responde r

Cl;an
View Controll er View Controller

Tab 8i.r Apph ,

...

,Elemenu

...
Simul~ttd lnterf~ce

St~tus lu
Top hr

, G~y
None

i?)

ffi

Bottom lv

T;ab lv

ill

Ti tie
NIS N;amo

- s
~ Autorestze View To fi ll Scrttn

8.15. bra

Hogyan jelenitsk meg az eszkzsv-alkalmazsokat a klnbz tjolsoknl?


A 6. fejezetbe n foglalkoztunk azzal, hogy a shouldAutorotateTointerfaceorientation: metdus fellirsval az iPhone-alkalmazsok minden tovbbi nlkl tmogatjk a kperny elforgatst. Az sszes kpernytjols tmogatshoz csupn YES vlaszt kell adnunk erre a metdusra, a kvetkezkppen:
- (BOOL)shouldAutorotateTointerfaceorientation:(UIInterfaceorientation) i nterfaceorientation { return YES;

A nzet gy automatikusan elfordul, hogy igazodjon az j tjolshoz. Az eszkzsvalkalmazsoknl ez egy kicsit eltrerr mkdik. A klnbsg felmrshez mdostsuk a kvetkezkppen a Fi rstvi ewcontro ll er. m fjlt:
/1--- Firstviewcontroller.m--- (BOOL)shouldAutorotateTointerfaceorientation:(UIInterfaceorientation) interfaceorientation { return YES;

199

8. fejezet: Eszkzsv s navigcis alkalmazsok

Nyomjuk meg a Command-R gombokat az alkalmazs tesztelshez, s forgassuk el a kpernyt. Az alkalmazs tjolsa nem vltozik; mg mindig ll mdban van. A klnbz tjolsok tmogatsa rdekben az UITabBarcontroller objektumban tallhat szszes nzetvezrlnek tmogatilla kell ugyanazokat a tjolsokat Azaz, ha egy nzetvezrl tmogatja a balra fektetett mdot, akkor ezt az sszes tbbi nzetvezrlnek is tmogatnia kell. A kvetkez gyakorlati rszben ezrt gy mdostjuk az alkalmazst, hogy tmogassa az sszes tjolst.
Kpernytjolsok

tmogatsa

l. A korbban ltrehozott projektet hasznlva, az Identiry Inspector ablakban lthatjuk, hogy a msodik eszkzsvelem az urvi ewcont ro ll e r alaposztlyra van belltva.
2. Kattintsunk jobb gombbal az Xcode Classes csoportjra, s vlasszuk az Add } ew File lehetsget. Vlasszuk ki az urviewcontroller alosztlyfjlsablont, a fjl neve pedig legyen secondviewcontroller.m (ne jelljk be a "With Xib for user interface" lehetsget, mert mr ltrehoztuk a XIB fjlunkat az elz lps sorn: secondvi ew. xi b).
3. A msodik eszkzsvelem osztlynak nevt mdostsuk a kvetkezre: second-

vi ewcontro ll er.

4. Kattintsunk ktszer a secondvi ew. xi b fjira az Xcode-ban, hogy szerkeszteni tudjuk az Interface Builderben. Vlasszuk a ki a File's Owner elemet, s az Idencity Inspector ablakban vltoztassuk az osztlyt secondvi ewcontro ll er-re.
5. A Firstviewcontroller.m, a secondviewcontroller.m s a searchviewcontroller.m fjlok rnindegyiknl adjunk vissza YES rtket a shoul dAutorotateTointerfaceOri entati on : metdusnak:

- (BOOL)shouldAutorotateTointerfaceorientation:(UIInterfaceorientation) interfaceorientation { retu rn YES;


}

6. Nyomjuk meg a Command-R gombokat, s ekkor brmelyik irnyba el kell tudnunk forgatill az alkalmazsunkat (lsd a 8.16. brt) .

200

Eszkzsv-alkalmazsok

8.16. bra

Hogyan mkdik?

Az eredeti projektfjlok, amelyeket az eszkzsvalkalrnazs-sablonnal hoztunk ltre, csak egy nzetvezrlt tartalmaznak (Firstviewcontroller), amely az eszkzsv nzetvezrljben az els nzethez tartozik. A msodik nzetet a secondvi ew. xi b fjl alko~a, de ennek nincs megfelel View Controller osztlya. Annak biztostsra, hogy ez a nzet is tmogasson rninden tjolst, hozz kell adnunk egy j View Controller osztlyt a projekthez, hogy ez fell tudja brlni az urviewcont roller alaposztly ltal meghatrozott implementcit. Ezutn fellrjuk a shouldAutorotateTointerfaceorientation: metdust:, hogy rninden nzetvezrl YES rtket adjon vissza, s gy tmogassa az sszes tjolst.

Item
Item
Item
)

1 ttem

8.17_ bra

ELEMEK MAXIMLIS SZMA AZ ESZKZSVON


Az eszkzsvon maximum t elem helyezhet el. tnl tbb elem esetn megjelenik egy More (tovbbiak) felirat gomb, amelyet megrintve a Table nzetben megjelennek a maradk elemek (lsd a 8.17. brt) .

201

8. fejezet: Eszkzsv- s navigcis alkalmazsok

Navigcialap alkalmazsok
Az eszkzsv-alkalmazsok akkor jk, ha tbb olyan nzetnk is van, amelyek rnindElfordul

egyike msfajta informcit jelert meg, s amelyek kztt a felhasznl gyorsan vlthat. azonban, hogy hierarchiban lv adataink vannak, amelyeknl a felhasznlnak - a vlasztsa alapjn - egyik kpernyrl a msikra kelllpkednie. Ilyen helyzetekben rdemesebb navigcialap alkalmazst hasznlni. A kvetkez gyakorlati rszben egy ilye t hozunk ltre. Navigcialap alkalmazs fej lesztse
A [NavApplication.'(jpj kdf;l a Wrox.com oldalrl tiJlthet le.

L Az Xcode segtsgvel hozzunk ltre egy navigcialap alkalmazs- (Navigationbased Application)-projektet, s nevezzk el a kvetkezkppen: NavApp l i ca ti on. 2. Figyeljk meg a sablon ltalltrehozott fjlokat (lsd a 8.18. brt). Ahogy ltalban, most is megvannak az alkalmazs deleglt fjljai, valamint egy Rootvi ewcontro ll er nev nzetvezrl. Kt XIB fjl ltezik: Rootvi ewcontro ll er. xi b s Mainwindow. xi b.
i!! NavAppllcauonAppOelegate..m - NavApplic.atJon

Stmulator - 3.0 l Oebug

.__

Croups & File.s


NavAppltcat10n

O..Sses

~ RootVteWControlle.r.h RootVlewController.m

NavAppiKatiOnAppDelego~te.. h No~>JApphcationAppDelegate.n

Other Sources

l
SCM

Resources Roocv-~ontroiM:r.xtb
~nWindow. xtb

N.JvAppiK.Jtion - lnfo.phst

.,.

NavAppliuuonAppOe.legate.m l

Frameworts
Products

,.. Targets

..J Exuut~les

Erron.

~d

Wammgs

Flnd Results

8\JI:)Ie~~entot ton NcvA,ppl tcotton,l,ppl)etegate


llsynthestze wtf"''doo..;
Qsynthestz~

ncvtgaltonController;

l:!J BookmMks

Project Symbols .lmplementat1on FiJes NIBFilu

tpr~ IKirttprOQIIIO 110r1< Appltcotton ttrecycle

- (votd)appL tcottonOidfinistt..OlrlChing : (U IAppL tcotuln *)appl icotton {


r/ Ovtornde pc.nt for eu!tOIItlOtion
after~~

to.n...

[ tncb. oddSI.bv1ev: [rcvtgot, Jf'lControl ter v iew ]]; [ tl'l(j()o", llllk.eKeyAnc:Ni s1 ble];

8.18. bra

202

Navigcialap alkalmazsok

3. Nzzk meg a NavApl i ca ti onAppDe l eg a te. h fjl tartalm t:


@interface NavApplicationAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; UINavigationcontroller *navigationcontroller;

@ property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UINavigationcontroller *navigationcontroller; @e nd

4. tlagos nzetvezrl helyett UINavi gat i oneont ro ll e r osztlyt hasznl. Az UINavigat i oneont ro ll er osztly egy olyan specilis nzetvezr l, amely a hierarchikus tartalmak navigcijt kezeli.

5. Vizsgljuk meg a Nav Ap l i ca ti onAppDe l eg a te. m fjl tartalm t, klns tekintettel


az ap pl i ca ti onDi d Fi ni shLaunchi ng: metdusra: #import "NavApplicationAppDelegate.h" #import "RootViewcontroller.h" @impl ementation NavApplicationAppDelegate @synthesize window; @synthesize navigationcontroller; #pragma mark #pragma mark Application lifecycle

- (void)applicationDidFinishLaunching:(UIApplication *)application {

ll Override point for customizatien after app launeh


[window addsubview:[navigationcontroller view]]; [window makeKeyAndvisible];

6. Hozzadjuk

navigcivezrl

nzett a jelenlegi nzethez, hogy lthat legyen az

alkalmazs betltdsekor.

7. Kattintsunk ktszer a Mainwindow. xi b fjira ahhoz, hogy az Interface Builderrel


szerkesszk. A 8.19. brn lthat, h ogy a Mainwindow. x i b ablak (listanzetb en megjelenitve) tartalmaz egy Navigacion Controller elemet. Ez az elem tartalmaz egy Navigacion Bar elemet, valarnint egy olyan nzetet, amely a Rootvi ewcontro 1ler osztlybl tltdik be.

203

8. fejezet: Eszkzsv- s navigcis alkalmazsok

MainWmdow.xb

Name

Type

F1le's Owne:r Rrst Responder N~v ApphciUOn App


Window
~ltgate

UlApphnuon UUlesponder NavAppiK:ataonAppDelegau


UIWandow

V1ew
RootVIf'w(ont roller'

8.19. bra

8. Kattintsunk ktszer a Rootviewcontroller. xi b fjlra, hogy megnyissuk az Interface Builderben. Lthat, hogy a navigcialap alkalmazssablon alaprtelmezs szerint Table nzetet hasznl gykr-nzetvezrlknt (lsd a 8.20. brt).

Cupertino Glendale Los Angeles Palo Alto San Diego San Franclsco Santa Clara

8.20. bra

204

Navigcialap alkalmazsok

ll

Megjegyzs A navigciala p alkalmazsoknak nem kell felttlenl Table nzetet hasznlniuk. Mivel azonban a Table nzet annyira npszer s olyan gyakran hasznljk navigcialap alkalmazsokban, az Apple alaprtelmezettknt tette be ebbe a sablonba. A Table nzetrl rszletes lers a 10. fejezetben (Kivezetsek, mveletek s elemvezrlk) tallhat.

9. Nyomjuk meg a Command-R gombokat


az alkalmazs tesztelshez. Magban az alkalmazsban nem ltunk sok mindent, mindssze sorokat Osd a 8.21. brt). A kvetkezkben megvizsgljuk, hogyan tlthe~k fel a Table nzetet.

10. A Rootviewcontroller .m fjlhoz adjuk hozz az albbi, flkvrrel szedett utastst, hogy deklarljunk s inicializljunk egy filmcmeket tartalmaz tmbt: #import "Rootviewcontroller.h " @implementation Rootviewcontroller NSMutableArray *listOfMovies ; - (void)viewDidLoad { //---initialize the array--listOfMovies = [[NSMutableArray alloc] init];

8.21. bra

//---add items--[listofMovies addobject:@"Training oay"] ; [listOfMovies addobject:@"Remember the Titans "]; [listOfMovies addobject:@"John Q."]; [listofMovies addobject:@"The Bone collector"]; [listOfMovies addobject:@"Ricochet"]; [listOfMovies addobject:@"The siege"]; [listofMovies addobject:@"Malcom X"]; [listOfMovies addobject:@"Antwone Fisher"] ; [listofMovies addobject:@"courage under Fire"]; [listofMovies addobject :@ "He Got Game"]; [listOfMovies addobject:@"The Pelican Brief"]; [listofMovies addobject:@"Glory"]; [listOfMovies addobject:@"The Preacher's Wife"];

205

8. fejezet: Eszkzsv- s navigcis alkalmazsok //---set the title of the navigation bar--self.navigationrtem.title = @"Movies"; [super viewDidLoad];

- (void)dealloc { [listOfMovies release]; [super dea ll oc] ;

11. Szrjuk be a sorok szmt:

kvetkez

flkvren szedett utastsokat a tableview:numberofmegjelentend

Rowsrnsecti on: metdusba, hogy megadjuk a Table nzetnek a

//---specify the number of rows in the table view--- (NSinteger)tableview:(UITableview *)tableview numberofRowsinSection:(NSinteger)section { //---set it to the number of items in the array--return [listOfMovies count];
}

12. Szrjuk be a

kvetkez

flkvren szedett utastsokat a tableview:cellForRow-

AtindexPath: metdusba, hogy meghatrozzuk az egyes cellk megjelenst:

ll customize the appearance of table view cells. - (UITableviewcell *)tableview:(UITableview *)tableview cellForRowAtindexPath:(NSindexPath *)indexPath {
static NSString *Cellidentifier =@"Cell"; UITableviewcell *cell = [tableview dequeueReusablecellwithidentifier:cellidentifier]; if (cell == nil) { cell = [[[UITableviewcell alloc] initWithstyle:UITableviewcellStyleoefault reuserdentifier:cellidentifier] autorelease];

NSString *cellvalue cell.textLabel.text return cell;


}

[listOfMovies objectAtindex: indexPath.row]; cellvalue;

206

Navigcialap alkalmazsok

13. Mentsk el a projektet, s a Command-R gombok megnyomsval teszteljk le az alkalmazst az iPhone Simulatoron. Figyeljk meg a Table nzetben megjelentett filmlistt Qsd a 8.22. brt).
Tralnlng Day

Hogyan mkdik?
Eddig mg nem igazn lttuk hasznt az UINavigationcontrol l er objektumnak. Alapveten annyit csinltunk, hogy felksztettk a Table nzetet arra, hogy betltse a filmek listjt, majd megjelentse a nzetben. A kvetkezkben gy mdos~uk a projektet, hogy amikor megrintnk egy elemet a Table nzetben, az alkalmazs tnavigljon egy msik nzetre, ahol megjelenik az adott film cme.

Remember the Titans John Q. The Bone Colleetor Ricoehet The Siege Malcolm X Antwone Fisher Courage Under Fire

8.22. bra

Navigls msik elemre


A navigcialap alkalmazsok elnye az, hogy el tudunk jutn az egyik nzetbl a msikba. Az albbiakban megvizsgljuk, hogyan mdostha~uk gy az alkalmazsunkat, hogy amikor a felhasznl megrint egy filmet, akkor az alkalmazs tvltson egy msik nzetre. A kivlasztott filmcm megjelenitse egy msik nzetben 1. Ugyanazt a projektet hasznlva, az Xcode-ban kattintsunk a jobb gombbal a Classes csoportra, s vlasszuk a File )> Add Files (fjl )> fjl hozzadsa) menpontot. Vlasszuk az urviewcontroller alosztlyelemet, majd kattintsunk a Next gombra. A fjl neve legyen: oe ta i l svi ewcontro ll er. m (ne jelljk be a "Wi th Xib for user interface" lehetsget, mert a kvetkez lpsben manulisan adjuk hozz). 2. Kattintsunk jobb gombbal a Resources mappra, s vlasszuk az Add )> New File menpontot. Vlasszuk a View XIB elemet, s kattintsunk a Next gombra. A XIB fjlt nevezzk el a kvetkezkppen: oetai l svi ew. xi b. 3. Kattintsunk ktszer a oetail svi ew. xi b fjira ahhoz, hogy az Interface Builderrel szerkesszk. Adjuk hozz a View ablakhoz a Label nzetet Qsd a 8.23. brt).

207

8. fejezet: Eszkzsv- s navigcis alkalmazsok

Oetatl.sV1ew,xib

Label
File's Ov.-ner F1rn Rtsponder

I!IZJ

8.23. bra

4. Adjuk hozz az albbi flkvrrel szedett sorokat a oetailsviewcontroller.h


fjlhoz az Xcode-ban: #import <UIKit/UIKit.h> @interface Detailsviewcontroller IBOutlet Ullabel *label; NSString *textselected; UIViewcontroller {

@property (nonatomic, retain) Ullabel *label; @property (nonatomic, retain) NSString *textselected; -(id) initWithTextselected:(NSString *) text; @end

5. Az Interface Buliderben a Detai l svi ew. xi b ablakban


Class tulajdonsgt llitsuk a
kvetkezre:

lv

File's Owner elem

De ta i l svi ewcont ro ll e r.

6. A Control billenty nyomva tartsval hzzuk a File's Owner elemet a Label nzetre, majd vlasszuk a l abe l. lehetsget. Ezzel sszektjk a Label nzetet a l abe l kivezets se!.

208

Navigcialap alkalmazsok 7. A Control billenty n yomva tartsval hzzuk a File's Owner elemet a View nzetre, majd vlasszuk a view lehetsget. Ezzel sszekapcsoljuk a nzetet a nzetvezrlvel:

8. Adjuk hozz az albbi flkvrrel szedett kdot a oe ta i l sviewcontroll er .m fj !hoz:


#import "Detailsvi ewcontroller.h " @implementation Detailsviewcontroller @synthesize label; @synthesize textselected; -(id) initWithTextselected:(NSString *) text { self.textselected = text; [label setText:[self textselected]]; return self;

- (voi d)viewoidLoad { [label setText:[self textselected]]; self.title = @"Movie Details"; [super viewoidLoad];

- (void)dealloc { [label release]; [textselected release]; [super dealloc];

9. Adjuk hozz az albbi flkvrrel szedett kdot a Rootviewcontroller.h fjlhoz:


#impo rt "DetailsviewController.h" @ interface RootViewcontroller : UITableviewcontroller { oetailsviewcontroller *detailsviewcontroller;

@property (nonatomic, retain) Detailsviewcontroller *detailsviewcontroller; @end 10. Adjuk hozz az albbi flkvrrel szedett kdot a Rootviewcontroller. m fjlhoz: #import "RootViewcontroller.h" @implementation Rootviewcontroller NSMutableArray *listOfMovies; @synthesize detailsviewcontroller;

209

8. fejezet: Eszkzsv s navigcis alkalmazsok

11. Mdostsuk a t ablevi ew: di dse l ectRow AtrndexPath: metdust a flkvrrel szedett programkd alapjn:

ll override to support row selection in the tabl e vi ew . - (void)tableview :(UITableview *)tablevi ew didselectRow AtindexPath: (NSindexPat h *) indexPath {
NSUinteger row = [indexPath row]; NSStri ng *rowvalue = [listOfMovies objectAtindex :row]; NSStri ng *message = [[NSStri ng alloc] initwithFormat: @ "You have selected \ "%@\ "", rowvalue] ; //---create an instance of the oetailsviewcontroller--if (self.detailsviewcontroller == nil) oetailsviewcontroller *d [[Detailsviewcontroller alloc] initWithNibName:@"DetailsView" bundle:[NSBundle mainBundle]]; self.detailsviewcontroller = d; [d release];
=

//---set the movies selected in the method of the ll oetailsviewcontroller---// [self.detailsviewcontroller initwithTextselected:message]; //---Navigate to the details view--[self . navigationcontroller pushviewcontroller : self.detailsviewcontroller animated:YES];

12. Nyom juk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljk. Nzzk m eg, mi trtnik, ha m egrintnk egy elem et (lsd a 8.24. brt).

Hogyan

mkdik?

Az elz pldban hozzadtunk egy j XIB fj lt s egy megfelel View Contro ller osztlyt a projekthez. Ezt az j View ablakot hasznljuk arra, hogy megjelentsk a Table nzetet tartalmaz nzetben megrintett ftlm cmt. Ahhoz, hogy ez az ablak t tudja adni a kivlasztott film cmt a rszleteket tartalmaz View ablaknak, ltre kell hoznunk ezen egy tulajdonsgot, mghozz a textselected-et:

@ property (nonatomic , retain) NSString *textSelected; Egyttal ltre kell hoznunk egy i ni twi thTextse l e ct ed: nev metdust is, hogy a kezdemnyez nzet bellthassa a textselect ed tulaj donsg rtkt:

210

Navigcialap alkalmazsok

-(id) initWithTextselected:(NSString *) text { self.textselected = text; [label setText:[self textselected]]; return self;

Tralning Day Remember the Titans John Q.


Vou have seiccted "The Bone Collector"'

Ricoehet The Siege Malcolm X Antwone Fisher Courage Under Fire

8.24. bra

Arra, hogy a Table nzetet tartalmaz nzetbl eljussunk a rszletesbe, a tableview: did se l ectRowAtrndexPath: metduson bellj UINavi gat i oneont ro ll er objektum pushviewcont ro ll e r: metdust hasznljuk:
//---create an instance of the Detailsviewcontroller--if (self.detailsviewcontroller == nil) { Detailsviewcontroller *d = [[Detailsviewcontroller alloc] initWithNibName:@"Detailsview" bundle:[NSBundle mainBundleJ J; self.detailsviewcontroller = d; [d re l eas e] ;

//---set the movies selected in the method of the ll Detailsviewcontroller---// [self.detailsviewcontroller initWithTextselected:message];

211

8. fejezet: Eszkzsv- s navigcis alkalmazsok

//---Navigate to the details view--[self.navigationcontroller pushviewcontroller:self.detailsviewcontroller animated:YES];

Hinyz vissza gomb


Korbban a Rootviewcontroller.m fjlban llitottuk be a navigcis elemcmta kvetkezkppen:

- (void)viewoidLoad { //---initialize the array--listofMovies; [[NSMutableArray alloc] init]; //---add items--[listofMovies addobject:@"Training oay"]; ll ... //---set the title of the navigation bar--self.navigationitem.title; @"Movies"; [super viewDidLoad];
}

agyon gyakori hiba, hogy a fejlesztk elfelejcik bellitani ezt a cmet. Mi trtnik ekkor? A:z. eredmny a 8.25. brn lthat. A gykrnzetnek nincs cme, a rszletes nzeten pedig nincs olyan gomb, amely visszavinne az elz nzetre. Ha azonban megrintjk azt a terletet, ahol a vissza gombnak kellene lennie, mg gy is visszakerlnk az elz nzetre.

Training Day Remember the Titan


You have setectcd "The Bone CollectOf"'

8.25. bra

SSZEFOGLALS
Ebben a fejezetben megismertnk kt olyan f iPhone-alkalmazstpust, amelyet az SDK tmogat: az eszkzsv-alkalmazsokat s a navigcialap alkalmazsokat. Megvizsgltuk, hogy ez a kt alkalmazstpus hogyan mkdik, gy kpesek lesznk olyan tbbnzetes alkalmazsokat fejleszteni, amelyek ugyangy nznek ki, mint az iPhoneunkon megszakottak

212

Navigcialap alkalmazsok

1. Ksztsnk egy eszkzsv-alkalmazst kt eszkzsvelemmel. Ha a felhasznl meg-

rinti a msoclik eszkzsvelemet, meg kell jelennie a filmek listjnak

A FEJEZET TUDNIVALI
Tma
Eszkzsv-alkalmazsok ltrehozsa Annak meghatrozsa, mely nzet tltdik be elszr egy eszkzsv-alkalmazsban Eszkzsvelemek hozzadsa egy eszkzsv-alkalmazshoz

Alapelvek
UITabBarcontro ll er hasznlata a megszakott urvi ewcont ro ll e r helyett.

A:z. UITabBarcontro ll er pldnyban felsorolt rendjnek mdostsa.

nzetvezrlk

sor-

Miutn az elem hozzaddott az eszkzsvhoz, ne felejtsk el tlltani a NIB Name tulajdonsgt a projekt egyik XIB fj lj ra. A Class tulajdonsgt is t kell lliranunk egy View Controller osztlyra. Biztostani kell, hogy az sszes nzetvezrl megvalstsa a shoul dAutorotateTointerfaceori entati on: metdust. [self.navigationcontroller pushviewcontroller:self.detailsviewcontroller animated:YES];

A tjolsvltoztats tmogatsa az esz kzsv-alkalmazsokban


avigls msik nzetvezrlre egy navigcialap alkalmazsban

213

Segdprogramok
A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan fejlessznk segdprogramot (Utility Application) az SDK ltal knlt sablonnal? Hogyan vltsunk nzetet a segdprogramokban? Hogyan alkalmazzunk
klnbz

tmeneteket a nzetek vltsakor?

Hogyan adjunk tovbbi nzeteket a segdprogramhoz?

Az elz kt fejezet j nhny olyan alkalmazspust bemutatott, amelyeket iPhone SDK segtsgvelltre tudunk hozni: nzetalap alkalmazsok, navigcialap alkalmazsok s eszkzsv-alkalmazsok. Az iPhone-nal sszefggsben igen elterjed alkalmazspusok mg a segdprogramok (Utility Applications), amelyek egyszer feladatokat hajtanak vgre minimlis felhasznli adatbevitelleL Az iPhone eszkzn megtallhat Weather s Stocks alkalmazs pldul kt ilyen segdprogram. A 9.1 bra a Weather alkalmazst muta~a egy adott vros idjrsnak megjelentsekor. Amikor megrin~k a jobb als sarokban lev kis i ikont, a kperny megvltozik A nzetek vltsa az egyik gyakori jellemzje a segdprogramoknak Az Apple felhasznli fellet iPhone-alkalmazsokra vonatkoz irnyelvei szerint a segdprogramok "egyszer feladatokat hajtanak vgre minimlis felhasznli adatbevitellel". Ezrt egy olyan alkalmazs fejlesztsekor, amelynek informcijhoz a felhasznl gyorsan hozzfr, a segdprogram lenne az idelis keretrendszer. Ilyenek pldul: valutaegysg-vlt, mnkegysg-tvlt, RSS-olvas.

9. fejezet: Segdprogramok
.diSGP

"'

4 23 A !o~

00 Done

Weather

= = = = =

~ Singapore
Beljlng Vietnam, San Juan

["'

" --

Shanghal Callfomla City

Talpel City

~
~
....atl\o(-

:Klwttt1tlv

YAB001

9.1. bra

A kvetkezkben megismerjk, hogyan hozhatunk ltre segdprogramot az iPhone SDK sablon segtsgveL

Segdprogramok kszitse
Az iPhone SDK rendelkezik segdprogramok ksztshez alkalmas sablonnal. A sablon hasznlatval minden szksges kd kszen ll a nzetvltshoz. Amikor egy egyszer segdprogramot hozunk ltre, csak az alkalmazsunk logikjra kell koncentrlnunk. Ha egy sszetettebb segdprogramot ksztnk, az elre megrt kd j alap lehet az alkalmazs kiterjesztshez. Elszr ksztsnk SD K sablonnal segdprogramot, s nzzk meg a kvetkez gyakorlati rszben, hogyan mkdik.
Segdprogram ltrehozsa

A programkd [UtilityApplication.ifp] a Wrox.com oldalrl tolthel le.

1. Hozzunk ltre egy j segdprogram- (Utility Application) projektet az Xcode se-

gtsgve!, s nevezzk el uti l i t yApp l i cati on-nek.


2. Vizsgljuk meg a projekt tartalmt (lsd a 9.2. brt) . Alapveten kt nzettel kell

foglalkoznunk: M ainview. xi b s Fl i ps idevi ew. xi b. A M ainview. xi b a f nzet, amelyet a felhasznlk az alkalmazs betltsekor ltnak. Egy kis i ikont tartalmaz, amely ha rkattintunk, egy msik nzetre, a Fl i ps idevi ew . xi b-re vlt. Min216

Segdprogramok ksztse

den .xib fjl kt fjlt reprezentl: egyik a nzetrt, msik a nzetvezrlrt felels. A Mainview.xib fjl teht egytt jr a Mainview.h s a Mainview.m, valamint a Mainviewcontroller.h s a Mainviewcontroller.m fjlokkal.
r;
Matchl~
~~ch

""' Codt
~

""

~~ Mu'IV-twh
~Mltn~.m
~

"'
~ ~

~
~

MutV.ewC:ontrol&er.h

!"ll M.l.lnVtcwConuol~r-m
rlip~tdeV1~

"
~

,;1 HlPSKit:Vitw h
1111 fllpSfdtVI~W.m

~ fltpst.CkV.e9o(;onttotltr.h
111l RipSidtVitwControkr.m
Applt<.a,on Dtltg<llte
~

""
"" -!
oJ

();hf.r Sources Resources


fr~s

c {td)lntt'll\ttl'r~ : (ctill'ec:t)trc-e { tt (! lf (wptr tnu.lht.t#r~:tr..e]) {

rand

R~sulu

h } ro wnwtf;

"

e ".,.a Symbols
tmpf6M.ntt.lon f1ks . . . NIIFtlt.s

look......U SCM

~t)rec.t

~
9.2. bra

rlipswltVJewXib

JU_"Vie"W.XIb
Mu\~ondow.xb

3. Brmilyen tovbbi kd rsa nlkl elindthatjuk a segdprogram tesztelst a Command-R gombok megnyomsvaL A 9.3. bra mkds kzben mutatja az alkalmazst. Az i ikon megnyomsval a kijelz egy msik nzette vlt. A Done gomb megnyomsval visszatrhetnk a f nzethez.

Hogyan mkdik?
A segdprogram megrsnak nagy rszt mr elvgeztk helyettnk. m mindig rdemes megrteni a dolgok httert is. Ahogy lttuk, a projekt kt f nzetet tartalmaz, amelyeket a Mai nvi ewcontro ll er s a Fl i ps i de viewcont ro ll e r nzetvezrl irnyt. Elsknt vizsgljuk meg a Fl i ps i devi ewcontroll er. h fjl tartalm t:

217

9. fejezet: Segdprogramok

@protocol Flipsideviewcontrolleroelegate; @interface Flipsideviewcontroller : urviewcontroller { id <Flipsideviewcontrolleroelegate> delegate; @property (nonatomic, assign) id <Flipsideviewcontrolleroelegate> delegate; - (IBAction)done; @end @protocol FlipsideviewcontrollerDelegate - (void)flipsideviewcontrollerDidFinish:(Flipsideviewcontroller *)controller; @end

9.3. bra

vezrlelem

kdja egy gynevezett Flipsideviewcontrolleroelegate protokollt definielrhetv

l, amely egy flipsideviewcontrollerDidFinish: metdust tartalmaz. A protokoll hasznlatakor a Fl i ps i devi ewcontro ll er teszi a Fl i psi devi ewcontro ll erDelegate tulajdonsgot, amely del egate-tpus. A fl i psi devi ewconno ll erDi d Fi ni sh: metdus tnyleges implementcija nincs meghatrozva a vezrlelemben; a meghv elem feladata ezt megtenni (ebben az esetben a Mainviewcontroller-) . Ezzel jelzi a meghv nzetvezrlnek,

hogy a feladat elvgezve, az irnyts visszakerlhet a nzetvezrlhz.

218

Segdprogramok ksztse

Megjegyzs A C fggelk rszletesebbel trgyalja a protokoll tmakrt.

A Flipsideviewcontroller .m fjlnl a done: metdus implementcijt a header llomnyban hatrozzuk meg:


- ( IBAction)done { [self.delegate flipsideviewcontrolleroidFinish:self];

Alapveterr ez a metdus hivja meg a flipsideviewcontrolleroidFinish: metdust, amelyet a Flipsideviewcontrolleroelegate protokollban adtunk meg (de mshol implementl tunk). Kattintsunk ktszer a Fl i ps ideview. xi b fjlra, ezzel megnyitjuk az Interface Builderben. A kvetkezt figyelhetjk meg:

A Flipside nzet egy Navigation Bar s egy Bar Button nzetet tartalmaz Osd a 9.4. brt). A done: mvelet a D one gombhoz kapcsoldik. (Kattintsunk jobb gombbal a File's Owner elemre, hogy lthassuk a hozz kapcsolt mveleteket s kivezetseket.)
Bru Button

N an gatton Bill

Lt

9.4. bra

219

9. fejezet: Segdprogramok

Ekkor m egvizsglha ~uk a Mai nvi ewcontroll er . h fjlt: #import " Flips i deviewcontroller.h" @ interface Mainviewcontroller : urviewcontroller <Flipsideviewcontroller Delegate> {
}

- (IBAction ) showrnfo; @end

A Mai nvi ewcontroll er implem entlja a Fl i psi devi ewcontroll erDelegate protokollt.
Msknt fogalmazva: a protokoll ltal m egh atrozott metdust kell implem entlnia (ebb en az esetben ez a flips i deviewcont r ollerDidFinish: m etdus) .

A Mai nvi ewcont r oll er . m fj lban trtnik m eg a fl i psi devi ewcontroll eroi d Fi ni sh :
m etdu s m egh atrozsa. Ez arra szolgl, h ogy b ezrja a Fl i psi devi ew-t, amikor vgzett: - (vo i d) flipsideviewcontrollerDidFinish:(Flipsideviewcontroller * ) controller { [self dismissModalvi ewcontrollerAnimated:YES];

A Mainviewcontroller.m fl j egy gynevezett showrnfo()


mvelet

mveletet

is tartalmaz. A m

velet akkor hvdik meg, h a a felhasznl m egnyom ja az Info gomb ot. A showinfo () m od lisan b etlti a Fl i psi devi ew-t.

- (IBAction)showinfo { Flipsideviewcontroller *controller


=

[[Flipsideviewcontroller alloc] initWithNibName:@"Flipsideview" bundle:nil];

controller . delegate

self;

controller.modalTransitionstyle = UIModalTransitionstyleFlipHorizontal; [self presentModalviewcontroller:controller animated:YES]; [controller release];

H a dupln kattintunk a Mainview . xi b-r e, h ogy az Interface Builderben szerkeszthessk, akkor jo b b gombbal kattinthatunk az Info gombra, s m eggyzdhe tnk arrl, h ogy a Tou ch Up In si de esem n ye kapcsol dik-e a showinfo O mv elethez (lsd a 9.5. brt). Van teh t egy segdprogramunk, amely an lkl m kdik, hogy akr egy sor k d o t rtunk volna.

220

tmenetstlusok
o ~ o

Type
Oflwing

. Info Ught Shows ToU<h On Htghltght


Highlighted Adjusts lrN.gt

J)

Dtubled AdJUSts ltmgt

o
Y
l'r'~n ! ~

Font
O.df<\d/Y fo,l
[C.tor.o;.('l"<iJ

Hel-veou lold. 15 .0

fO::In<J OJ
Tc>uh
T-1\.Kh
T~~h

$#t,~on

fo::or~<;!)Jf.-1
(,.r.{~l

Oc""" O..... Plii:~P~t

T., .... h J.~oq ::-"'"'


Tr,".<h Orlo'l t~r!

T<u:h I),.q ''"'"'"


T~o.~-:h !:>.&Q O..t~rc~

Touch u" bWd

fil\

.._,.

Own'

o o o o o o o o o o o
o

Cc>nt.em Ef.ioe lnstt

-:1----o:Oo' r:1
Bottom

0 .00 ~

[1
l t ft

Rlght

Sha.d ow

x Offst(

--o:oo (D
y Offstt
OirHt1on

w Hrghtighl Reverns

T.-,.d, .... o.t.'-J


Y .~o

:::ID
Ti tie
lm~gt:

CIH~q..1

Y R~ft-rt-nc.,g Outlt"t~
'ftlll'
llrl#f#'l(o-~

0<1':,.

o o

B.u:kground

a
Tade
Sh~daw

9.5. bra

tmenetstilusok
Az elz fejezetben lthattuk, hogy az i infogomb megnyomsakor a nzet egy msik nzetre vlt. Ezt a viewcontroller osztly modalTransitionstyle tulajdonsga vezrli:
- (IBAction)showinfo { Flipsideviewcontroller *controller [[Flipsideviewcontroller alloc] initWithNibName:@"Flipsideview" bund l e: ni l] ;

controller . delegate

self;

controller . modalTransitionstyle = UIModalTransitionstyleFlipHorizontal; [self presentModalviewcontroller:controller animated:YES]; [controller release];

221

9. fejezet: Segdprogramok

Megjegyzs Amoda lTransi ti onstyl e tulajdonsg csak az iPhone SDK 3.0. s

a ksbbi verzik esetn rhet el. Ha alkalmazsunkat egy rgebbi SDK verzin szeretnnk futtatni, nem mkdik .

Az alaprtelmezett tmenet a vzszintes vlts, amelyben a f nzet vzszintes vltssallesz Fl i psi devi ew (lsd a 9.6. brt). A vzszintes mellett lehet fgglegesen vagy lass ttnssei is vltani. Ezeket a funkcikat a kvetkez (flkvrrel megjelentett) llandk vezrlik: //---flip vertically- -controller.modalTransitionstyle = UIModalTransitionstylecoververtical; //---dissolves slowly to reveal anather ll view--controller.modalTransitionstyle UIModalTransitionstylecrossoissolve; rdemes kiprblni az tmenetstlusok vltoztatst, hogy lssuk a k:lnbsgeiket.

9.6. bra

j elem hozzadsa a segdprogramhoz


Mindezek utn felmerlhet az az igny, hogy nveljk a funkcionalitst, s tbb nzetet is adjunk az alkalrnazshoz. Az iPhone Weather alkalmazshoz visszatrve, lthat, hogy nzetnk tartalmaz egy tovbbi plusz (+) gombot, amellyel mg tbb idjrsi informcit jelenthetnk meg (lsd a 9.7. brt). A kvetkez gyakorlati rszben megnzzk, hogyan adhatunk tovbbi nzetet a korbban ltrehozott projekthez, hogy elrjk a Weather alkalmazshoz hasonl viselkedst.

222

j elem hozzadsa a segdprogramhoz


.dl ':)(,P
" l Al'

O tf

.d1SC.P

:;::-

~0.:'6

:..l.i

Weather
Singapore

"='
- ..... y....

c......

Belfing
New York Mills, MN

Vietnam, San Juan


Shanghal

C.llfomla City
~ TalpelCity

--c!:::::1
9.7. bra

X'Wtrr~OJ

YAHOO!

6 1@1 j nzet hozzadsa a segdprogramhoz


1. Hasznljuk az el z leg ksztett projektnket, s kattintsunk ktszer a Fl i p si deview. xi b fjira ahhoz, hogy az Interface Builderrel szerkesszk.

NaV1g.ltTon hem

Toolbit

.......
Fltxtble
Sp~c.e

,.........,
. Flxtd
Sp~ct. 8~

T3b Bar Ut:m

hr lutton ltem

9.8. bra

223

9. fejezet: Segdprogramok

2.

A avigation Bar nzetre helyezznk el egy Bar Button nzetet (lsd a 9.8. b rt). A avigation Bar nzet kt Bar Button I tem nzetet kpes csak befogadni.

3. Vlasszuk ki az jonnan hozzadott Bar Button Item nzetet, s nzzk meg a hozz tartoz Attributes Inspector ablakot. Mdostsuk az Identifier attribtumt Add rtkre (lsd a 9.9. brt), ez a gomb feliratt plusz jelre (+)vltoztatja.

Cunom

Ontblt:Sp.lu: Ft'l!.td Spolee

AcloOn

l'!> y

P.wu Re-.... .od f.ut For..ud

9.9. bra

4.

Jellj k ki
egy j add

mveletet

a File's Owner elemet a Fl i ps ideview. x i b ablakban, s adjunk hozz az Idencity Inspector ablakban.

5. Miutn meghatroztuk a mveletet, kapcsoljuk a + gombhoz: a Control billenty lenyomsa mellett kattintsunk, s a + gombot hzzuk a Fl i ps ideview. x i b ablak File's Owner elemre. 6. Trjnk vissza az Xcode-hoz, adjunk egy j Group elemet a projekt neve al, majd nevezzk el: AddCountryView. 7. Az jonnan hozzadott AddCountry View csoporton bell hozzunk ltre egy j urviewcontroller alosztlyt, s nevezzk el: Addcountryviewcontroller.m. Az .m s . h fjlok most mr a csoporthoz tartoznak (lsd a 9.10. brt). j urviewcontrolle r alosztlyelem hozzadsakor az Xcode felknlja egy XIB fjlltrehozsnak a lehetsgt. Hagyjuk ki ezt a lehetsget, mert ksbb ezt manulisan megtesszk 8. A Resources csoporton bell vigynk fel egy j View XIB elemet, s nevezzk el:
Addcountryview .xib.

224

j elem hozzadsa a segdprogramhoz

,... ,..
Stmutator- 3:_0--'I_De_b_u_,g'-----------'
o-view

J"l. AddCountryViewC
Suilel

ActiOn

Croups & Flles UttlltyApp ltcotton


AddCountry Vit:w

jll'll
"

~ AddCountryVlewControllu.m

File Nam AddCount(\'ViewController.h

[;j AddCountryVtwControllr.h
~ AddCountf)'VewControlter.nM.ln Vit:w
~ M.J.nVi~. h

1 ")

M.ltnVow.m
Mol inVewController.h

9.10. bra

9. Kattintsunk dupln az Addcountryvi ew. xi b fjira ahhoz, hogy az Interface Builderrel szerkesszk. Tltsk fel egy Search Bar s egy Round Rect Button nzettel Osd a 9.11. brt).

Q.

7
Done +

Search bar

R ound R ect

9.11. bra

10. Vlasszuk a File's Owner elemet az Addcountryview.xib ablakban, s nzzk meg az Idencity Inspector ablakot. Az osztly bellitsa legyen Addcountryviewcontroller. Emellett adjunk egy done mveletet a File's Owner elemhez Osd a 9.12. brt) . 11. A Control billenty nyomva tartsval kattintsunk, s hzzuk a File's Owner elemet a View elemre, majd vlasszuk a view-t. 12. A Control billenty nyomva tartsval kattintsunk, s hzzu k a Done gom bot a File's Owner elemre. Vlasszuk ki a done mveletet.

225

9. fejezet: Segdprogramok

AddCountryVew xb

Clus

AddCountryVitwControUtr

9.12. bra

13. Visszatrve az Xcode-ba, szrjuk be a kvetkez flkvren szedett programkdot az Addcountryvi ewcontroll er. h fjlba:
#import <UIKit/UIKit.h> //---defines the protocol--@protocol AddcountryviewcontrollerDelegate; @interface Addcountryviewcontroller : urviewcontroller { /1---delegate--id <AddcountryviewcontrollerDelegate> delegate;

//---exposes the delegate as a property--@property (nonatomic, assign) id <Addcou ntryviewcontrol leroelegate> delegate; //---the done action; called when the Done button is clicked---- (IBAction)done; @end //---defi nes the protocol--@protocol Addcountryviewcontrolleroelegate - (void)addCountryviewcontrollerDidFinish:(Addcountryviewcontroller *)controlle r; @end

14. Adjuk meg a kvetkez flkvren szedett programkdot az Addcountryviewcont ro ll e r. m fjlban:

226

j elem hozzadsa a segdprogramhoz

#import "Addcountryviewcontroller.h" @implementation Addcountryviewcontroller //---synthesize the delegate--@synthesize delegate; //---invokes the method defined in the protocol-- - (IBAction)done { [self.delegate addcountryviewcontrolleroidFinish:self];

15. Szrjuk be a ler .h fjlba:

kvetkez

flkvren szedett programkdot a Flipsideviewcontrol-

//--- import the header file of the Addcountryviewcontroller class--#import "Addcountryvi ewcontroller . h"; @ protocol Flipsideviewcontrolleroelegate; //---implements the Addcountryviewcontrolleroelegate protocol--@interface Flipsideviewcontroller : urviewcontroller <Addcountryviewcontrolleroelegate> id <Flipsideviewcontrolleroelegate> delegate;

@ property (nonatomic, assign) id <Flipsideviewcontrolleroelegate> delegate; - (IBAction) done; //---the add: action; called when the "+" button is clicked--- (IBAction)add; @e nd @protocol Flipsideviewcontrolleroelegate - (void)flipsideviewcontrollerDidFinish :(Fli psideviewcontroller *)controller; @end

16. Szrjuk be a ler.m fjlba:

kvetkez

flkvren szedett programkdot a Fl i psi devi ewcontro 1-

//---defines the addcountryviewcontrolleroidFinish: method- -- (void)addcountryviewcontrolleroidFinish:(Addcountryviewcontroller *)controller [self dismissModalviewcontrollerAnimated:YES];

227

9. fejezet: Segdprogramok

//- - -defines the add: action--- (IBAction)add { Addcountryviewcontroller *controller

[[Addcountryviewcontroller alloc] initwithNibName:@"Addcountryview" bundle:nil];

controller.delegate

self;

/1---use the vertical transition--controller . modalTransitionstyle = UIModalTransitionStylecoververtical; [self presentModalviewcontroller:controlleranimated:YES]; [controller release];
}

17.

yomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatorra teleptsk. A 9.13. bra az Addcoun t ryvi ew
fggleges,

felfel irnyul mozgst mu-

tatja a

+ gomb megnyomsakor.

18. A D one gomb megnyomsa elrejti az Addcountryvi ew-t.

Hogyan mkdik?
A plda azokat a lpseket mutatja be, amelyekkel a segdprogramunkhoz j nzetet adunk. Elszr ltrehozzuk a kiegszt nzet XIB fjljt, valamint az ennek megfelel urviewcontroller oszlyt. A vezrlelemen bell meghatrozzuk a protokollt:
//---defines the protocol - - @ protocol Addcountryviewcontrolleroelegate - (void)addcountryviewcontrolleroi dFinish : (Addcountryviewcontroller *) controller; @ end

9.13. bra

Ezutn elrhetv tesszk a protokollpus egy tulajdon sgt: interface Addcountryviewcontroller : UIViewcontroller { @ /1-- - delegate-- id <Addcountryview controlleroelegate> delegate;

//--- exposes the delegate as a property- -@ property (nonatomic, ass i gn) id <Addcount ryvi ewcontrol le roelegate> delegate;

228

j elem hozzadsa a segdprogramhoz

Annak a nzetnek, amely ezt a n zetet m eghivja, implementlnia kell a protokoll ltal meghatrozott metdust a
kvetkezkppen:

- (void)addcountryviewcontrolleroidFinish : (Addcountryviewcontroller *)controller; Amikor a felhaszn l m egnyomja a nzet D one gombjt, m eghivj uk a done: metdust: //-- -invokes the method defined in the protocol - -- (IBAction)done { [self.delegate addcountryviewcontrolleroidFinish:self];

A FlipsideviewController . m fjlban implem entljuk a zott Addcountryvi ewcontro ll er oe l egate p ro to ko llt:

kiegszt

n zetben meghatro-

//- - -implements the Addcountryviewcontrolleroelegate protocol --@ interface Flipsideviewcontroller : UIViewcontroller <Addcountryviewcontrolleroelegate> { Adott esetb en implem en tljuk az addcountryvi ewcontro ll eroi d Fi ni sh: m etdust, amely eltnteti a
nze tvezrl t:

//---defines the addcountryviewcontrolleroidFinish: method--- (void)addcountryviewcontrolleroidFinish: (Addcountryviewcontroller *) controller { [self dismissModalviewcontrollerAnimated:YES];

Vgl m egad juk az add: m etdust, amely fggleges tmenettel mutatja m eg a kiegszt nzetet: //---defines the add: action --- (IBAction)add { Addcountryviewcontroller *controller

[[Addcountryview controller alloc] initwithNibName: @ "Addcountryview" bundle:nil] ;

controller.delegate

self;

//-- -use the vertical transition--controller.modalTransitionstyle = UIModalTransitionstylecoververtical; [self presentModalviewcontroller:controller animated :YES]; [controller release];

229

9. fejezet : Segdprogramok

SSZEFOGLALS
A fentiekben megnztk, hogyan segti az iPhone SDK segdprogramsablonjaa fejlesztk munkjt. A nzetek kztti tmenet mkdst azrt fontos megrteni, mert egyedi felhasznlsra teszi lehetv a sablon kiterjesztst. A kvetkez fejezetben megvizsgljuk, hogyan hasznlha~uk a segdprogramokat alkalmazsbelltsokkal arra, hogy megrizzk a felhasznl belltsait s adatainak megrzst.

1. Amikor a segdprogram Info gombjra kattintunk, az Info gomb gyan kapcsoljuk ki ezt az effektet?

kiemeldik.

Ho-

2. Hogyan adunk t adatot a segdprogram egyik elembl a msikba? Ttelezzk fel, hogy szttinget kell tadnunk a Flipsideviewcontroller elemtl a Mainviewcontroller elemhez.

A FEJEZET TUDNIVALI
Tma
Segdprogram ltrehozsa Segdprogram nzetei kztti tmenet

Alapelvek
Hasznljuk az iPhone SDK ltal nyjtott segdprogramsablont. Hasznljukamoda lTransi ti onstyl e tulajdonsgot, s lltsuk be a kvetkez rtkek valamelyikre: UIModalTransitionstyleFlipHorizontal, UIModalTransitionstylecoververtical s UIModalTransitionstylecrossoissolve.
Elszr hozzunk ltre egy j XIB fjlt s a hozz tartoz UIVi ewcontro ll er alosztlyt (.h s .m fjlok). Ezutn a nzetvezrlben hatrozzunk meg egy protokollt, s a protokolldeleglt egy pldnyt tegyk elrhetv tulajdonsgknL

j nzet hozzadsa a segdprogramhoz

230

Rs -_-z
--~-

Adatok megjelenitse s trolsa


10. A Tablenzet hasznlata .................................. 233 11. Alkalmazsbelltsok ...................................... 269 12. Fjlkezels ........................................................ 293 13. Adatbzis-trols az SQLite3 hasznlatval.. .... 311

A Table nzet hasznlata


A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan adjunk hozz manulisan Table nzetet egy View-hoz, s hogyan kapcsoljuk hozz az adatforrst s a delegltat az elemvezrlhz? Hogyan kezeljk a Table nzet tltshez?
klnbz

esemnyeit a nzetelemekkel val fel-

Hogyan kezeljk a Table nzet klnbz esemnyeit annak rdekben, hogy a felhasznJk kijellhessk a nzetelemeit? Hogyan jelertsnk meg szveget s kpeket a Table nzet soraiban? Hogyan jelertsk meg egy tulajdonsglista elemeit a Table nzetben? Hogyan csoportostsuk a Table nzet elemeit szakaszokba? Hogyan indexeljk a Table nzetet? Hogyan adjunk hozz keressi kpessgeket a Table nzethez? Hogyan adjunk hozz rszleteket s pipkat a Table nzet soraihoz?

Az egyik leggyakrabban hasznlt nzet az iPhone-alkalmazsokban a Table nzet. A Table nzetet olyan elemek megjelertsre hasznljuk, amelyeket a felhasznJk kijellhetnek, vagy megrintve ket tovbbi adatokat jelerthetnek meg. A 10.1. bra mk ds kzben mutat be egy Table nzetet a Settings alkalmazsban. A 8. fejezetben mr lttuk a Table nzetet, amikor egy navigcialap alkalmazsprojektet hoztunk ltre. Ott a teljessg ignye nlkl tekintettk t a mkdst, s szmos rszletet szndkosan nem emltettnk. A kvetkezkben jval rszletesebben megvizsgljuk a Table nzetet, valamint a klnfle ptelemeit, amelyeknek a sokoldalsgt ksznhe.

1O. fejezet: A Tab le nzet hasznlata

Egyszer
Elszr

Table nzet

ltrehozunk egy j nzeralap alkalrnazsprojektet, majd hozzadunk manulisan egy Table nzetet a View-hoz, s sszekapcsoljuk egy elemvezrlveL gy a Table nzet klnfle pt elemeit is megismerhetjk. Valsrsunk meg teht egy j projektet a kvetkez gyakorlati rszben, s nzzk meg, hogyan kell felpteni egy Table nzetet.

10.1. bra

A Table nzet hasznlata


A programkd [fableViewExample.ifp] a Wrox.com oldalrl tolthel le.

1. Hozzunk ltre egy j nzeralap alkalmazs- (View-based Application) projektet, s nevezzk el Tablevi ewExamp l e-nek. 2. Kattintsunk ktszer a TableviewExampleviewcontroller.xib fjira ahhoz, hogy az Interface Builderrel szerkesszk. 3. Hzzuk t a Table view object elemet a Librarybl a View abiakba (lsd a 10.2.
brt).

4. Kattintsunk jobb gombbal a Table nzetre, s kapcsoljuk ssze a datasource kivezetst a File's Owner elemmel (lsd a 10.3. brt). Vgezzk el ugyanezt a de l egate kivezetssei is.

234

Egyszer Table nzet

Cupertino Glendale Los Angeles Palo Alto San Diego

San Francisco Santa Clara Santa Monica


Sherman Oaks
Vo
Displays a single-column Un of muiUple rQW5. through whKh users un sc roll. ch

row in a til.bte Vltw is a urr..bleVIewCell obje<t. T'he' plain styte tabte view displays
ro"?' t~t.oc~upy the fu~l.width of t~ Ytew

(f

Q. F

10.2. bra
Vttw

Cupertino
TableVitwExampleViewController.xib

=---

Glendale
'f (lJ':'

l nct An,. - - ::r

'"'"-''

Palo Alto

1\..,.,,. ,., : "'l r It. r ... _, ,, ." ,.


~.

l~~

San Diego San Francisco Santa Clara Santa Monica Sherman Oaks

10.3. bra

235

10. fejezet: A Tablenzet hasznlata 5. Adjuk hozz a TableviewExampleviewcontroller.h fjlhoz a szedett utastst: #import <UIKit/U IKit . h> @interface TableviewExampleviewcontroller <UITableviewoatasource> { urviewcontroller
kvetkez

flkvren

@ end

Megjegyzs Ha a datasource kivezetst sszekapcsoltuk a File's Owner elemmel, nem kell hozzadnunk az elz utastst. Vagy rjuk be az elz utastst (unableviewoatasource), vagy kapcsoljuk ssze a kivezetst az Interface Builderben. m az sem okoz gondot, ha mindkettt elvgezzk. A <UITableViewDataSource> protokoll hozzadsnak van egy elnye: a fordt figyelmeztet, ha brmelyik szksges metdust elfelejtettk megvalstani a programkdban, hogy elsegtse a hibk elkerlst.

6. Adjuk hozz a kvetkez flkvrerr szedett utastst a TableviewExampleviewcontro ll e r. mfjlhoz: #import "TableviewExampleviewcontroller.h" @i mplementation TableviewExampleviewcontroller NSMutableArray *listofMovies; //---insert individual row inte the table view--- (UITableviewcell *)tableview:(UITableview *)tableview cellForRowAtindexPath:(NSindexPath *)indexPath { static NSString *Cellidentifier
=

@"Cell";

//---try to get a reusable cell--UITableviewcell *cell = [tableview dequeueReusablecellwithrdentifier:cellidentifier]; //---create new cell if no reusable cell is available--if (cell == nil) { cell = [[[UITableviewcell alloc] initwithstyle:UITableviewcellstyleoefault reuserdentifier:Cellrdentifier] autorelease] ;
}

236

Egyszer Table nzet

//---set the text to display for the cell--NSString *cellvalue = [listOfMovies objectAtindex:indexPath.row]; cell.textLabel.text = cellvalue; return cell;

//---set the number of rows in the table view--- (NSinteger)tableview:(UITableview *)tableview numberOfRowsrnsection:(NSinteger)section { return [listOfMovies count];

- (voi d) viewoidLoad { //---initialize the array--listOfMovies = [[NSMutableArray alloc] init]; //---add items--[listofMovies addobject :@"Training oay"]; [listofMovies addObject :@"Remember the Titans "]; [listofMovies addobject:@"John Q. "] ; [listofMovies addobject:@"The Bone collector"]; [listofMovies addobject:@"Ricochet"]; [listofMovies addobject:@"The siege"]; [listofMovies addobject:@"Malcolm x"]; [l i stofMovies addobject: @"Antwone Fisher"] ; [listofMovies addobject: @ "courage under Fire"]; [listofMovies addobject: @"He Got Game"]; [listofMovies addobject: @"The Pelican Brief"]; [listofMovies addobject:@"Glory"]; [listofMovies addobject: @"The Preacher's wife" ] ; [super viewoi dLoad] ;

Trainlng Day Remember the Titans John Q . The Bone Colleetor Ricoehet The Slege

- (void) dealloc { [listofMovies release]; [super dealloc] ;

Malcolm X Antwone Fisher Courage Under Fire He Got Game

7. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatorban teszteljk A 10.4. bra egy f.tlrnlistt megjelent Table nzetet mutat be.
10.4. bra

237

10. fejezet: A Tablenzet hasznlata

Hogyan mkdik?
Elszr

ltrehozunk egy listOfM ovies nev NSMutableArray o b jektumot, amely filmcmek listjt tartalmazza. A Table nzet ennek a tmbnek az elemeit jelenti meg: - (void)viewoidLoad { //---initialize the array--listOfMovi es = [[NSMutableArray alloc] init]; //---add items- - [listDfMovies addobject:@"Training oay"]; [listofMovies addObject:@"Remember the Titans"]; [listOfMovies addobject:@"John Q." ]; [listOfMovies addobject:@"The Bone collector"]; [listOfMovies addobject:@"Ricochet"]; [listOfMovies addobject:@"The Siege"] ; [listOfMovies addobject:@"Malcolm x"]; [listOfMovies addobject:@"Antwone Fisher"]; [listOfMovies addobject:@"courage under Fire"]; [listOfMovies addobject:@"He Got Game"]; [listofMovies addobject:@"The Pelican Brief"]; [listOfMovies addobject:@"Glory"]; [listOfMovies addobject:@"The Preacher's wife"] ; [super viewoidLoad];

Ahhoz, hogy a T able nzetet elem ekkel tltsk fel, a unab levi ewoatasou r ce protokoll szmos esemnyt kell kezelnnk. Ezrt az protokollt: interface Tablevi ewExampleview controller @ <UITableviewoatasource> {
elemvezrl n ek

m eg kell valstania ezt a

urviewcontroller

A unableview oatasource protokoll szmos olyan esemnyt tartalmaz, amelyeket megvalstva adatokkalltha~ uk el a Table nzetet. A pldban az albbi kt esem nyt kezeltk:
tableview:numberOfRowsrnsection: tableview :cellForRowAtindexPath:

A tableview:numberofRow srnsection : esemny azt jelzi, hny sort fog jelent meg a Table nzet. Ez ebben az esetben megegyezik a l i stofMovi es tmb elemeinek a szmval:
//---insert individual row into the table view- - - (NSinteger) tableview:(UITableview *) tableview numberOfRowsrnsection: (NSinteger)section { return [listofMovies count] ;

238

Egyszer

Table nzet

A tablevi ew: ce ll ForRowAtrndexPath: esemny beszr egy cellt a Tabi e nzet egy adott helyre. Ez az esemny egyszer kvetkezik be a Table nzet minden sorban.

ll

Megjegyzs A tablevi ew: cell ForRowAtrndexPath: esemny lefutsa nem folyamatos. Ha pldul a Table nzetben 100 sor jelenik meg, az esemny pldul az els 10 lthat sorban bekvetkezik. Amikor a felhasznl legrgeti a Tab le nzetet, a tablevi ew: ce ll ForRowAtindexPath: esemny a kvetkez

nhny lthat sorban is bekvetkezik.

Jelen esetben egy adott elemet keresnk vissza a

tmbbl,

s beszrjuk a Table nzetbe:

- (UITableviewcell *) tableview: (UITableview *)tableview cellForRowAtindexPath:(NSindexPath *)index Path { static NSString *Cellidentifier =@"cell"; //---try to get a reusable cell--UITableviewcell *cell = [tableview dequeueReusableCellwithidentifier:Cellidentifier]; //---create new cell if no reusable cell is available--if (cell == nil) { cell = [[[UITableviewcell alloc] initwithstyle:UITableviewcellstyleoefault reuseidentifier:cellidentifier] autorelease];
}

//---set the text to display for the cell--NSString *cellvalue = [listOfMovies objectAtindex:indexPath.row]; cell.textLabel .text= cellvalue; re tu rn ce ll ;

Konkrtan a una blevi ew osztly dequeueReusab l e ce ll wi thidenti fi er: metdusval kapjuk meg a U !Tab levi ewce ll osztly egy pldnyt. A dequeueReusab l e ce ll wi thidentifi e r: metdus a Table nzet egy jrafelhasznlhat cellaobjektumt adja vissza. Ez azrt fontos, mert ha nagy tblval dolgozunk (pldul egy 10 ezer sorossal), s minden egyes sorhoz ltrehozunk egy unableviewcell objektumot, azzal tl nagy teljestmny- s memriahasznlatot generlnnk. Illetvernivel a Table nzet egyszerre csak adott szm sort jelent meg, rdemes a mr nem lthat cellkat jra felhasznlni. A dequeueReusablecellwithIdentifier: metdus pontosan ezt teszi. Ha teht a Tablenzetben pldul 10 sor ltszik, csak 1O una blevi ewce ll objektumot kellltrehozni - a felhasznlsuk mindig jra megtrtnik, arnikor a felhasznl vgiggrgeti a Table nzetet.

239

10. fejezet: A Tablenzet hasznlata

Fejlc s lblc hozzadsa


A Table nzet fejlcnek s lblcnek megjelertshez valstsuk meg a metdust az elemvezrlnkben:
- (NSString *) tableview:(UITableview *) tableview titleForHeaderrnsection:(NSinteger)section{ //---display "Movie List" as the header--return @"Movie List";
kvetkez

kt

- (NSString *) tableview:(UITableview *) tableview titleForFooterrnsection :(NSinteger)section { //---display "by Denzel washington" as the footer--return @"by Denzel washington";

Ha beszrjuk az

elz

utastsokat a TableviewExampleviewcontroller.m fjlba, s jra-

futtatjuk az alkalmazst, a Tablenzet fejlce s lblce a 10.5. brnak megfelelen lthat lesz.

Training Oay Remember the Titans John

a.
B apple.j [fmulator_- ~
Croups & Flle:s
T~bleViewExample

The Bone Colleetor Ricoehet The Siege Malcolm X Antwone Fisher Courage Under Fire

O
Actton Bu

Fil
a

)ll>

Classes
Other Sources
Resources

l:j

apple Jpeg

J TableViewExampleVie
Frameworks Products

.ciJ MamWindow.xib
lf) Tabi<Vi<wExampl<- ln

10.5. bra

10. 6. bra

240

EgyszerTablenzet

Kp hozzadsa
A Table nzet celliban
lv szvegek mellett kpeket is megjelenithetnk Tegyk fel, hogy van egy apple. jpeg nev kp a projektnk Resources mappjban Qsd a 10.6. brt).

Megjegyzs Csak hzzunk t


jektnkbe.

egyszeren egy kpet az Xcode


mentsk

Resources map-

pjba. Amikor figyelmeztetst kapunk,

el a kp egy msolatt a pro-

Ahhoz, hogy a kp az egyik cellban l v szveg mellett jelen jen m eg, szrjuk be a kve tkez flkvrrel szedett utastst a tablevi ew: ce ll ForRowAtrndexPath: metdusba: - (UITableviewcell *)tableview:(UITableview *)tableview cellForRowAtrndexPath:(NSindexPath *) indexPath { sta ti c NSStri ng *Ce ll Identifier ; @" Ce ll " ; //---try to get a reusable cell--UITableviewcell *cell ; [tableview dequeueReusablecellWithidentifier:cellrdentifier]; //---create new cell if no reusable cell is available - -i f ( cell ;; nil) { cell ; [[[UITableviewcell alloc] initWithstyle:UITableviewcellStyleoefault reuseidentifier:cellrdentifier] autorelease];

//-- -set the text to display fo r the cell-- NSString *cellvalue; [listOfMovies objectAtindex:indexPath . row] ; cell .text; cellvalue; unmage *image; [unmage imageNamed:@"apple.jpeg"]; cell.imageview.image; image; re tu r n ce ll ;

Nyomjuk meg a Command-R gombokat az alkalmazs tesztelshez, s lthatv vlik, hogy a kp minden egyes sor mellett megjelent Qsd a 10.7. brt). A un ab l ev i ewce ll o b jektum mr rendelkezik az imageview tulajd on sggaL Csak anynyit kell tennnk, hogy ltrehozzuk a unmage osztly egy pldnyt, majd b etl~ k a kpet a projektnk Resources m appjbl.

241

10. fejezet: A Tablenzet hasznlata

Kijellt elem megjelenitse


A fentiekben azt nztk meg, hogy hogyan tltsk fel elemekkel a Table nzetet gy, hogy az elemvezrlnket megfeleltetjk a UITableviewoatasource protokollnak Ez a protokoll felels a Table nzet feltltsrt, de ha ki akarjuk jellni a nzet elemeit, a unab levi ewoe l eg ate protokollnak is meg kell felelnnk. A una bl ev i ewoe l eg ate protokoll esemnyeivel vezrelhetjk a kijellseket, szerkeszthetjk s trlhetjk a sorokat, illerve jelenthetnk meg fejlceket s lblceket. A UITab levi ewoe l eg ate protokoll hasznlathoz mdostsuk a Tablevi ewExampl evi ewcontrol1er. h fjlt az albbi flkvren szedett utasts hozzadsval: #import <UIKit/UIKit.h> @interface TableviewExampleviewcontroller urviewcontroller <UITableviewDatasource, UITableviewoelegate>{

Remember the Titans

The Bone Colleetor

Antwone Fisher

10.7. bra

@end Szigoran vve, ha a delegate kivezetst korbban mr sszekapcsoltuk a File's Owner elemmel (lsd a 10.8. brt), nem kell hozzadnunk az elz utastst (un ab levi ewoe l egate). Vagy rjuk be az elz utastst, vagy kapcsoljuk ssze a kivezetst az Interface Builderben. m az sem okoz gondot, ha mindkettt elvgezzk. A kvetkez gyakorlati rsz azt mutatja be, hogyan engedlyezhetjk a felhasznlknak a kijellseket a Table nzetben.

Kijells a Table nzetben

1. A korbban ltrehozott projektet hasznlva, adjuk hozz a kvetkez, flkvrrel szedett utastsokat a Tablevi ewExampl evi ewcontroll er .m fjlhoz :

242

EgyszerTablenzet

#import "TableviewExampleviewcontroller.h" @implementation TableviewExampleviewcontroller NSMutableArray *l istOfMovies; - (void)tableview:(UITableview *)tableview didselectRowAtindexPath:(NSindexPath *)indexPath { NSString *movieselected = [listOfMovies objectAtindex:[indexPath row]]; NSStri ng *msg = [ [NSStri ng al l oc] i ni twi th Forrnat: @"You have se l ected %@", movieselected]; urAlertview *alert

= [[UIAlertview

alloc] initwithTitle:@"Movie selected" message:msg delegate:self cancelButtonTitle: @"OK" otherButtonTitles:nil];

[alert show]; [alert release]; [movieselected release]; [msg re l eas e] ;

View

Glendale Los Angeles llill Pal o


Jr,J'

~.""''"

San 01 San F1

.. Ptc, ... "p,,,.

Santa Clara Santa Monica


Sherman Oaks

10.8. bra

2. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatorban teszteljk 3. rintssel jelljnk ki egy sort. Ekkor egy Alert elem jeleruci meg a kijellt sort (lsd a 10.9. brt) .

243

10. fejezet: A Tablenzet hasznlata

Hogyan mkdik?
A tableview:didSelectRowAtindexPath: egy olyan esemnye a UITableviewDelegate protokollnak, amely akkor kvetkezik be, amikor a felhasznl kijell egy sort a Table nzetben.

A tablevi ew: di ds e l ectRowAtindexPath : esemny egyik paramtere NSindexPath-tpus. A NSindexPath osztly az egymsba gyazott tmbgyjtemny egy adott elemnek az elrsi
~ t

jelli.

Ahhoz, hogy tudjuk, az esemnynek melyik sora lett kivlasztva, lvjuk a NSindexPath objektum (i ndexPath) row tulajdonsgt, majd a sor szmval hivatkozzunk a l istOfMovi es tmbre: NSString *movieselected
=

[listofMovies objectAtindex:[indexPath row]];

Miutn visszakerestk a kijellt filmet, jelertsk meg a UIA l ertview osztly segtsgve!: NSStri ng *msg
=

[[N SS tri ng a ll oc] i ni tWi th Forrnat : @"You have se l e ct ed movieselected];

%@ ",

urAlertview *alert

[[UIAlertview alloc] initWithTitle: @" Movie selected " message:msg delegate : self cancelButtonTitle: @" OK" otherButtonTitles:nil];

Remember the Titans

Mov1e selected
You have selected Remember the

The Bone Colleetor Ricoehet The Siege Malcolm X Antwone Fisher

Tans

10.9. bra

10.10. bra

244

Szakaszok megjelenitse

Megjegyzs A NsrndexPath osztly row tulajdonsga a UIKit keretrendszer bvtmnye, amely lehetv teszi a sorok s a szakaszok azonostst a Table nzetben . A NSindexPath osztly eredeti osztlydefincija nem tartalmazza a row tulajdonsgot.

Behzs
J\ UITab l eviewoelegate protokoll egy n1sik esemnye a tableview:indentatio nLevelForRowAtrnd ex Path : . Ha kezeljk ezt az esemnyt, a kpernyn lthat sszes soron bekvetkezik. Egy adott sor behzshoz csak a behzs szintjt jelz egsz szmot kell megadnunk:
- (NSinteger)tableview:(UITablevi ew *)tablevi ew indentat i on Level For RowAti ndexPat h :(NSi nd exPat h *)indexPath { return [i ndexPath row] % 2;

J\z elz pldban a behzs O vagy 1, az aktulis sor szmtl fgg en. A 10.1 O. bra azt mutatja be, hogyan nz ki a Table nzet, arnikor az elz programkdot beszrjuk a Tablevi ewExamp levi ewcont ro ll e r . m fjlba.

Szakaszok megjelenitse
Az elz rszekben ltrehoztunk egy nzetalap alkalrnazsprojektet, majd manulisan adtunk hozz egy Tablenzetet a View ablakhoz, illetleg sszekapcsoltuk az adatforrst s a delegltat a File's Owner elemmel. Aztn kezeltk a UITa bl evi ewoe l eg a te s a unabl evi ewoatasour ce protokollokban definilt, sszes vonatkoz esemnyt, gy feltlthettk a Table nzetet elemekkel, illetve kijellhetv tettk ket. J\ gyakorlatban a Table nzetet gyakran alkalmazzuk a navigcialap alkalmazsokban, hiszen a felhasznlk ltalban kijellik a Table nzet egy elemt, majd egy msik kpernyre naviglnak, amely a kijellt elen1 rszleteit jelenti meg. Ezrt az iPhone SDK navigcialap alkalrnazssablonja alaprtelmezs szerint a Tablevi ew osztlyt hasznlja a view osztly helyett.

245

10. fejezet : A Tablenzet hasznlata Emellett a Table nzet elemeit szakaszokba rendezhetjk, gy a kapcsold elemeket gy csoportosthatjuk, hogy minden szakaszt fejlccel ltunk el. A kvetkez gyakorlati rszben megnzzk, hogyan hasznlhat a Table nzet egy navigcialap alkalmazsprojektben, tovbb azt, hogy hogyan jelentsk meg azokat az elemeket, amelyeket nem tmbben, hanem tulajdonsglistban troltunk.
Szakaszok megjelenitse a Table nzetben
1. Hozzunk ltre egy j navigcialap alkalmazs- (Navigation-based Application)

projektet, s nevezzk el Tablevi ew-nak. 2. Kattintsunk ktszer a Rootviewcontroller.xib fjira ahhoz, hogy az Interface Builderrel szerkesszk. 3. A Rootviewcontroller. xi b ablakban ekkor egy Tablevi ew elemet tallunk a szaksos view elem helyett (lsd a 10.11. brt).

4. Kattintsunk r ktszer a Tablevi ew elemre: egy Table nzetet tallunk benne (lsd
a 10. 12. brt).

Glendale Los Angeles Palo Alto San Diego San Franclsco Santa Clara

10.11. bra

10.12. bra
kibvlt

5. Nzzk meg a Rootviewcontroller.h fjlt: a Rootviewcontroller osztly


aU !Tab levi ewcontro ll er alaposztllyal: @interface Rootviewcontroller : UITableviewcontroller {
}

@ end

246

Szakaszok megjelentse

6. Nzzk meg a Rootviewcontroller.m fjlt is: szmos esemnycsonkat tartalmaz, amelyeket a megjegyzsutastsok eltvolitsa utn hasznlharunk. 7. Kattintsunk jobb gombbal a Resources mappra, s vlasszuk az Add )> New File (hozzads )> j fjl) menpontot. 8. Jelljk be az Other (tovbbiak) kategrit a New File prbeszdablak bal oldaln s a Properry List sablont a jobb oldaln (lsd a 10.13. brt).

Megjegyzs A .PLIST sablon az Xcode 3.2-ben a Mac OS X )> Resources (Mac


OS X )> erforrsok) flre kerlt.

LiPhone OS
Coc~Y

Touch Cl&ssH
Empty

Code Sigmng

Resources

Fde

Exports File

Use.r lnte:rf<~ct:s
~cOS

AppeScnpt
C ~nd C++

c.rbon Coco.t
lnterfue Bu llder SOK
Purejolv&

Description An XMl property list file..

Pure Python

Rubv
Sync:Servicu

Cancel

_Pr~~..) ~

10.13. bra

9. Nevezzk el a tulajdonsglistt Movi es. p l i st-nek. Ezzel elmentettk a tulajdonsglistt a projektnk Resources mappjba. Jelljk ki, s hozzuk ltre az elemek listjt a 10.14. bra alapjn. 10. Adjuk hozz a Rootviewcontroller.h fjlhoz a stsokat:
kvetkez

flkvren szedett uta-

@interface Rootviewcontroller : UITableviewcontroller { NSDictionary *movieTitles; NSArray *years;

247

10. fejezet : A Tablenzet hasznlata @property (nonatomic, retain) NSDictionary *movieTitles; @property (nonatomic, retain) NSArray *years; @ end
MovtM .phst - TableView
s.mula[Or - 3.0
Groups&files T nbleV'iew 0Hse:s

l Oebug

OwnMw

._

RootV"~wControUer. h

RootVtewController.m TableViewAppDelegate.h TableViewAppDf:legatt!: .m

OtMr Sources Rt sources


RootVtewController.xtb
M.J.inWindow.xb

w n.ble:View- lnfo.pli st
MovlH.phst

..,".
Olction.uy !
Array
ltem l
ltem 2
ttem]

lu t
jIIT' l

,.

St ring Sn'ing

M..,lcomx
The Peliun Brif:f

Stnng
Ar.-.y

The Humcane
2" Remember the Tltans
The Bone CollectDf"

T 200 l
ltem l

String
Stnng
Ar.-.y String Array String

ttem 2
T 2002

ttem l
Y 2004

" (.ohn Q.
Snemsl
M01n on Fire

lteml
ltem2

String

Out of TJme
Tr<ltning D.ily

lteml
ltem4 ttem S

Stnng
String

Ucenu to 1011

Stnng
Array

CMbon Copy
A Hand to Guide; Me

Y 2006
ttem l

String String Am,y


String Amy

ltem2 T 2007
lteml '9' 2008 ..... l
lttm l

lnstde Man

n ner
Oeja Vu
.~

lltf

String
String

The Grut DeNten


Amerian Gangner

10.14. bra

11. Adj uk hozz a Rootvi ewcontro l l er. m fjlhoz a stsokat:


#i mport "Rootview controller . h" impl @ ementation Rootviewcontroller @synthesize movieTitles, years; - (voi d) vi ewDidLoad {

kvetkez

flkvren szedett uta-

248

Szakaszok megjelenitse //---path to the property list file--NSString *path = [[NSBundle mainBundlel pathForResource:@"Movies" ofType:@"plist"]; //---load the list into the dictionary--NSDictionary *dic= [[NSDictionary alloc] initwithcontentsOfFile:path]; //---save the dictionary object to the property--self.movieTitles = dic; [dic release]; //---get all the keys in the dictionary object and sort them--NSArray *array = [[movieTitles allKeys] sortedArrayusingselector:@selector(compare:)]; //---save the keys in the years property--self.years = array; [super viewoidLoad];

- (NSinteger)numberofsectionsinTableview:(UITableview *)tableview { //---returns the number of years as the number of sections you want to see--return [years count];
}

ll customize the number of rows in the table view. - (NSinteger)tableview:(UITableview *)tableview numberOfRowsinSection:(NSinteger)section {
//---check the current year based on the section index--NSString *year = [years objectAtindex:section]; //---returns the movies in that year as an array--NSArray *moviesection = [movieTitles objectForKey:year]; //---return the number of movies for that year as the number of rows in that ll section --return [moviesection count];
}

ll customize the appearance of table view cells. - (UITableviewcell *)tableview:(UITableview *)tableview cellForRowAtindexPath:(NSindexPath *)indexPath {
static NSString *Cellidentifier = @"Cell"; UITableviewcell *cell = [tableview dequeueReusablecellwithidentifier:cellidentifier];

249

10. fejezet: A Tablenzet hasznlata if (cell == nil) { cell [[[UITableviewcell alloc] initWithstyle:UITableviewcellstyleoefault reuserdentifier:Cellrdentifier] autorelease];
}

ll configure the cell. //---get the year--NSString *year = [years objectAtindex:[indexPath section]]; //---get the list of movies for that year--NSArray *moviesection = [movieTitles objectForKey:year]; //---get the particular movie based on that row--cell.textLabel.text = [moviesection objectAtindex:[indexPath row]];
return cell;
}

- (NSString *)tableview:(UITableview *)tableview titleForHeaderrnsection:(NSinteger)section { //---get the year as the section header--NSString *year = [years objectAtindex:section]; return year;
}

- (void)dealloc { [years release]; [movieTitles release]; [super dea ll oc] ;

@end

12.

yomjuk meg a Command-R gombokat az alkalmazs tesztelshez. Lthat, hogy a filmeket a megjelensk ve alapjn rendeztk szakaszokba (lsd a 10.15. brt). A Table nzet stlust is megvltoztathatjuk, ha rkattintunk a Tableview elemre az Interface Builderben, majd Grouped-ra mdostjuk a Style tulajdonsgot az Attributes Inspector ablakban (lsd a 10.16. brt). Ha jrafuttatjuk az alkalmazst, lthat, hogyan vltozott meg a Table nzet megjelense (lsd a 10.17. brt).

10.15. bra

A programkd [Ta bk View.ifp] fjl a !Vrox.com oldalrl tlthel le.

250

Szakaszok megjelentse

California Cupertino Glendale Los Angeles


Stn,...on Faoter
Se.puator , sang'-: ~

-g
---",

l Section Indu Row Counc

-:-

New York Aiban y Buffalo


Sc;;--;-~

Allow Setealon WtHie Edtting

Show Seltmn On Touch

Sc.roll Style

Dt.f.auk
HonzontOll

Sc.rollen

IS!! Vtnico~l

Scrolling

En~bled

New York City


Stn..iiOn

O O
Footer
Zoom

P.;r.ging En,;r,bled

Dirtetton lock

~ Bounce ScroU

O Alw.Jys Bounce Honzon1~ty O Atwa.ys Bounce Vertic.alty

~'='~~
Min

Mu

O Bounct: Zoom
Touch

E Del~ Content Touchu


~ Cancellabit Content Touchu

10.16. bra

Hogyan mkdik?
A feladat elg sok fogalmat tartalmaz.
Elszr ltrehoztunk egy tulajdonsglistt a projektben. A tulajdonsglistt kulcs/ rtk prokkal tltttk fel. Lnyegben a 10.18. brnak megfelelerr jelenitettk meg a tulajdonsglistban trolt kulcs/ rtk proka t. Minden egyes Irules egy vet jelent, a kulcsokhoz tartoz rtkek pedig az abban az vben megjelent filmeket. A tulajdonsglistban trolt rtkeket jelen~k meg a Table nzetben. Kt tulajdonsgot hozunk ltre a Rootvi ewcontroll er osztlyban: a movi eTi t l es-t (amely egy NSDi cti onary objektum) s a years-t (amely egy NSArray objektum). A nzet betltse utn elszr a tulajdonsglistt keressk meg, ezt betl~k az N i c ti onary objekSD tumba, majd az sszes vet az NSArray objektumba:

:wuo
Malcolm X
The PeUcan Brief The Hurr1une
21''

10.17. bra

251

10. fejezet: A Tablenzet hasznlata


- (void)viewoidLoad { //---path to the property list file--NSString *path = [[NSBundle mainBundleJ pathForResource:@"Movies" ofType:@"plist"]; //---load the list into the dictionary--NSDictionary *dic= [[NSDictionary alloc] initWithContentsOfFile:path]; //---save the dictionary object to the property--self.movieTitles = dic; [dic release]; //---get all the keys in the dictionary object and sort them--NSArray *array = [[movieTitles allKeys] sortedArrayusingSelector:@selector(compare:)]; //---save the keys in the years property--self.years = array; [super viewoidLoad];

Kulcs
2000

rtk

"Ma colm x. "The Pe'1can Bner. "The Hurricane"


"Remember the

2001 200 2
2004 2006

T ans". "The Bone Col ector"

John Q" "Ma n on Fre". "Out of Time". Traimng Da y", "l.lcense to K1 1". "Carbon Copy"
"A Har d to GUide Me". "lns1de Man

2007 2008
10.18. bra

"Oeja Vu" "The Great Debaters". AmeriCan Gargster"

Mivel a Table nzet most szakaszokban jelerti meg a filmlistt, ahol minden szakasz egy vet jelent, tudatnunk kell a Table nzettel, hogy mennyi szakaszunk van. Ehhez a numberofsectionsinTableview: metdust kell megvalstanunk
- (NSinteger)numberofsectionsinTableview:(UITableview *)tableview { //--- returns the number of years as the number of sections you want to see--return [years count];

252

Szakaszok megjelentse Miutn a T able nzet tisztban van vele, h ogy m ennyi szakaszt kell m egjelertenie, azt is meg kell m ondanunk, mennyi sort kell m egjelerteni szakaszonknt. Ez t az info rmci t a t ablevi ew: numberofRowsrnsecti on : m etd us m egvalstsval tudjuk tovbbadni:

ll customize the number of rows in the table view . - (NSinteger)tableView:(UITableview *)tableview numberOfRowsrnsection:(NSinteger) section {
//-- -check the current year based on the section index--NSString *year; [years objectAtindex:section]; //- - -returns the movies in that year as an array--NSArray *moviesection; [movieTitles objectForKey:year]; //---return the number of movies for that year as the number of rows in that ll section - -return [moviesection count];

Az egyes szakaszo kban


Path: m etdust tumbl emeljk ki:

lv

film ek megjelertsh ez a tablevi ew: ce ll ForRowAtrndexm egfelel

val s~uk

meg, a

filmcmeket p edig az NSDi ct i onary o bjek-

ll customize the appearance of table view cells. - (UITableviewcell *)tableview:(UITableview *)tableview cellForRowAtindexPath:(NSindexPath *)indexPath {
stat i c NSStri ng *Ce ll Identifier ; @"ce ll"; UITableviewcell *cell ; [tableview dequeueReusablecellwithrdentifier:cellrdentifier]; if (cell ;; nil) { cell ; [[[UITableviewcell alloc] initWithstyle:UITableviewcellstyleoefault reuserdentifier:Cellrdentifier] autorelease];

ll Configure the cell. //- --get the year--NSString *year ; [years objectAtindex: [indexPath section]);
//---get the list of movies for that year- -NSArray *moviesection; [movieTitles objectForKey:year]; //- - -get the particular movie based on that row--cell .text ; [moviesection objectAtindex: [indexPath row]]; re tu r n ce ll ;

253

10. fejezet: A Tablenzet hasznlata Vgl a tablevi ew: ti t l eForHeaderrnsecti on: metdus megvalstsval keressk vissza az egyes szakaszokhoz tartoz veket s fejlceket: - (NSString *)tabl eview:(UITableview *)tableview titleForHeaderinSection:(NSi nteger)section { //---get the year as the section header--NSString *yea r = [years objectAtindex:section]; return year;

Indexels
A filmlista elg rvid, gy a vgiggrgetse nem okoz tl nagy gondot. m kpzeljk el, hogy a lista 100 v 1O ezer filmcm t tartalmazza. Ebben az esetben a lista vgiggrgetse hossz idbe telhet. A Table nzet egyik nagyon hasznos szaigitatsa a nzet jobb szln megjelenthet index. Az A-Z index pldul a Contacts (kapcsolatok) listban tallhat (lsd a 10.19. brt). Ahhoz, hogy hozzadjunk egy indexlistt a Table nzetnkhz, a sectionindexTitlesForTableview: metdust kell megvalstanunk, s azt a tmbt visszaadnunk, amelyik a szakaszok fejlceit tartalmazza, jelen esetben a years tmbt:
- (NSArray *)sectionindexTitlesForTableview :(UITablevi ew *)tableview re tu r n yea rs;
}

Megjegyzs Az alkalmazs futtatsa eltt lltsuk vissza a Table nzet stlust

Pl ai n-re. Ha Grouped stlusra lltottuk, az index tfedsben lesz a Tab le nzet elrendezsvel.

A 10.20. brn a Tablenzet jobb szln

megjelen

index lthat.

Keressi

lehetsg

A Table nzet egyik leggyakrabban alkalmazott funkcija a keress a nzet elemei kztt. A Contacts alkalmazs keressvja pldul mindig fell lthat (lsd a 10.21. brt) a kapcsolatok keressnek egyszerstse rdekben. A kvetkez gyakorlati rszben megnzzk, hogyan adjunk hozz keressfunkcit a Table nzethez.

254

Szakaszok megjelentse

Wei-Meng Lee Margaret Sim Ronaid Tan Julie Yap

. . . . ' .
u
L

'
l

'

o
T

u
y
y

10.19. bra

10.20. bra

Cupertino Glendale Los Angeles Palo Alto San Diego San Franclsco
Wel-Mang Lee

Santa Clara

Margarel Sim
Ronaid Tan

10.21. bra

10.22. bra

255

10. fejezet: A Tablenzet hasznlata


Keressv

hozzadsa a Table nzethez

1. Az

elz

rszben ltrehozott projekt segtsgvel hzzunk t egy Search Bar a Table nzetbe az Interface Builderben (lsd a 10.22. brt).

elemet a

Libratybl

2. Kattintsunk jobb gombbal a Search Bar elemre, s a de l egate-et kapcsoljuk ssze a File's Owner elemmel (lsd a 10.23. brt) .
RootVIewController xb
[ID
\l~ewModt

Table View

[....~-

j.

'

J.:

~,u~

R~lerc~c

"Y Outl,.,s

>N ... ~t~ ro n,.~ J o~~

Glendale Los Angeles Palo Alto San Diego San Francisco Santa Clara

10.23. bra

Adjuk hozz a Rootvi ewcontro ll er. h fjlhoz az albbi, flkvrerr szedett utast sokat: @inte rface Rootviewcontroller <UISearchBaroelegate>{ NSDictionary *movieTitles; NSArray *yea rs; /1---search--IBOutlet UISearchBar *searchBar; BOOL issearchon; BOOL canselectRow; NSMutableArray *listOfMovies; NSMutableArray *searchResult;
}

UITableviewcontroller

256

Szakaszok megjelentse

@ property (nonatomic, retain) NSDictionary *movieTitles; @p roperty (nonatomic , retain) NSArray *years ; / 1---search--@property (nonatomic, retain) UISearchBar *searchBar; - (void) donesearching: (id)sender; - (void) searchMoviesTableview; @end

Megjegyzs Az elz utasts hozzadsra nincs szksg, ha a delegltat


sszekapcsoltuk a File's Owner elemmel az Interface Builderben.

3. Az Interface Builderben , a Con trol

billen ty

nyomva tartsval kattintsunk, s hz-

zuk r a File's Owner elem et a Search Bar elemre, majd vlasszuk a searchBar-t.

4. A djuk hozz a Rootviewcontroller.m fj lhoz a


stsokat: #i mport "Rootviewcontroller.h" @i mplementation Rootviewcontroller @synthesize movieTitles , years; @synthesize searchBar; - (void)viewoidLoad {

kvetkez

flkvren szedett uta-

NSString *path = [[NSBundle mainBundleJ pathForResource :@"Movies" ofType: @ "plist"]; NSDictionary *dic= [[NSDictionary alloc] ini tWi t hcontentsofFile : path]; self.movi eTitles = dic; NSArray *array = [[movieTitles all K eys] sortedArrayusingselector: @ selector (compare: ) ]; self.years = array ; [dic release]; //---display the searchbar--self.tableview.tableHeaderview = searchBar; searchBar.autocorrectionType = UITextAutocorrectionTypeYes; //---copy all the movie titles in the dictionary into the //listOfMovies array-listOfMovies = [[NSMutableArray alloc] init]; for (NSString *year in array) //---get all the years--{ //---get all the movies for a particular year--NSArray *movies = [movieTitles objectForKey:year];

257

10. fejezet: A Tablenzet hasznlata


for (NSString *title in movies)
{

[listofMovies addobject:title];
} }

//---used for staring the search result--searchResult = [[NSMutableArray alloc] init]; issearchon = NO; canselectRow = YES; [super viewoidLoad];

//---fired when the user taps on the searchbar--- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { issearchon = YES ; canselectRow = NO; self . tableview . scrollEnabled = NO; //- --add the Done button at the top--self.navigationrtem.rightBarButtonrtem = [[[UIBarButtonrtem alloc] initWithBarButtonSystemrtem:UIBarButtonsystemitemDone target:self action :@selector(donesearching:)] autorelease];
}

//---done with the searching- -- (void) donesearching:(id)sender { issearchon =NO; canselectRow = YES; self.tableview.scrollEnabled =YES; self.navigationitem.rightBarButtonitem / /---hides the keyboard--[searchBar resignFirstResponder]; //---refresh the Tableview--[self.tableview reloadoata];
}

nil;

//-- - fired when the user types something into the searchbar--- (void)searchBar : (ursearchBar *)searchBar textDidchange:(NSString *)searchText { //---if there is something to search for--if ([searchText length] > 0) { issearchon = YES; canselectRow = YES; self.tableview.scrollEnabled YES; [self searchMoviesTableview];
}

258

Szakaszok megjelenitse else { 11---nothing to search--issearchon = NO; canselectRow = NO; self.tableview.scrollEnabled =NO; } [self.tableview reloadoata];

11---performs the searching using the array of movies--- (void) searchMoviesTableview { 11---clears the search result--[searchResult removeAllobjects]; for (NSString *str in listOfMovies) { NSRange titleResultsRange = [str rangeofstring:searchBar.text options:NSCasernsensitivesearch]; if (titleResultsRange.length >O) [searchResult addobject:str];
}

11---fired when the user taps the Search button on the keyboard--- (void)searchBarsearchButtonclicked:(UISearchBar *)searchBar { [self searchMoviesTableview]; } - (NSinteger)numberofsectionsinTableview:(UITableview *)tableview { if (i ssearchon) return l; else return [years count];

ll Customize the number of rows in the table view. - (NSinteger)tableview:(UITableview *)tableview numberOfRowsrnsection:(NSinteger)section { if (issearchon) { return [searchResult count]; } else { NSString *year = [years objectAtindex:section]; NSArray *moviesection = [movieTitles objectForKey:year]; return [moviesection count];
}
}

ll customize the appearance of table view cells. - (UITableviewcell *)tableview:(UITableview *)tableview cellForRowAtindexPath:(NSindexPath *)indexPath {

259

10. fejezet: A Tablenzet hasznlata


static NSString *Cellrdentifier =@"Cell"; UITableviewcell *cell = [tableview dequeueReusablecellwithidentifier:cellrdentifier]; if (cell == nil) { cell = [[[UITableviewcell alloc] initwithStyle:UITableviewcellstyleoefault reuserdentifier:cellrdentifier] autorelease];

ll Configure the cell. if (issearchon) { NSString *cellvalue [searchResult objectAtindex:indexPath.row]; cell.textlabel.text cellvalue; } else { NSString *year = [years objectAtindex: [indexPath section]]; NSArray *moviesection = [movieTitles objectForKey:year]; cell.textlabel .text= [moviesection objectAtindex:[indexPath row]];
}

re tu r n ce ll ;
}

- (NSString *) tableview:(UITableview *)tableview titleForHeaderrnsection:(NSinteger)section { NSString *year = [years objectAtindex:section]; if (issearchon) return nil; else return year;

- (NSArray *) sectionindexTitlesForTableview:(UITableview *)tableview { if (issearchon) return ni l; else return years;

11---fired before a row is selected--- (NSindexPath *)tableview :(UITableview *)theTableview willselectRowAtindexPath: (NSindexPath *)indexPath { if (canselectRow) return indexPath; else return nil;

- (void)didReceiveMemoryWarning { ll Releases the view if it doesn't have a superview. [super didReceiveMemorywarning];

ll Release any cached data, images, etc that aren't in use.


}

260

Szakaszok megjelentse

- (void)viewoidunload { ll Release anything that can be recreated in viewDidLoad or on demand. ll e.g. self.myoutlet ~nil;

- (void)dealloc { [years re l eas e] ; [movieTitles release]; [searchBar release]; [super dealloc]; @e nd

5. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatorban teszteljk 6. rintsk meg a Search Bart, s megjelenik a billentyzet (lsd a 10.24. brt). A kvetkezket figyelhetjk meg:

rs kzben a Table nzet megjderti azokat a filmeket, amelyek cme tartalmazza a bert karaktereket. rintsk meg a keressi eredmnyt a kivlasztshoz.

ori
The Bone Colleetor
Man on Fire Carbon Copy

10.24. bra

261

10. fejezet: A Tablenzet hasznlata

Amikor megjelenik a billentyzet, s a Search Bar nem tartalmaz szveget, a Table nzetben az eredeti lista lthat, s nem lehet keresni a sorok kztt. Ha rkattintunk a Done gombra, deti lista.
eltnik

billentyzet,

s megjelenik az ere-

Hogyan mkdik?
A kvetkezkben megnzzk a rszleteket. lyet sszekapcsoltunk a Search Bar elemmel:
IBOutlet ursearchBar *searchBar; Ezutn kt logikai vltozt definiltunk, gy nyomon kvethetjk, hogy a keress folyamatban van-e, s a felhasznl kivlaszthatja-e a Table nzet sorait: BOOL issearchon; BOOL canselectRow; Ezutn kt NSMutab leArray objektumot definiltunk, az egyikben a filmlistt trol juk, a msikban pedig ideiglenesen a keressi eredmnyt: NSMutableArray *listOfMovies; NSMutableArray *searchResult;
Elszr

egy Icivezetst adtunk hozz, ame-

A nzet els betltsekor elszr trstjuk a Search Bar elemet s a Table nzetet, majd tmsoljuk a teljes filmcmlistt az NSDictionary objektumbl az NSMutableArray-be:
//---display the searchbar--self.tableview.tableHeaderview = searchBar; searchBar.autocorrectionType = UITextAutocorrectionTypeYes; //---copy all the movie titles in the dictionary into the //listOfMovies array--listofMovies = [[NSMutableArray alloc] init]; for (NSString *year in array) //---get all the years--{

//---get all the movies for a particular year--NSArray *movies = [movieTitles objectForKey:year]; for (NSString *title in movies)
{

[listOfMovies addobject:title];
}

//---used for staring the search result--searchResult = [[NSMutableArray alloc] init]; issearchon =NO; canselectRow = YES;

262

Szakaszok megjelentse

Arnikor a felliasznl megrinti a Search Bar elemet, a searchBarTextDi dBe gi nEdi ti ng: esemny (a ursearchBaroel egate protokollban definilt metdusok egyike) kvetkezik be. Ebben a metdusban egy Done gombot adunk hozz a kperny jobb fels sarkhoz. Arnikor rkattintunk a Done gombra, a donesearchi ng: metdust lvjuk (amelyet ezutn definilunk): //---fired when the user taps on the searchbar--- (void)searchBarTextDidBeginEditing:(ursearchBar *)searchBar { issearchon = YES; canselectRow = NO; self.tableview.scrollEnabled = NO; //---add the Done button at the top--self.navigationitem.rightBarButtonitem = [[[UIBarButtonitem alloc] initWithBarButtonSystemrtem:UIBarButtonsystemitemDone target:self action:@selector(donesearching:)] autorelease];

A donesearchi ng: metdus hatsra a Search Bar feladja az els reagl llapott (ezrt elrejti a billentyzetet). Ezalatt jra betltjk a Tab le nzetet a re l oadoata metdus lvsval. Ennek hatsra a Table nzet klnbz esemnyei jra bekvetkeznek:
//---done with the searching--- (void) donesearching:(id)sender { issearchon = NO; canselectRow = YES; self.tableview.scrollEnabled =YES; self.navigationitem.rightBarButtonitem =nil; //---hides the keyboard--[searchBar resignFirstResponder]; //---refresh the Tableview--[self.tableView reloadoata];

Amint a felliasznl ber valamit a

keress vba,

a searchBar: textoi dchange: esemny az

sszes bert karaktene bekvetkezik. Ekkor, ha a keressvban legalbb egy karakter van, lvjuk a searchMovi esTabl evi ew metdust (amelyet ezutn definilunk): //---fired when the user types something into the searchbar--- (void)searchBar:(UISearchBar *)searchBar textDidchange:(NSString *)searchText { //---if thereis something to search for--if ([searchText length] > 0) { issearchon =YES; canselectRow = YES;

263

10. fejezet: A Tablenzet hasznlata


self.tableview.scrollEnabled [self searchMoviesTableview]; else { //---nothing to search--issearchon ~ NO; canselectRow ~ NO; self.tableview.scrollEnabled
}

YES;

NO;

[self.tableview reloadoata];
}

A l istOfMovi es tmbben val keresst a searchMovi esTab levi ew metdus hajtja vgre. Az NSStri ng osztly rangeofstri ng: options: metdusa rvn egy nem kis/ nagy bet rzkeny keresst hajtunk vgre az sszes flimcm kztt a megadott sztring alapjn. A keressi eredmny egy NSRange objektum, amely tartalmazza a keressi sztring helyt s hosszt a keressi eredmnysztringben. Ha a hossza nagyobb, mint nulla, ez azt jelenti, hogy a keress eredmnyes volt, az eredmnyt pedig hozzadjuk a searchResult tmbhz: //---performs the searching using the array of movies--- (void) searchMoviesTableview { //---clears the search result--[searchResult removeAllobjects]; for (NSString *str in listOfMovies) NSRange titleResultsRange ~ [str rangeofstring:searchBar.text options:NSCaseinsensitivesearch]; if (titleResultsRange.length >O) [searchResult addobject:str];
}

Arnikor a felhasznl megrinti a Search gombot (a billentyzeten), hvjuk a searchMovi esTabl evi ew metdust: //---fired when the user taps the search button on the keyboard--- (void)searchBarsearchButtonclicked:(UISearchBar *)searchBar { [self searchMoviesTableview];
}

A tbbi metdus egyrtelm. Ha a keress aktv (ahogy azt az i ssearchon vltoz determinlta), megjelentjk a searchResul t tmbben trolt cmek listjt. Ha nem, akkor a teljes filmlistt jelentjk meg.

264

Szakaszok megjelentse

Rszletek s pipk
Mivel a felhasznJk gyakran jellik ki a Table nzetek sorait, hogy tovbbi rszleteket nzzenek meg, a Table nzet sorai gyakran tartalmaznak olyan kpeket, amelyekben egy nyl vagy egy pipa lthat. A 10.25. bra ezekre a nyilakramutat pldt. Hrom tipus kpet jelenthetnk meg:
rszletez

gomb,

pipa,
rszletez jell.

Egy rszletez vagy egy pipa megjelentshez szrjuk be a kvetkez, flkvren szedett utastst a tablevi ew: ce ll ForRowAtrndexPath: esemnybe:
- (UITableviewcell *)tableview: (UITableview *) tableview cellForRowAtindexPath: (NSindexPath *)indexPath { stat i c NSStri ng *Ce ll rdenti fi er = @"Ce ll";
10.25. bra

UITableviewcell *cell = [tableview dequeueReusablecellwithrdentifier:cellrdentifier]; if (cell == nil) { cell = [[[UITableviewcell alloc] initWithStyle:UITableviewcellStyleoefault reuseidentifier:cellidentifier] autorelease];

ll Configure the cell. if (issearchon) { NSString *cel lvalue = [searchResult objectAtindex:indexPath.row]; cell.text = cellvalue; } else { NSString *year = [years objectAtindex:[indexPath section]]; NSArray *moviesection = [movieTitles objectForKey:year]; cell .text= [moviesection objectAtindex:[indexPath row]]; } cell.accessoryType = UITableviewcellAccessoryDetailDisclosureButton;
re tu rn ce ll ;

265

10. fejezet: A Tablenzet hasznlata

kvetkez

llandkat hasznlhatjuk az accessoryType tulajdonsg rtkekn t:

UITableviewcellAccessoryoetailDisclosureButton UITableviewcellAccessorycheckmark UITableviewcellAccessoryDisclosureindicator


elz

A 10. 26. bra az

hrom llandhoz kapcsold kppusokat mutatja be.

The Pelleen Brfef

~ ~

The Humcane

Remember the ntans


The Bone Colloetor

~ ~

10.26. bra

A hrom

kppus kzi csak a UITableviewcellAccessoryDetailoisclosuresutton kpes

kezelni a felhasznli rints esemnyt. (A msik kt kpet csak megjelentsre hasznljuk.) Annak az esemnynek a kezelshez, amelyet a rszletezgomb megrintse vlt ki, a tablevi ew: accessoryButtonTappedForRoiWii thindexPath: metdust kell megvalstanunk - (void)tableview:(UITableview *)tableview accessoryButtonTappedForRoWWithindexPath:(NSindexPath *)indexPath { //---i nsert code here--// e.g. navigate to another view to display detailed information, etc

A 10.27. bra azt a kt

klnbz

esemnyt mutatja be, amelyek akkor kvetkeznek be,


rszletezgombot.

amikor a felhasznl megrinti a cella tartalmt, illetve a

266

Szakaszok megjelenitse

(Q
~

2000)
-

Malcolm X

t-The Pelica ~ Brief The Hurric ~ne


j

l ~~
~ t~

12001 200 2
-'-..:--"

t~
ll

1--J!Ji
t a bleVte w:dtdSelectRowAtindexPath:

tableVlew:occessoryButtonToppedForRoWWithindexPo th:

10.27. bra

ltalban a rszletezgombot hasznljuk a kijellt sor rszleteinek a megjelertsre.

SSZEFOGLALS
Ebben a fejezetben ttekintettk a Table nzetet s a bellitsi lehetsgeit az elemek klnfle megjelemtsi formihoz. Azt is megvizsgltuk, hogyan valsrsunk meg a Table nzet keressi funkcijt, amely a vals gyakorlatban hasznlt alkalmazsok lnyeges rsze.

1. Nevezzk meg azt a kt protokollt, amelyeknek meg kell felelnik az nek a T able nzet hasznlatakor, rviden ismertetve a mkdsket.

elemvezrlnk

2. Melyik metdust kell megvalstar egy index hozzadshoz a Table nzetben? 3. Nevezzk meg a hrom rendelkezsnkre ll a felhas znli rints esemnyt?
rszletez-

s pipakpet. Melyik kezeli

A FEJEZET TUDNIVALI
Tma
Elemek hozzadsa a Table nzethez A Table nzet soraiban a felhasznJk ltali Icijells engedlyezse Kpek hozzadsa a Table nzet soraihoz

Alapelvek
Kezeljk a UITabl evi ewoatasource protokoll klnbz esemnyeit. Kezeljk a U !Tab levi e wo e l eg a te protokoll kiilnbz esemnyeit.

Hasznljuk a UITab levi ewce ll osztly image tulajdonsgt, s felel tessk meg egy kpet tartalmaz Ulimage osztly egy pldnyvaL

267

10. fejezet: A Tablenzet hasznlata

Tma
Tulajdonsglista hasznlata a Table nzetben

Alapelvek
A
kvetkez

kdrszlet segtsgvel keressk meg a tulajdonsglistr:

NSString *path = [[NSBundle mainBundleJ pathForResource:@"Movies" ofType:@"plist"]; Majd az SDictionary s az NSArray objektumok kombincija segtsgvel keressk vissza a tulajdonsglistban trolt kulcs/ rtk proka t.

Elemek szakaszokba csoportostsa a Table nzetben

Valstsuk meg a

kvetkez

metdusokat

numberofsectionsinTableview: tableview:numberOfRowsrnsection : tablevi ew: ti t l eForHeaderrnsecti on:

Index hozzadsa a Table nzethez Rszletezk s pipk hozzadsa a Table nzet soraihoz

Valstsuk meg a se ct ionindexTit l es ForTablevi ew: metdust. Egy UIT ab l ev i e wc e ll objektum accesso ryType tulajdonsgnak adjuk az egyik rtket az albbiak kzl: UITableviewcellAccessoryoetailoisclosureButton UITableviewcellAccessorycheckmark UITableviewcellAccessoryoisclosurerndicator

Keress megvalstsa a Table nzetben

Hasznljuk a Search Bar elemet, s kezeljk a UISearchBaroe l eg a te protokoll klnbz esemnyeit.

268

Alkalmazsbellitsok
A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan adhatunk hozz alkalmazsbellitsokat az alkalmazsunkhoz? Hogyan Hogyan
rhe~k

el programozottan a belltsok rtkeit? az alkalmazsunk bellitsnak az rtkeit?

trlhe~k

A viszonylag tapasztalt Mac OS X felhasznlk valsznleg jratosak az alkalmazspreferencikban. Majdnem minden Mac OS X alkalmazsnak van alkalmazsspecifikus belltsa, amely az alkalmazs megjelensnek s viselkedsnek kialaktsra szolgl. Ezek a bellicisok az alkalmazspriferencik. Az iPhone opercis rendszerben is rendelkeznek az alkalmazsok alkalmazspreferencikkal. m a Mac OS X alkalmazsokkal ellenttben, amelynek az alkalmazspreferencii az alkalmazs szerves rszt kpezik, az iPhone-preferencikat egy Settings (belltsok) nev alkalmazs kzpontilag irnytja (lsd a 11.1. brt). A Settings alkalmazs foldala jeleniti meg a rendszeralkalmazsok, valamint a kls alkalmazsok preferenciit. Brmelyik elem megrintsvel egy msik oldalra jutunk, ahol az alkalmazs preferenciit llitha~uk be. Ebben a fejezetben megvizsgljuk, hogyan adhatunk hozz alkalmazspreferencikat az alkalmazsunkhoz, s hogyan mdostha~uk programozottan ket futsidben.

11. fejezet: Alkalmazsbelltsok

Photo a

ApplicationSettinga
Utlllty4pp

11.1. bra

Choose:

il

te.mplate. for your new fl le.:

IPI'Ione OS Coco.J Touch Code S1gnulg


Cl~nu
S et ung~

Bundle

User

lnttrfo~cH

MacOS X

Applc:ript

C ind C++
C.Jrbon

~ s cr l ption

Bund Ir. for spec1fy1ng n iPhone Appliution's stttings .

Purt,J.i~

Pure Python

Ru by
Sync ServicH

Prevous

11.2. bra

270

Alkalmazsprefe re ncik ltrehozsa

Alkalmazspreferencik ltrehozsa
Az alkalmazspreferencik lrrehozsa az iPhone-alkalmazsokhoz nagyon egyszer. Tartalmazza egy Settings Buncile (bellitscsomag) elnevezs forrs hozzadst a projektnkhz, egy tulajdonsglista-fjl konfigurlst, valamint az alkalmazsunk teleptst. Ha teleptettk az alkalmazsunkat, az alkalmazspreferencik automatikusan trrejnnek a Settings alkalmazsban.
~()!')
L

Root.plist - AppllcationSettings

Stmu~tor: 3.0

l [)e~g

Q..

g Matchtng

o..-..
Groups& fliH ~- Apphu.bonSetungs MamView

s..rdt
"\Code
O

Flipside View ~ Application Delegate ll>- Other Sourcu


Resources Frameworks

Products

Erron and Warn1ngs


T

Q. Find Resulu

~L:!l Bookmvks

Pre.fe.re.nce.Spedflers tum l

Array
Dlcttonary

~. Implementallon F1les . . . Nil Files

e ProJect Symbob

SCM

TYJI<
Ti tie

Stnng ,Stnng
Dictionary
,String

PSGroupSpeofler
Group

!tem 2

Tvo<
Titfe

PSTextfieldSpecifler
Name

Stnng

v
DefaultValue

Stnng Stnng 8oo lun


1

name_preference

lsSecure
~ybo.J.rdType

o
Alphob<t
None

Stnng Stnng
Stnng

Autoapn01.1izatonType
AutocorrectionType.

No

Y lttm 3

Oicttonary

TYJI
Tit l<

Stnng Stnng Stnng 8ooinn Diction.J.ry Stnng Strmg Number Number Number String Stnng

PSTogglwitchSpec1fier En.J.bled en.J.bled_preference

v
OefauttValue "Y item 4

~
PSSiiderSpeofie.r slde:r_prderence

Typ

v
Oef.J.ultV.J.Iue MinimumV.:tlue M.uumumValur: MmimumValuelm.J.ge Max1mumValuelm.J.ge

os

11.3. bra

A kvetkez gyakorlati rsz bemutatja, hogyan adhatunk hozz alkalmazspreferencit az iPhone-alkalmazsprojektnkhz az Xcode-ban.

271

11. fejezet: Alkalmazsbelltsok


Alkalmazspreferencik hozzadsa

l. Az Xcode segtsgvel hozzunk ltre egy j Utility Application projektet, s nevezzk Appl i cationsetti ngs-nek.
2. Az Xcode-ban kattintsunk jobb gombbal a projekt nevre, s adjunk hozz egy j fjlt. Jelljk ki a Resources template (erforrssablon) kategrit, s kattintsunk a Settings Bundle elemre (lsd a 11.2. brt). Majd kattintsunk a ext (kvetkez) gombra. 3. Amikor meg kell adnunk a fjl nevt, hasznljuk a setti ngs. bundl e ltal megadott alaprtelmezett nevet, s kattintsunk a Finish (befejezs) gombra. 4. A setti ngs. bund l e elem a projektnk rszv vlik (lsd a 11.3. brt) . Kattintsunk r a fjlra, s nzzk meg a tartalmt az alaprtelmezett Property List szerkesztvel.

5.

yomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljk. Ha az alkalmazs betltdtt, nyomjuk meg a Home gombot, hogy visszatrjnk az iPhone f kpernyjhez. rintsk meg a Settings alkalmazst. Ekkor egy j, ApplicationSettings nev belltsbejegyzst lthatunk (lsd a
11.4. brt).

ApplicUonSettlngs

11.4. bra

272

Alkalmazspreferencik ltrehozsa

6. Ha megrin~k az ApplicationSetting bejegyzst, lthatjuk az alaprtelmezetten ltrehozott belltsokat (lsd a 11.5. brt).

Hogyan mkdik?
Egyetlen sor kdolsa nlkl beilleszthetnk alkalmazspreferencikat az alkalmazsunkba. Ennek titka a setti ngs. bund l e fjl, amelyet a projektnkhz adtunk. Ez kt fjlt tartalmaz: Root. pl i st s Root.strings. A Root.plist fjl sztrobjekturnok (!rules/rtk prok) gyjtemnyt tartalmaz XMLfjl. Ezek a kulcs/ rtk prok bekerlnek a preferencik azon bejegyzseibe, amelyek a Settings alkalmazsban jelennek meg. A Root. pl i st fjlban elfordul klnbz kulcsok hasznlatt rdemes megismerni. Kt gykrszint kulcs van a Root. pl i st fjlban, ezek a kvetkezk: St ri ngsTab l e, amely ehhez a fjlhoz tartoz sztringfjl nevt tartalmazza. Ebben az esetben ez a Root.strings.
r.

Name Enabled

11.5. bra

Preferencespecifiers, amely Array-tpus, s sztrak tmbjt tartalmazza, ennek minden eleme egy-egy preferencihoz tartoz informci.

Megjegyzs A Root.plist fjlban a kulcs/rtk pr kisbet/nagybet rzkeny. Ezrt vatosnak kell lennnk, amikor a bejegyzseket mdostjuk. Egy elrs mkdskptelen alkalmazst eredmnyezhet.

Minden preferencit egy elem jelert meg (Preferencespecifiers), pldulItem l, nem 2, nem 3 s gy tovbb. Minden elem rendelkezik egy Type kulccsal, amely a trolt adat tpust adja meg. Ez a 11.1. tblzat szerint a kvetkezk egyike lehet:
11.1 tblzat. A Preference Specifier elemek s hasznlatuk

Elem tpusa

Lers
Szvegmez-preferencia. Egy lehetsges cmet s egy szerkeszthet szvegmezt jelent meg. Olyan preferencikhoz hasznljuk ezt a pust, amelyek a felhasznltl vrjk egy egyedi szeringrtk megadst.

PSTextFie ldSpecifier

273

11. fejezet: Alkalmazsbelltsok

Elem tpusa
PSTitlevaluespecifier PSToggleswitchspecifier PSSliderspecifier

Lers
Csak olvashat sztringpreferencia. Preferenciartkek forrnzott szvegknt trtn megjelentsre hasznljuk ezt a tpus t. TolkapcsoJs preferencia. Olyan preferencik konfigurlshoz hasznljuk ezt a tpust, amelyek csak egy vagy kt rtket vehemek fel. Csszkapreferencia. rtktartomnyokat megjelent preferencikhoz hasznljuk ezt a tpus t. A tpus rtke egy vals szm, ltalunk megadott minimurn s maximum rtkekkel.
Tbbrtk

PSMultivaluespecifier PSGroupSpecifier PSChildPanespecifier

preferencia. Klcsnsen kizr rtkek tmogatsra szolgl preferencikhoz hasznljuk ezt a tpus t. Csoportelem-preferencia. A csoporttpus lehetv teszi, hogy a preferencikat csoportokba szervezzk egy oldalon. Gyerrnektbla-preferencia. Ez a tpus a preferencikat egy j oldalhoz linkeli.

Minden Preferencespeci fi ers kulcs tartalmazza a felhasznlhat alkulesoknak a listjt.

A PSTextFi e l dspeci fi er kulcshoz pldul a

kvetkez

kulcsokat

hasznlha~uk:

Type,

Title, Key, oefaultvalue, rssecure, KeyBoardType, AutocapitalizationType s Autocorrecti onType. Minden kulcshoz bellthatjuk a megfelel rtk t.

Megjegyzs Az egyes kulcsok hasznlatval kapcsolatban tovbbi informcit


az Apple "Settings Application Scherna Reference" (Settings alkalmazs smjnak referencija) dokumentcijban tallunk. A legknnyebben gy talljuk meg, ha a weben rkeresnk a dokumentum eimre. A dokumentum URL-je:

http://developer . apple . com/iPhone/library/documentation/PreferenceSettings/Conceptual/SettingsApplicationschemaReference/Introduction/ Introduction.html.

zzk meg kzelebbrl a Root. pl i st fjlt, pldul az rt em 3 elemet.

gy kulc s van

alatta: Type, Title, Key s oefaultvalue. A Type kulcs adja meg a troland informci tpust. Ez jelen esetben a PSToggleswitchspecifier, s ez azt jelenti, hogy vizulisan

O / OFF kapcsolknt jelenik meg. A Title kulcs az elemhez megj elen szveget adja meg (rtem 3). A Key kulcs az azonost, amely ezt a kulcsot egyedi mdon hatrozza
meg, gy az alkalmazsban programozottan kapha~uk meg az elem rtkt. Vgl a oefaultvalue kulcs az elem alaprtelmezett rtkt adja meg . Jelen esetben ez be van jellve, gy az rtke O

kvetkez

gyakorlati rszben mdostjuk a Root. pl i st fjlt, hogy felhasznli hite-

lests tro lsra hasznlhassuk Ez akkor hasznos, ha olyan alkalmazst runk, amelynl a felhasznlk bejelentkezsre van szksg a szerverhez. Amikor els alkalommal hasznlja a felhasznl az alkalmazsunkat, megadja a belpsi azonostit, a felhasznlnevet s a jelszt.

274

Alkalmazspreferencik ltrehozsa

Az alkalmazsunk el tudja trolni a hitelestsi adatokat az alkalmazspreferencikba, gy a kvetkez alkalommal, amikor a felhasznl hasznlja az alkalmazst, az automatikusan megkapja ezeket az adatokat anlkl, hogy meg kellene adni ket.

Az alkalmazsbelltsok mdostsa
1. Az Xcode vgn vlasszuk a Root . pl i st fjlt, s tvoltsuk el mind a ngy elemet a Preferencespeci fi ers kulcs all. Ezt gy tehetjk meg, hogy egyenknt kivlasztjuk az elemeket a Preferencespeci fi ers kulcs alatt, majd megnyomjuk a Delete (trls) billentyt. 2. Hogy j elemet adjunk a Preferencespeci fi ers kulcshoz, vlasszuk ki, majd nyomjuk meg az Add Child (gyermek hozzadsa) gombot Osd a 11.6. brt).

Megjegyzs Az Add Child gomb gy nz ki, mint egy ngyzet hrom vzszintes vonallal a belsejben.

Key - Root StnngsTable

'Typ" Dictiona ry IStnng


Array

:va1ve ,2 tte ul

-- PreferenceSpeco~ers
11.6. bra

. .

Root

--

z)

3. Ltrejn az j elem. Tovbbi elemek hozzadshoz kattintsunk az Add Child gombra Osd a 11 .7. brt). Ezutn kattintsunk az Add Sibling (testvr hozzadsa) gombra hromszor.

Megjegyzs Az Add Sibiing gomb egy ngyzet plusz(+) jellel.

Key

Type Dictionary String Ar ray String

- Root StringsTable T PreferenceSpedfiers ltem l

Val u e 2 j(,-Root fl ire-

:T
nz ki.

+J

11.7. bra

4. A Root. pl i st fjl most a 11.8. brnak

megfelelen

275

11. fejezet: Alkalmazsbelltsok


Ke~

T Root

'T> J?." Dictionary Stnng Array Stn ng String Istring Stro n g

_'Jalu~_

I t~

StringsTa ble
T

Root
It~

PreferenceSpecifiers ltem l ltem 2 ltem 3 ltem 4

: ji

+J

11.8. bra

5. Vltoztassuk meg az rtem l Type kulcst Dictionaryra, s bontsuk ki a bal oldaln megjelen nylra kattintva (lsd a 11.9. brt). Kattintsunk az Add Child gombra, gy adhatunk hozz a rtem l. elemhez gyermekelemet.

"~

Tvpt:

Va lu e
- It
l

Root StringsTable PreferenceSpedfiers ltem l ltem 2 ltem 3 ltem 4

Dictionary String Array


Dictionary :

Root ite
1.

cn;

=J

' String String St ring

11.9. bra

6. j elem jelenik meg az rtem l alatt (lsd a 11.10. brt). Kattintsunk az Add Sibling gombra, gy adhatunk hozz tovbbi elemet az rt em l. -hez.
Key

Typ Dictionary String Array Dictionary String String String String

Value lte'lls) Root 1 'nsl 1tew.

Root Strin g sTable PreferenceSpecifiers ..,. !tem l New item !tem 2 !tem 3 ltem4

. .

1(l

+J

11.10. bra

Az Add Sibiing gombbal azonos szinten adunk hozz j elemet. Az Add Child gombbal a jelenlegi szint al adunk hozz j gyermekelemet.

7. A Root.plist fjl a 11.11. brnak

megfelelen

nz ki.

8. Mdostsuk a Root. pl i st fjl bejegyzst a 11.12. bra szerint. Bizonyosodjunk meg rla, hogy rninden kulcs- s rtkpr nagybets rsa meg felel .

276

Alkalmazspreferenci k ltrehozsa
~~.

Root StringsTa b! e - PrderenceSpecifiers "'' ltem l


Newitem

Type Dictionary String Array

'lalue 2 It< Root

.ltt'nS '

~ ~ictionary String

2 ite'TIS)

New item- 2 ltem 2 ltem 3 ltem 4

String String String String

. .

'

+1

11.11. bra
Key

Type Dictionary Stnng

Va lu e

-Root StringsTable PreferenceSpecifiers - ltem l Tit le Type .- !tem 2 nt le Type Key Defau Itifal ue AutoCapitalizationType AutocorrectionType T itern 3 TI tie Type Key DefaultValue lsSecure T itern 4

------ .

..__".__.......

Array Dictionary String String Dictionary String String Stnng String String String Dictionary IString String String String

. . 112

1 11emsJ :2
Root
l
llUl'S)

---- ~

1!6

Account Information PSGroupSpecofier r '11 Login Name PSTextfieldSpecifier logln_na.me login name None No
(5 il' 'TlS)

Password PSTextFieldSpecifier password password

nt le Type
Key DefauftValue - va lu es ltem l ltem 2 ltem 3 - ntles ltem l ltem 2 ltem 3

Boolean

Dictionary String String Stnng String Array String String String Array String

1'6 iterr SJ
color Red 1 it

Favorite Color PSMultiValueSpecifier

Red Gre en Blue 3 lit Red Color

"

\String String

Green Color Blue Color

11.12. bra

Megjegyzs Figyeljnk az elemek Type kulcsra.

277

11. fejezet: Alkalmazsbelltsok

9. Mentsk el a projektet, s nyomjuk meg a Command-R gombokat ahhoz, hogy az alkalmazst az iPhone Simulatoron teszteljk. Nyomjuk meg a Home gombot, s indtsuk jra a Settings alkalmazst. Vlasszuk ki az Ap pl i ca ti onsetti ngs belltsi elemet, s figyeljk meg a megjelen belltsokat (lsd a 11.13. brt).

Login Name k>gn name


Password

Green Color

Blue Color

Favorite Color

Red CoiOf )

11.13. bra

10. Vgezznk nhny vltoztatst a belltsi rtkeken, majd nyomjuk meg a Home

gombot, hogy visszatrjnk a kezd kpemyhz. A belltsok vltoztatsai automatikusan elmentdnek a telefonra. Amikor visszatrnk a Settings oldalra, az j rtkek jelennek meg.

Hogyan mkdik?
A fentiek alapveten megvltoztatjk a hrom preferencit (a bejelentkezsi nevet, a jelszt, a kedvenc sznt) trol Root. pl ist fjlt. A jelszmezhz az rssecure kulcsot hasznljuk annak meghatrozsra, hogy az rtket el kell-e rejteni, amikor megjelentjk a felhasznlnak. Klns jelentsg a Favorite Color (kedvenc szn) bellts is, amelyhez a Titles s a values kulcsokkal jelentjk meg a vlaszthat elemeket s az azokhoz tartoz, a telefonon trtn trolshoz szksges rtkeket. Ebben a pldban a kvetkez Preference Specifier elemeket hasznltuk: PSGroupspeci fi er- egy csoportot jelent meg a belltsokhoz. Ebben az esetben minden belltst az Account Information csoport al rendeznk.

278

A belltsok rtkeinek programozott elrse

PSTextFi el dspeci fi er- egy szvegmezt ad meg. PSMultivaluespecifier- a vlaszthat rtkek listjt adja meg. A Titles elem lthat szveglistt tartalmaz, amelybl a felhasznlk vlaszthamak. A va l ues elem a felhasznl ltal kivlasztott szveghez tartoz rtk. Ha pldul a felhasznl a Blue Color sznt vlasz* kedvencnek, az rtk Bl ue-knt troldik az iPhone-on.

A bellitsok rtkeinek programozott elrse


A felhasznli belltsok nem igazn hasznlhatk, ha nem tudjuk programozottan elrni ket az alkalmazsunkban. Az albbi rszben gy mdostjuk az alkalmazst, hogy a felhasznli belltsokat s a vltoztatsokat is programozottan tlthessk be. Elszr is hasznljuk a kvetkez gyakorlati rszt az UI elksztshez gy, hogy kapcsoldunk a szksges kivezetsekhez s mveletekhez.
A f s a Flipside nzet elksztse

1. Kattintsunk ktszer a Mainview . xi b fjira ahhoz, hogy az Interface Builderrel szerkessznk. 2. Kattintsunk ktszer a Main View elemre a Mainview. xi b ablakban a Main View ablak megjelentshez (lsd a 11.14. brt). Adjuk hozz a Button elemet, s nevezzk el Load Settngs Values (belltsok betltse) cmkvel.

3. Kattntsunk ktszer a Fl i ps ideview. xi b fjira ahhoz, hogy az Interface Builderrel szerkessznk. 4. Kattintsunk ktszer a Flipside nzetelemre a Fl i ps ideview. xi b ablakban, majd adjuk hozz a kvetkez elemeket a Flipside nzetablakhoz (lsd a 11.15. brt): Label, TextField, Pickerview.

279

11 . fejezet: Alkalmazsbelltsok

11.14. bra

Sunnyvale
(.U!)t:fUIIO

Santa Clara

11.15. bra

280

A belltsok rtkeinek programozott elrse

5. Visszatrve az Xcode-ba, szrjuk be a dot a Ma i nvi ewcont ro ll e r. h fjlba:


#import "'Fl i psi devi ewcontroll er. h"'

kvetkez

flkvren szedett programk-

@interface Mainviewcontroller : urviewcontroller <Flipsideviewcontrolleroelegate> {

- (IBAction)loadsettings: (id) sender; - (IBAction)showrnfo; @end

6. Szrjuk be a kvetkez flkvren szedett programkdot a Fl i psi devi ewcontro ll e r. h fjlba:


@protocol Flipsideviewcontrolleroelegate; @interface Flipsideviewcontroller : UIViewcontroller <UIPickerviewoatasource, UIPickerviewoelegate> { id <Flipsideviewcontrolleroelegate> delegate; IBDutlet UITextField *loginName; IBOutlet UITextField *password; IBOutlet UIPickerview *favoritecolor;

@property (nonatomic, retain) UITextField *loginName; @property (nonatomic, retain) UITextField *password; @property (nonatomic, retain) UIPickerview *favoritecolor; @property (nonatomic, assign) id <Flipsideviewcontrolleroelegate> delegate; - (IBAction)done; @end @protocol Flipsideviewcontrolleroelegate - (void)flipsideviewcontrolleroidFinish:(Flipsideviewcontroller *)controller; @end

7. Adjuk hozz a

kvetkez

utastst a Fl i psi devi ewcontroll er. m fjlhoz:

#import "'Flipsideviewcontroller.h"' @implementation Flipsideviewcontroller @synthesize @synthesize @synthesize @synthesize delegate; loginName; password; favoritecolor;

281

11. fejezet: Alkalmazsbelltsok

8. Kapcsoljuk a hrom referencit az elemekhez az Interface Builder View ablakban. A Fl i ps ideview. xi b ablakban tegyk a kvetkezket: Control-katcints mellett hzzuk r a File's Owner elemet az elemre, majd vlasszuk a login Name-et.
els

TextField

Control-kattints mellett hzzuk r a File's Owner elemet a msodik TextField elemre, majd vlasszuk a password-t. Control-kattints mellett hzzuk r a File's Owner elemet a Picker elemre, majd vlasszuk a favoritecol or-t. Control-katcints mellett hzzuk r a Picker elemet a File's Owner elemre, majd vlasszuk a datasource-t. Control-katcints mellett hzzuk r a Picker elemet a File's Owner elemre, majd vlasszuk a de l egate-et.

9. Kattintsunk jobb gombbal a File's Owner elemen, hogy ellenrizzk, hogy minden kapcsolat megfelelen csatlakozik-e Osd a 11.16. brt).

11.16. bra

10. Control-katcints mellett hzzuk r a Button elemet a File's Owner elemre az ablakban, majd vlasszuk a Mainview .xib-et.

282

A belltsok rtkeinek programozott elrse

11. Mentsk el a fjlt az Interface Builderben.


12. Adjuk hozz az albbi flkvrrel szedett kdot a Flipsideviewcontroller.m fjlhoz az Xcode-ban:
#import "Fl i psi devi ewcontroll er. h" @implementation Flipsideview controller @synthesize @synthesize @ synthesize @synthesize delegate; loginName; password; favoritecolor ;

NSMutableArray *colors; NSString *favoritecolorselected; - (voi d)viewDidLoad { //---create an array containing the colars values--colors = [[NSMutableArray alloc] init]; [colors addobject:@"Red"]; [colors addobject:@"Green"]; [colors addobject:@"Blue"]; [super viewoidLoad]; self .view.backgroundcolor
}

[UIColor viewFlipsideBackgroundcolor];

//--- number of components in the Picker view--- (NSinteger)numberofcomponentsinPickerview:(UIPickerview *)thePickerview { return l;

//- --number of items(rows) in the Picker view--- (NSinteger)pickerview:(UIPickerview *)thePickerview numberOfRowsrncomponent:(NSinteger)component { return [colors count];

//---populating the Picker view--- (NSString *)pickerview:(UIPickerview *)thePickerview titleForRow:(NSinteger)row forcomponent:(NSinteger)component { return [colors objectAtindex:row];
}

//---the item selected by the user--- (void)pickerview:(UIPickerview *)thePickerview didselectRow:(NSinteger)row incomponent:(NSinteger)component { favoritecolorselected = [colors objectAtindex:row];
}

283

11 . fejezet: Alkalmazsbelltsok - (void) dealloc { [colors release] ; [favoritecolorselected release]; [loginName release]; [password release]; [favoriteColor release]; [super dealloc];

13.

yomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron tesztelj k. A 11. 17. brn a f s a Flipside nzethez tartoz alkalmazsok felhasznli fellett lthatjuk.

Megjegyzs A fordt hibt generlhat, me rt mg nem implementltuk a l oadsetti ngs : akcit a Mai nvi ewcontro ll er. m fjlba. Ez nem jelent problmt, hiszen csak azt szeretnnk tesztel ni, hogyan nz ki a felhasznli fellet.

11.17. bra

284

A belltsok rtkeinek programozott elrse

Hogyan mkdik?
Ez idig minden
mveletnk

a felhasznli belltsokbl beolvasott rtkek megjelertel.

shez tartoz felhasznli felletet ksztette

Tulajdonkppen a Picker nzet


amelybl

elksz

tsre van szksgnk annak a sznlistnak a megjelertshez,

a felhasznl
ksbb

vlaszthat. A Flipside nzetben a Done gomb megnyomsval menthetjk a felhasznli belltsok rtkeit. A felhasznli belltsok mentsre szolgl kdunkat szrjuk a done
mveletbe

be-

(ezt lsd albb).


elszr

Ahhoz, hogy betltsk a Picker nzetet a hrom sznnel, source s a UI Pi ckervi ewoel egate protokollokat: 1/---Flipsideviewcontroller .h--@protocol Flipsideviewcontrolleroelegate; @interface Flipsideviewcontroller : urviewcontroller <UIPickerviewDatasource, UIPickerviewDelegate> { id <FlipsideviewcontrollerDelegate> delegate;

is meg kell

gyzd

nnk arrl, hogy a Fl i psidevi ewcontroll er osztly megvalstja-e a UI Pi ckervi ewoata-

A UIPickerviewDataSource protokoll meghatrozza a Picker nzet elemekkel trtn feltltsnek a metdust, a UIPickerviewoelegate protokoll pedig a Picker nzetbl egy elem kivlasztst engedlyez metdust hatrozza meg a felhasznJk szmra. Elszr ltrehozunk a Fl i ps i devi ewcontro ll er. m fjlban egy NSMutab leArray objektumot a vlaszthat sznek listjnak trolshoz a vi ewoi d Load metdusban:
- (void)viewDidLoad { //---create an array containing the colars values--colors = [[NSMutableArray alloc] init]; [colors addobject:@"Red"]; [colors addobject:@"Green"]; [colors addobject:@"Blue"]; [super viewoidLoad]; self.view.backgroundcolor = [urcolor viewFlipsideBackgroundColor];

Ahhoz, hogy a Picker nzet sszetevinek (oszlopainak) a szmt belltsuk, implementljuk a numberofcomponentsinPi ckervi ew: metdust //---number of components in the Picker view--- (NSinteger) numberofcomponentsinPickerview:(UIPickerview *)thePickerview { return l;

A megjelertend elemek (sorok) szmnak belltshoz implementljuk a pi ckervi ew: numberofRowsrncomponent: metdust:

285

11. fejezet: Alkalmazsbelltsok


//--- number of items(rows) in the Picker view--- (NSinteger)pickerview:(UIPickerview *)thePickerview numberOfRowsrncomponent:(NSinteger)component { return [colors count];
}

A Picker nzet hrom sznnel

trtn

feltltshez implementljuk a pi eke rvi ew:

ti t l eForRow: forcomponent: metdust. //---populating the Picker view--- (NSString *)pickerview:(UIPickerview *)thePickerview titleForRow:(NSinteger)row forComponent:(NSinteger)component { return [colors objectAtindex:row];
}

A felhasznl ltal a Picker nzetben kivlasztott szn mentshez implementljuk a


pi ckervi ew: didsel ectRow: i ncomponent: metdust: //---the item selected by the user--- (void)pickerview:(UIPickerview *)thePickerview didselectRow:(NSinteger)row incomponent:(NSinteger)component { favoritecolorselected = [colors objectAtindex:row];
}

A kivlasztott sznt ekkor a favoritecolorselected objektumba mentjk.

A belltsok rtkeinek betltse


A
kvetkezkben

megnzzk, hogyan tudjuk programozottan betlteni a felhasznli


lehetsget

belltsok rtkeit, majd megjelenteni az alkalmazsban. Ez a megjelents sge lenne a Settings alkalmazsra.

teremt a felhasznlnknak arra, hogy megnzze a belltsi adatokat anlkl, hogy szk-

Belltsok rtkeinek a betltse


1. illesszk be a
kvetkez

flkvrerr szedett programkdot a Mainviewcontrol-

ler.m fjlba (gyzdjnk meg arrl, hogy a jelsztsakedvenc sznt jelz sor a kdban egy sorban van, nem gy, rnint az albbi kdban): #import "Mainviewcontroller.h" #import "Mainview.h" @implementation Mainviewcontroller

286

A belltsok rtkeinek programozott elrse

- (IBAction) loadsettings: (id) sender{ NSUseroefaults *defaults= [NSUseroefaults standarduseroefaults]; NSString *strLoginname = [defaults objectForKey:@"login_name"]; NSString *strPassword = [defaults objectForKey :@"password"]; NSString *strcolor = [defaults objectForKey:@"color"]; NSString *str [[NSString alloc] initWithFormat :@"Login name is\"%@\", password is \"%@\", and favorite color is \"%@\'"', strLoginname, strPassword, strcolor];

urAlertview *alert = [[UIAlertview alloc] initWithTitle:@"Settings values" message:str delegate : nil cancelButtonTitle: @"Done" othersuttonTitles:nil]; [alert show]; [strLoginname release]; [strPassword release]; [strcolor release]; [str release]; [alert release];

2. Nyomjuk meg a Command-R gombokat ahhoz, hogy az alkalmazst az iPhone Simulatoron teszteljk Ha az alkalmazs betltdtt, rintsk meg a Load Settings Values gombot, s l tha~uk a belltsok rtkeit egy Alert elemben megjelentve (lsd a 11. 18. brt).

Hogyan mkdik?
A felhasznli belltsok rtkeinek betltse az NSUse roefau l ts osztly segtsgvel trtnik: NSUseroefaults *defaults = [NSUserDefaults standarduseroefaults];
11.18. bra

Az elz utasts az NSUseroefaul ts osztly egy s csak egy pldnyt adja vissza. Az NSUseroefaul ts-ra egyszer adatbzisknt kell tekinteni, amelyet a felhasznli bellitsaink trolshoz hasznlhatunk.

287

11. fejeze t: Alkalmazsbelltsok

Az objectForKey: metdussal olvassuk be a felhasznli belltsok rtkeit, s adjuk meg a beolvasand felhasznli utasts nevt:
NSString *strloginname = [defaults objectForKey :@"login_name"]; NSString *strPassword = [defaults objectForKey:@"password"]; NSString *strcolor = [defaults objectForKey:@"color"];

A bellitsok rtkeinek alaphelyzetbe llitsa


hogy trlni szeretnnk az alkalmazsunk belltsainak az rtkeit. Ez klnsen igaz akkor, ha hibt kvettnk el a Root. pl i st fjlban, s szetetnnk trlni a belltsokat. Ennek legegyszerbb mdja az, ha eltvolitjuk az alkalmazst a telefonrl vagy a SimulatorrL Ehhez egyszeren tartsuk megrintve az alkalmazs ikonjt, majd amikor az ikonok elkezdenek mozogni, rintsk meg az X gombot az alkalmazs eltvoltshoz. Az alkalmazshoz tartoz preferenciabelltsok eltvolitsa is megtrtnik. A felhasznli belltsok rtkeit mskppen gy lehet trlni, ha belpnk az alkalmazsunkat tartalmaz mappba (az iPhone Simulatorban). Az iPhone Simulatorban az alkalmazsok a kvetkez map p ban tallhatk: -/L i brary lApplica ti on support/ i Phone simulator/user/Applications/ (a hullmjel H a munkaknyvtrunkat jelzi, nem a gykrknyvtrunkat). Ebben a knyvtrban kell megtallnunk az alkalmazsunkat tartalmaz knyvtrat. Az alkalmazsmappn bell van egy Library/Preferences mappa. Trljk az app7ica6on_name. pl i st vg fjlt (lsd a 11.19. brt), s a felhasznli belltsaink trlse is megtrtnik.
Elfordul,

Documents
PLAUS Desktop

Prerere.nce:s
com.apple: .PeoplePICker .pltst

1)

~menglu
Apphc:attons

Ooc.uments

11.19. bra

288

A belltsok rtkeinek programozott elrse

A belltsok rtkeinek az elmentse


Az albbi gyakorlati rszben megnzzk, hogyan mentsk ki az rtkeket a felhasznli bellitsokba. Ez lehetv teszi, hogy a felhasznlk kzvetlenl mdosthassk a felhasznli belltsaikat az alkalmazsaikbl, ahelyett, hogy a Settings alkalmazst hasznlnk erre a clra.
Bellitsok rtkeinek az elmentse

1. Szrjuk be a

kvetkez

flkvren szedett progtamkdot a fjlba:

#import "Flipsideviewcontroller.h" @i mplementation Flipsideviewcontroller @synthesize @synthesize @synthesize @synthesize delegate; loginName; password; favoritecolor;

NSMutableArray *colors; NSString *favoritecolorselected; - (void)viewoidLoad { colors ; [[NSMutableArray al l oc] i nit]; [colors addobject:@"Red"]; [colors addobject:@"Green"]; [colors addObject:@"Blue"]; NSUserDefaults *defaults; [NSUserDefaults standarduseroefaults]; loginName.text; [defaults objectForKey:@"login_name"]; password.text; [defaults objectForKey:@"password"]; //---find the index of the array for the color saved--favoritecolorselected ; [[NSString alloc] initWithstring: [defaults objectForKey:@"color"]]; int selrndex; [colors indexofobject:favoritecolorselected]; //---display the saved color in the Picker view--Cfavoritecolor selectRow:selrndex incomponent:O animated:YES]; [super viewoidLoad]; self.view.backgroundcolor

[UIColor viewFlipsidesackgroundcolor];

289

11. fejezet: Alkalmazsbelltsok - (IBAction)done { NSUseroefaults *defaults= [NSUseroefaults standarduseroefaults]; [defaults setDbject:loginName.text forKey:@"login_name"]; [defaults setobject:password.text forKey:@"password"]; [defaults setObject:favoriteColorSelected forKey:@"color"]; [self.delegate flipsideviewcontrolleroidFinish:self];

2.

yomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljk Ha az alkalmazs
betlt

dtt, a Flipslide nzetre vltshoz rintsk meg az i ikont. Vltoztassuk meg a felhasznli nevet, a jelszt s a kedvenc sznt (lsd a 11.20. brt). Ha megnyomjuk a Done gombot, minden vltoztats a telefonra kerl. Amikor visszatrnk a
f

n-

zetbe, az aktulis bellitsi rtkek megjelenitshez rintsk meg a Load Settings V alu es gombot.

Hogyan mkdik?
Ugyanazzal a szernllettel mentjk ki az rtkeket a felhasznli bellitsokba, mint amellyel azokat beolvastuk; hasznljuk: teht az NSUseroefaults osztlyt
11.20. bra

NSUseroefaults *defaults = [NSUseroefaults standarduseroefaults]; [defaults setobject:loginName.text forKey: @"l ogin_name"]; [defaults setobject:password.text forKey:@"password"]; [defaults setobject:favoritecolorselected forKey:@"color"]; A2 objectForKey: metdus helyett most a setobject:forKey: metdust hasznljuk az rtkek mentsre. Klns kihvs a Flipside nzetben, hogy a kedvenc sznhez tartoz
meglv

rt-

ket meg kell jeleniteni a Picker nzetben; ezrt a vi ewoi d Load: metdus alatt be kell tltennk a felhasznli bellitsok rtkeit, majd meg kell hatrozni a Picker nzet indext a megfelel szn megjelenitshez. Mindezt az indexofobject: osztly NSMutableArray metdusa alatt tesszk:

290

A belltsok rtkeinek programozott elrse


//---fi nd the index of the array for the color saved--favoritecolorselected = [[NSString alloc] initwithstring: [defaults objectForKey:@"color"]]; int selrndex = [colors indexofobject:favoritecolorselected]; //---display the saved color in the Picker view--[favoriteColor selectRow:selrndex incomponent:O animated:YES];

SSZEFOGLALS
Ebben a fejezetben megvizsgltuk, hogyan hasznlhatjuk az iPhone Application Preferences eszkzeit ahhoz, hogy az alkalmazsunk bellitsait elmentsk a Settings alkalmazsba. Ennek segtsgvellehetv vlik, hogy egy alkalmazs bellitsainak rnentsvel s betltsvel kapcsolatos feladatokat egy OS-be delegljuk Mindehhez csak az NSUseroefau l ts osztly segtsgvel programozottan kell elrnnk a felhasznli bellitsokat.

1. Lttuk, hogyan hasznlhatjuk az N se r oe fau l ts osztlyt, hogy alkalmazsunk felSU


hasznli bellitsainak az rtkeit elrjk. Milyen metdusokkal olvashatunk be s menthetnk ki rtkeket? 2. Milyen ktfle rndon tvolithatjuk el alkalmazsunk felhasznli bellitsait? 3. Mi a klnbsg az Add Child gomb s az Add Sibling gomb kztt a Property List szerkesztben?

A FEJEZET TUDNIVALI
Tma AJkalmazspreferencik hozzadsa az alkalmazsunkhoz Bellts rtknek a betltse Alapelvek Settings Bund!e fjl hozzadsa a projekthez s a Root. pl i st fjl mdostsa. NSUseroefaults *defaults = [NSUseroefaults standarduseroefaults]; NSString *strLoginname = [defaults objectForKey:@"login_name"]; Vagy az egsz alkalmazs eltvoltsa a kezdkperoyrl, vagy az iPhone Simulator mappbl trtn eltvoltsa a Macnkn. NSUseroefaults *defaults = [NSUseroefaults standarduseroefaults]; [defaults setObject:loginName.text forKey:@"login_name"];

Belltsok rtkeinek alaphelyzetbe llitsa Bellts rtknek az elmentse

291

Fjlkezels
A FEJEZET FBB RSZEl A KVETKEZK:
Hol trolja az iPhone az alkalmazsainkat? Hol trolja az App l i ca ti ons mappn belli
klnbz

mappka t?
lv

Hogyan olvasha~uk a Documents s a tmp mappkban rhatunk beljk? Hogyan


trolha~uk

fjlokat, illetve hogyan

a strukturlt adatokat tulajdonsgok segtsgve]?

Hogyan olvashatjuk be programozottan egy tulajdonsglista rtkeit? Hogyan mdostha~uk a tulajdonsglistbl beolvasott rtkeket, s hogyan menthetjk fjlba a mdostsokat?

Az eddig fejlesztett alkalmazsok mindegyike egyformn mkdik : elindul, vgrehajt egy feladatot, majd befejezdik. A 11. fejezetben bemutattuk, hogyan hasznlha~uk az kzponti alkalmazsbelltsokat arra, hogy elmentsk az alkalmazsok felhasznli belltsait egy, a Settings alkalmazs ltal felgyelt kzponti helyre. Nha azonban csak arra van szksgnk, hogy az adatokat ksbbi felhasznls cljbl az alkalmazsmappba mentsk. A tvoli kiszolglrlletlttt fjlok memriabeli trolsa helyett pldul sokkal jobb (valamint hatkonyabb s memriakrnlbb) mdszer, ha a fjlokat a ksbbi (akr az alkalmazs bezrsa s jraindtsa utni) felhasznlshoz lemezre mentjk. Ebben a fejezetben rszletesen megvizsglj uk, hogy miknt rizhe~k meg az alkalmazsok adatait ksbbi felhasznlsra, akr az alkalmazs jraindtst kveten is. Ktfle megkzeltst nznk meg: az adatok mentst fjlknt, illetve tulajdonsglistaknt.

12. fejezet: Fjlkezels

Az alkalmazsmappk megismerse
Eddig arra figyeltnk, hogy hogyan telep~k az alkalmazsokat az iPhone Simulator programba, s nem foglalkoztunk azzal, hogy az iPhone a fjlrendszer mely terletn trolja ezeket. A kvetkezkben az iPhone mappastruktrjt ismerhetjk meg. Az i Phone Simulator tartalmai az asztalon, a -/L i brary/Appl i ca ti on support/i Phone simulator/User/ mappban tallhatk.

Megjegyzs A~ (tilde) karakter a jelenlegi felhasznl knyvtrt jelkpezi. Az adott esetben ez a kvetkez : /Users/<username>/Li brary/ Application support/i Phone Simulator/ user/.

A mappn bell t almappa tallhat:

Applications, Library, Media, Root, tmp.

Az Applications mappa tartalmazza az sszes letlttt alkalmazst (lsd a 12.1 brt). Az Ap pl i ca ti ons mappn bell szm os, hossz fjlnevet hasznl mappa tallhat.

~ IO.Ik

,.

4COF9FEF-2BA7 -406E-~29-44lBAAF8l275

.,. ..,
Pl~CH

Documents

HelloWorld
.. Ubrary Preferences ,. com.lilpple .PeoplePicker .plist tm p

0Dtsktop

tit

Y.emenglr:e
Documents

* . Apphabons
9'\f.ARCHFOR 1>

6AC40854 - 961F- 4C69- 9CCO- l0094Dll62l7 l.Jbr.uy


Mdla
Root tmp

lll lll
"'

... r

12.1. bra

294

Az alkalmazsmappk megismerse

Az egyes alkalmazsok egyedi azonostsra szolgl fjlneveket az Xcode hozza ltre. Az alkalmazs mappjban van az alkalmazs vgrehajthat fj lj a (az gynevezett . ap p fjl, amely tartalmazza az sszes begyazott erforrst), valamint nhny egyb mappa, pldul Documents, Li brary s tmp. Az iPhone kszlkek valamennyi alkalmazsa sajt, elklntett krnyezetben fut, azaz csak a sajt mappjban trolt fjlokhoz fr hozz, a tbbi alkalmazs mappjhoz nem.

A Documents s a Library mappk hasznlata


A oocuments mappban tallhatk az alkalmazs ltal hasznlt fjlok, a Li brary mappa pedig az alkalmazsfgg belltsokat tartalmazza. A tmp mappban az alkalmazs futshoz szksges ideiglenes adatok vannak. Az albbiakban megnzzk, hogyan rhatunk ezekbe a mappkba. A kvetkez gyakorlati rszben erre lthatunk pldt. A feladat vgrehajtshoz le kell tltennk a jelzett programkdfjlokat.
Fjlok rsa s olvassa

A [FilesHandling.tfp} fjl a Wrox.co"' oldalrl tlthet le.

1. Az XCode segtsgvel hozzunk ltre egy j, ablakalap alkalmazsprojektet Fi lesHandling nven. 2. Adjuk hozz a FilesHandlingviewcontroller . h fjlhoz a szedett utastsokat:
#import <UIKit/UIKit.h> @inte rface FilesHandlingviewcontroller : urviewcontroller {
kvetkez

flkvren

-(NSStri ng *) documentsPath; -(NSString *) readFromFile:(NSString *) filePath; -(voi d) writeToFile:(NSString *) text withFileName:(NSString *) filePath; @e nd

3. Adjuk hozz a Fi l es Han dl i ngvi ewcontro ll er. m fjlhoz a szedett utastsokat:

kvetkez

flkvren

295

12. fejezet: Fjlkezels #import "FilesHandlingviewcontroller.h" @implementation FilesHandlingviewcontroller //---finds the path to the application's oocuments directory---(NSString *) documentsPath { NSArray *paths = NSSearchPathForoirectoriesrnoomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsoir = [paths objectAtindex:O]; return documentsoir;
}

//---read content from a specified file path---(NSString *) readFromFile:(NSString *) filePath { //---check if file exists--if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{

NSArray *array= [[NSArray alloc] initWithcontentsOfFile: filePath]; NSString *data= [[NSString al l oc] initWithFormat:@"%@", [array objectAtindex:O]]; [array release]; return data;
}

else return nil;


}

//---write content into a specified file path---(void) writeToFile:(NSString *) text withFileName:(NSString *) filePath { NSMutableArray *array= [[NSMutableArray alloc] init]; [array addobject:text]; [array writeToFile:filePath atomically:YES]; [array release];
}

ll Implement viewDidLoad to do additional setup after loading the view, ll typically from a nib . - (void)viewoidLoad { //---formulate filename--NSString *fileName = [[self documentsPath] stringByAppendingPathcomponent:@"data.txt"];

296

Az alkalmazsmappk megismerse

//---write something to the file--[self writeToFile:@"a string of text" withFileName:fileName]; //---read it back--NSString *filecontent = [self readFromFile:fileName]; //---display the content read in the oebugger console window--NSLog(filecontent); [super viewoidLoad];

4. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljk

5. Ha a Pinderben az alkalmazs oocuments mappjba lpnk, lthat a data . txt fjl (lsd a 12.2. brt) .

.......
Applicauons E::! iDt.sk
p ,.,, -

ti 4CDF9FEF-2BA7-406E-9429-44lBMF8l27S Ilii 6AC408S4-961F-4C69-9CCD-l0094Dll6237


ll 904 9 l l-BBC2 - 4F09-9081-98760lBFS 796 Documenu
FiltsHandi ing l..ibrary

!J Desktop
~ wtunenglee
'\ Apphcah01ts

Oocunw:nu.

12.2. bra

6. Ha az alkalmazst vals eszkzre teleptjk, akkor a fjl a /p ri vate/var /mobi l e/


Ap pl i ca ti ons/<appl i ca ti on_ i d>/Documents/data. txthelyen tallhat.

7. Ha dupln kattintunk a data. txt fjl nevn, megjelenik a tartalma:


<?xml vers i on="l. O" en cod i ng="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-l.O.dtd"> <plist version="l.O"> <a rray> <string>a string of text</string> </a rray> </p list>

297

12. fejezet: Fjlkezels 8. Ha


megnyi~uk

a Debugger Console ablakot (Shift-Command-R


kinyomta~a

billentyvel),

lthat, hogy az alkalmazs

az "a string of text" karakterlncot.

Hogyan mkdik?
Elszr

definiljuk a documentsPath metdust, amely visszaadja a oocuments knyvtr t-

vonalt: //---finds the path to the application's Documents directory---(NSString *) documentsPath { NSArray *paths; NSSearchPathForDirectoriesinDomains( NSDocumentoirectory, NSUserDomainMask, YES); NSString *documentsDir; [paths objectAtindex:O]; return documentsoir;

Az NSSearchPathForoi rectori esinocmai ns() fggvnyt ltalban arra hasznljuk, hogy ltrehozzuk a knyvtrak elrsi
~ainak

listjt, ezzel jelezve, hogy a oocuments knyvt-

rat keressk (az NSDocumentoi rectory lland hasznlatval). Az NSUserDomai nMask lland azt jelzi, hogy az alkalmazs knyvtrbl indulva szeretnnk keresni, a YES argumentum pedig azt, hogy a knyvtrak teljes elrsi tjt szetetnnk beolvasni. A oocuments mappa elrsi tjnak beolvasshoz tmb
els egyszeren

olvassuk ki a paths

elemt (az iPhone-alkalmazsok mappjban csak egy Documents mappa tall-

hat). Ez a kdblokk tulajdonkppen a Mac OS X API-bl szrmazik, amelyben tbb mappa visszaadsa is lehetsges. Az iPhone esetben azonban alkalmazsonknt csak egy oocuments mappa ltezhet. A
kvetkezkben

definiljuk a wri te To Fi l e: wi th Fi l eN ame: metdust, amely ltrehoz

egy NSMutab leArray objektumot, s hozzadja a fjlba rand szveget: //---write content into a specified file path---(void) writeToFile:(NSString *) text withFileName:(NSString NSMutableArray *array ; [[NSMutableArray alloc] init]; [array addobject:text]; [array writeToFile:filePath atomically:YES]; [array release];

*)

filePath {

Ha fjlba szeretnnk rni az NSMutableArray tartalmt (ezt a folyamatot sorosrs nven ismerjk), akkor annak wri teTo Fi l e: atomi ca ll y: metdust kell hasznlnunk. Az atomica ll y: paramter azt jelzi, hogy a rendszer a tartalmat hibs, ha a rendszer az rsi folyamat sorn sszeomlik. A fjl tartalmnak beolvasshoz definilnunk kell a readFrom Fi l e: metdust:
elszr

egy ideiglenes fjlba rja,

amelyet ezutn nevez t a kvnt fjlnvre. Ezzel a megkzeltssel a fjl akkor sem lesz

298

Az alkalmazsmappk megismerse

//--- read content from a specified file path---(NSString *) readFromFile:(NSString *) filePath //--- check if file exists--if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{

NSArray *array NSString *data

= =

[[NSArray alloc] initWithContentsOfFile: filePath]; [[NSString alloc] initWithFormat:@"%@", [array objectAtindex:O]];

[array release]; return data; else return nil;

Elszr

az NSFileManager osztly pldnynak hasznlatval ellenrizzk, hogy ltezik-e a megadott fjl. Ha igen, akkor beolvassuk a fjl tartalmt egy NSArray objektumba. Ebben az esetben (hiszen tudjuk, hogy a fjl csak egyetlen sornyi szveget tartalmaz) a tmb els sort kell kinyernnk Amikor rninden metdus a helyn van, elkezdhetjk hasznlni ket. A nzet betltst kveten elszr az elmenrend fjl elrsi tjt kellltrehoznunk Ezutn egy karakterlncot runk a fjlba, amelyet azonnal visszaolvasunk, s kinyomtatunk a Debugger Console ablakban.
- (void)viewoidLoad /1---filename--NSString *fileName

[[self documentsPath] stringByAppendingPathcomponent:@"data.txt"];

//---write something to the file--[self writeToFile:@"a string of text " withFileName:fileName]; //---read it back--NSString *filecontent

[self readFromFile:fileName];

//---display the content read in the Debugger console window--NSLog(filecontent); [super viewDidLoad] ;

Fjlok trolsa az ideiglenes mappban


A fjlok oocuments knyvtrbeli trolsa mellett a tmp mappban az ideiglenes fjlokat is trolhatjuk A tmp mappban trolt fjlokrl az iTunes nem kszt biztonsgi mentst, ezrt azokat a fjlokat, amelyeket rnindenkppen meg szeretnnk tartani, egy lland helyre kell mentennk. A tmp mappa elrsi ~nak beolvasshoz meg kell hvnunk az NSTemporaryoi rectory() fggvnyt a kvetkezkppen :

299

12. fejezet: Fjlkezels

-(NSString *) tempPath{ return NSTemporaryoirectory();


}

Vals eszkzn a tmp mappa visszaadott elrsi tja a kvetkez lenne: /private/var/ mobile/Applications/<application_id>/tmp/. Az iPhone Simulatoron tnylegesen visszaadott elrsi t viszont a /var/folders/ <application_id>/-Tmp-/data .txt, nem pedig a -/Library/Application support/iPhane Simulator/user/ Applications/<application_id>/tmp/. Az albbi utasts egy, a tmp mappban troland fjl elrsi tjt adja vissza: NSString *fileName = [[self tempPath] stringByAppendingPathcomponent:@"data.txt"];

Tulajdonsglistk hasznlata
Az iPhone programozsa sorn a strukturlt adatokat tulajdonsglistk segtsgve!, kulcs/ rtk prok hasznlatval trolhatjuk A tulajdonsglistk XML-formtum fjlok, amelyek szles krben hasznlhatk a klnbz fjlrendszerek s hlzatok kztt. Lehetsges pldul, hogy az AppStore-alkalmazsok cmeinek listjt a sajt alkalmazsunkban szeretnnk trolni. Mivel az AppStore-alkalmazsok kategrikba vannak rendezve, kzenfekvnek ltszik, hogy ezeket az adatokat egy tulajdonsglis t ban, a 12.3. brn lthat struktrt alkalmazva troljuk
ICategory Games Entertainment Utili ti es

jTitles
"Animai Park", "Biology Quiz". "Calcuius Test" "Eye Balls- iBiower", "i Bell ", "iCards Birthday" " Battery Monitor", "iSystemlnfo"

12.3. bra

Az XCode-ban a tulajdonsglistt az alkalmazs Resources (erforrsok) mappjban hozhatjuk ltre s adha~uk hozz, majd a gyri tulajdonsglista-szerkeszt segtsgvel tlthetjk fel elemekkeL Az alkalmazs teleptsekor a tulajdonsglista teleptse az alkalmazssal egytt trtnik meg. A tulajdonsglistban trolt rtkeket programozottan az NSDi cti onary osztllyai olvashatjuk be. Arnikor mdostsokat vgznk a tulajdonsglistn, ezeket fjlba rha~uk, gy a tovbbiakban a tulajdonsglista helyett kzvetlenl a fjlra hivatkozhatunk.

300

Tulajdonsglistk hasznlata

A kvetkez gyakorlati rszben ltrehozunk egy tulajdonsglistt, majd hozzadunk nhny rtket. Ezt kveten futsidben beolvassuk az rtkeket a tulajdonsglistbl, mdos~uk ket, majd a mdostott rtkeket egy msik tulajdonsglista-fjlba men~k.

Megjegyzs

Ha olyan alkalmazsfgg belltsokat szeretnnk trolni, ame-

lyeket a felhasznlk az alkalmazson kvl tudnak mdostani, akkor inkbb az NSUseroefaults osztlyt hasznljuk arra, hogy a belltsokat a Settings alkalmazsban troljuk. Az alkalmazsbelltsokat a ll. fejezetben ismertettk.

Tulajdonsglista ltrehozsa s mdostsa


1. Kattintsunk a jobb gombbal az Xcode-ban a korbban ltrehozott projekt nevn, s vlasszuk az Add )> New File (hozzads )> j fjl) menpontot. 2. Vlasszuk a New File prbeszdablak bal oldaln lv Other (egyb) elemet, majd a prbeszdablak jobb oldaln lv Property List template (tulajdonsglistasablon) elemet (lsd a 12.4. brt).
:~File

Choose- a template for your new h le:


":.-~~

.IPhone OS

A.sst.mblyF~

CluJ Wodtl

Conft9U"tl0n
SdnngJ r ...

.ex p
"q,~x

(tnp(yfl1t

Exports file

CWC+
~

Ot.n npbon M Xt,fJ.. proprtftY' ltst fitt

Coeoa
tntt.rf~u:
P'Ut'tJ,iV~

lutlder SOk

""""""""' Ru
by

!rtVIOU~

12.4. bra

3. Nevezzk el a tulajdonsglistt Ap ps . pl i st-nek. 4. Tltsk fel az Apps. pl i st tulajdonsglistt a 12.5. brnak


megfelelen.

301

12. fejezet: Fjlkezels

...

Flnd

ltt:sul~s

L!laoolt.m.arb

..... ,..,
12.5. bra

SCM

ttt.ml

e~><oJ<aSymbols .. lmpltmtf't~non ri1tt.

lll'fn 2 lt*rt'l J

SI ""9

~-

~~sTtn

Enttnowwnent rt*m l .... 2


ttem)
YUIJhUtt.

..".y
Slnng

.......

tv.Wh~r

St ""9

lltll
.Canblirt~y

litfl'nS)

.... l
lttm 2

.. tttry Monttor
ISyt:ttMII'IfO

Adjuk hozz a viewDidLoad metdushoz a kvetkez, flkvren szedett utastsokat:


- (void)viewDidLoad { /1---filename--NSString *fileName

[[self documentsPath] stringByAppendingPathcomponent:@"data.txt"];

//---write something to the file--[self writeToFile:@"a string of text" withFileName:fileName]; //---read it back--NSString *filecontent

= [self

readFromFile:fileName];

//---display the content read in the Debugger console window--NSLog(filecontent); //---get the path to the property list file-- NSString *plistFileName = [[self documentsPath] stringByAppendingPathcomponent:@"Apps . plist"];

302

Tulajdonsglistk hasznlata //---if the property list file can be found--if ([[NSFileManager defaultManager] fileExistsAtPath:plistFileName]) { //---load the content of the property list file into a NSDictionary ll object--NSDictionary *dict = [[NSDictionary alloc] initWithcontentsOfFile:plistFileName]; //---for each category--for (NSString *category in dict) { NSLog(category); NSLog(@"========"); //---return all titles in an array--NSArray *titles = [dict valueForKey:category]; //---print out all the titles in that category--for (NSString *title in titles) { NSLog(title);
}

[dict release];
}

else { //---load the property list from the Resources folder--NSString *pListPath = [[NSBundle mainBundleJ pathForResource:@"Apps" ofType:@"plist"]; NSDictionary *dict = [[NSDictionary alloc] initWithcontentsOfFile:pListPath]; //---make a mutable copy of the dictionary object--NSMutableoictionary *copyofoict = [dict mutablecopy]; //---get all the different categories--NSArray *categoriesArray = [[copyofoict allKeys] sortedArrayusingselector:@selector(compare:)]; //---for each category--for (NSString *category in categoriesArray) { //---get all the app titles in that category--NSArray *titles = [dict valueForKey:category]; //---make a mutable copy of the array--NSMutableArray *mutableTitles = [titles mutablecopy]; //---add a new title to the category--[mutableTitles addobject:@"New App title"];

303

12. fejezet: Fjlkezels

//---set the array back to the dictionary object--[copyofoict setobject:mutableTitles forKey:category]; [mutableTitles release];
}

//---write the dictionary to file--fileName = [[self documentsPath] stringByAppendingPathcomponent:@"Apps.plist"]; [copyofoict writeToFile:fileName atomically:YES]; [dict release]; [copyofoict release];
}

[super viewoidLoad];
}

5. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljk

6. Az alkalmazs

els futsakor ltrehoz egy j . pl i st-fjlt az alkalmazs oocuments knyvtrban. Ha a . pl i st fj l nevn dupln kattintva megnzzk a fjlt a tulajdonsglista-szerkesztben, akkor lthat, hogy az egyes alkalmazskategrikhoz egy j, New App title nev elem tartozik (lsd a 12.6. brt).

Apps.plisr

l Ad<'!''"" 0e'.ee

'~t:m

1 Root
Entertamment

l< ey

Ty p.:
Diction~ry

Vlu~
it .. rnt:l

Ana y
String

t<

lttm l

Eye Satis - iRtower

ltem 2
\tem 3

String String String

i8oll
iCards Birthday New App title it ... )

\tem 4

Games
ltem l
ltem 2

A<ray
String

Animoill Park
Biology Quiz

String String
String

ltem 3
lte.m 4 liues Ut1

Calcuius Test New App ti tie


j lt(''T

Array

lte.m l
\tem 2

String
Stnng
String

Battery Monitor iSystemlnfo

ltem 3

NewApp title
If_

12.6. bra

304

Tulajdonsglistk hasznlata

7. Ha msodszor is futtatjuk az alkalmazst, kirja a oocuments knyvtrban . pl i st fjl tartalmt a De bugger Console abiakba Qsd a 12. 7. brt) .
~

lv

FilesHandling - Debugger Console

...,

The Debugger has ex i ted wi th status o. (Session started at 2009-09-0l 20:41:34 +0800.) lOOt-09-01 20:41:36.100 FllesBandling(lOllt:207J a string of te.xt.
(Sess1on started at 2009-09-01 20:41:41 +0800. J 2009-09-0l 20:tl 43.603 Fi.lesKan4llng(30322:207J 2009-09-01 20: U 43.605 FilesKa.ndli.ng(30l22 :2 07 J 2009-09-0l 20:41 t3.60S P'ilesllandling(30l22:207) 2009-09-0l 20:41 43.606 FilesHandling(30322:207J 2009-09-01 20 141:43.6 06 FUesBand.ling{ 30 321::207 J 2009-09-0l 20:41:43.607 FilesaancUing( 303 22: 207) 2009-09-0l 20:41:43.607 f'ileSB8Jldllng(JOJll:207) 2009-09-0l 20:41:43.607 FllesRandllng(30322:207) 2009-09-0l 20:41 :fo3.6 08 FllesHandllng(l0322:l07) 2009-09-01 20:41 : 43 .608 FilesKancUlng(JOl22 :2 07 J 2009-09-01 20 : 41 : 43 .609 FilesHa.ndling( 30322:207 J 2009-09-0l 20:41:43.609 Filesllandl.lng( 30322: 207) 2009-09-0l 20 :41: 43 .609 FilesHand11ng(JOJ22 :2 07) 2009-09-0J 20 : 41 : 43.610 P'Uesllandllng( 30122:207 J 2009-09-0l 20 :41: 43 .61 0 FUesHan4ling(30322:207) 2009-09-0l 20 :41:43.611 FilesHandling(J0322:207) 2009-09-01 20:41 :43.611 P'1lesll&ndl1ng(30l22: 207 J 2009-09-0l 20:41:43.611 P'UesKandling(JOJ22:207)

a string of text Entertainae.nt Eye 8alls - iBlower iBe ll leard.a Bi.rthd.ay New App title ,.._. AD.iaal Prk Biology Qui z calcuius Test New App title utilitles Battery Monitor isyst.ealnfo New App title

12.7. bra

Hogyan mkdik?
A plda els rsze bemutatja, hogyan adhatunk rulajdonsglista-fjlt az alkalmazsunkhoz. Hrom kulcsot adunk hozz a rulajdonsglista-fjlhoz, ezek mindegyike az AppStore-alkalmazsok kategriiba tartozik. Ezek a kvetkezk: Entertainment (szrakozs), Games Gtkok) s Utilities (segdprogramok). Az egyes kategrik tartalmazzk az alkalmazsnevek listjt. Az elem betltsekor elszr megprbljuk megkeresni az Ap ps. pl i st nev fjlt az alkalmazs oocuments knyvtrban: //---get the path to the property list file--NSString *plistFileName = [[self documentsPath] stringByAppendingPathComponent:@"Apps.plist"]; Ha megvan a fjl, akkor
betl~k

a tartalmt egy NSDictionary objekrumba:

//---if the property list file can be found--if ([[NSFileManager defaultManager] fileExistsAtPath:plistFileName])
{

//---load the content of the property list file into a NSDictionary ll object---

305

12. fejezet: Fjlkezels

NSDictionary *dict

[[NSDictionary alloc] initWithContentsDfFile:plistFileName];

ll ...
}

kvetkez lpsben Icilistzzuk a sztrobjektumban lv kulcsokat, s kirjuk az egyes alkalmazsneveket a Debugger Console ablakban:

//---for each category--for (NSString *category in dict)


{

NSLog(category); NSLog(@";;;=;;;"); //---return all titles in an array--NSArray *titles ; [dict valueForKey:category]; //---print out all the titles in that category--for (NSString *title in titles) NSLog(title);
}

[d i ct re l eas e] ;

Az alkalmazs
mappbl:

els

futsakor az Apps.plist fjl nem

rhet

el, ezrt betltjk a Resources

else { //---load the property list from the Resources folder--NSString *pListPath ; [[NSBundle mainBundleJ pathForResource:@"Apps" ofType:@"plist"]; NSDictionary *dict [[NSDictionary alloc] initWithContentsOfFile:pListPath];

// ...
}x

Mivel mdostjuk a sztrobjektumot, ltre kell hoznunk a sztrobjektum egy mdosthat pldnyt, s azt egy NSMutab l eDi ct i onary objektumhoz kell rendein nk: //---make a mutable copy of the dictionary object--NSMutableDictionary *copyofDict ; [dict mutablecopy]; Ez azrt fontos lps, mert az NSDi ct i onary objektum nem mdosthat, vagyis miutn feltltttk az elemeket a tulajdonsglistbl, nem adhatunk tartalmat a sztrobjektumSD hoz. Az N i ct i o na r y osztly mutab l ecopy metdust hasznlva ltrehozzuk a sztrobjektum talakthat pldnyt (NSMutab l eDi ct i onary).

306

Tulajdonsglistk hasznlata
Ezt tmbt: //---get all the different categories--NSArray *categoriesArray ; [[copyOfDict allKeys] sortedArrayusingselector:@selector(compare:)]; A tmb segtsgvel vgiglpdelhetnk a sztr sszes kulcsn, gy tovbbi neveket adhatunk az egyes kategrikhoz: //---for each category--for (NSString *category in categoriesArray) {
}
kveten

beolvassuk az talakthat sztrobjektum sszes kulcst tartalmaz

Az NSMutabl eDi ct i onary objektum az albbiak szerint nem vgezhet listzs t: for (NSString *category in copyofDict) { // ...
}

Ennek az az oka, hogy a listzs sorn nem adhat elemeket az NSMutab l eDi c ti onary objektumhoz. Ezrt az NSArray objektum segtsgvel hurkot kell hasznlnunk. A hurkon bell kinyerjk az egyes kategrikhoz tartoz valamennyi alkalmazs nevt, s ltrehozzuk a tmb talakthat msolatt, amely az alkalmazsok neveit tartalmazza: //---get all the app titles in that category--NSArray *titles; [dict valueForKey:category]; //---make a mutable copy of the array--NSMutableArray *mutableTitles ; [titles mutablecopy]; Adjunk j nevet az alkalmazsok nevt tartalmaz talakthat tmbnek: //---add a new title to the category--[mutableTitles addobject:@"New App title"]; Miutn hozzadtuk a tovbbi elemet az talakthat tmbhz, llitsuk vissza a tmbt az talakthat sztrobjekturnra: //---set the array back to the dictionary object--[copyOfDict setobject:mutableTitles forKey:category]; [mutableTitles release];

307

12. fejezet: Fjlkezels

Vgl a wri teToFil e: atomi ca ll y: metdus hasznlatval fjlba rjuk az talakthat sztrobjektumot:
//---write the dictionary to file--fileName = [[self documentsPath] stringByAppendingPathcomponent:@"Apps.plist"]; [copyofoict writeToFile:fileName atomically:YES]; [d i ct re l eas e] ; [copyofoict release];

SSZEFOGLALS
A fejezetben bemutattuk, hogyan rhatunk fjlokat az iPhone fjlrendszerbe, s hogyan olvashatjuk vissza azokat. Azt is megnztk, hogy miknt jelenthetk meg a strukturlt adatok tulajdonsglista hasznlatval, s hogyan lehet programozottan hasznlni a tulajdonsglistkat a sztrobjektumok segtsgveL A kvetkez fejezetben bemuta~uk, hogyan lehet sszetettebb adatokat trolni adatbzisok felhasznlsval.

1. Mire lehet hasznlni az alkalmazsmappn belli klnfle mappkat? 2. Mi a klnbsg az NSDi ct i onary s az NSMutab l eDi ct i onary osztlyok kztt? 3. Hogyan adbat meg a oocuments s a tmp mappk elrsi
~a

vals eszkzn?

A FEJEZET TUDNIVALI
Tma
Az alkalmazsmappn belli

Alapelvek Documents, Li brary s tmp NSArray *paths = NSSearchPathForoirectoriesinDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsoir = [paths objectAtindex:O]; -(NSString *) tempPath { return NSTemporaryDirectory(); if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
}

alknyvtrak
A oocuments knyvtr elrsi

tjnak beolvassa

A tmp knyvtr elrsi tjnak

beolvassa
A fjl megltnek ellenrzse

308

Tulajdonsglistk haszn lata

Tma
A Documents knyvtr helye

Alapelvek
/private/var/mobile/Applications/<application_id>/ Documents/ / private/ var/ mobile / Applications / <application_id>/tmp/ NSString *pListPath ; [[NSBundle mainBundleJ pathForResource:@"Apps" ofType:@"plist"]; NSDictionary *dict ; [[NSDictionary alloc] initwithcontentsOfFile:pListPath]; NSMutableoictionary *copyofoict ; [dict mutablecopy];

vals eszkzn
A tmp knyvtr helye vals

eszkzn Tulajdonsg betltse a Resources mappbl


Az NSDi c ti onary objektum

talakthat pldnynak ltrehozsa

309

Adatbzis-trols az SQLite3 hasznlatval


A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan hasznlhatjuk az SQLite3 adatbzist az Xcode-projektjeinkben? Hogyan hozhatjuk ltre s nyithatjuk meg SQLite3 adatbzisunkat? A klnfle SQLite3-fggvnyek segtsgvel hogyan hajthatunk vgre SQLszttingeket? Az sszekapcsolt vltozk segtsgvel hogyan illeszthetnk rtkeket SQLsztringekbe?

Az

elz fejezetben megvizsgltuk, hogyan biztosthatjuk az adatok llandsgt fjlok segtsgveL Egyszer alkalmazsoknl a megrizni kvnt adatokat egyszer szveges fjlba rhatjuk. A strukturltabb adatok szmra tulajdonsglistt kszthetnk Nagyobb mennyisg s sszetettebb adatok esetn hatkonyabb az informcikat adatbzisban trolni. Az iPhone az SQLite3 adatbzisknyvtrat biztostja ehhez. Ha az adatainkat adatbzisban troljuk, az alkalmazsunk feltltheti a Table nzetet, vagy nagyobb menynyisg adatot strukturltan kpes trolni. Ebben a fejezetben megvizsgljuk, hogyan hasznlhatjuk a begyazott SQLite3 adatbzist az alkalmazsainkban.

13. fejezet: Adatbzis-trols az SQLite3 hasznlatval

Az SQLite3 hasznlata
Ha az SQiite3 adatbzist szeretnnk az alkalmazsunkban hasznlni, elszr a l i bsq l i te 3. dyl i b knyvtrat kell az Xcode-projektnkhz adni. A kvetkez gyakorlati rszben ennek a mdjt vizsgljuk meg rszletesen. Ehhez s a fejezet tovbbi gyakorlataihoz le kell tltennk a megjellt kdfjlokat.
A projekt
elksztse

az SQlite3 hasznlatra
A progromkd [Databases.ifp} a liVrox .com oldalrril tlthet le.

1. Hozzunk ltre egy j nzeralap alkalmazs- (View-based Application) projektet az Xcode segtsgvel, s nevezzk el Databases-nek.

2. Kattintsunk jobb gombbal a projektnk Frameworks mappjra, s a mensvban vlasszuk a Project ~ Add to Project (projekt ~ hozzads a projekthez) lehetsget 3. Navigljunk a / Devel oper/ Pl atforms/i Phonesimulator . pl atform/Developer/SDKs/ iPhonesimulator<version>. sdk/usr/ lib mapphoz, s vlasszuk a libsqlite3 . dyl i b fj lt.

._. Copy items inro denination group's folder (if needed)

Re ference Type: : Relative to Current SOK


Text Encodmg ; UniCode (UTF- 8)

:J

RecurslVely create groups for any added fo lders

O Cre.ate Folder ReJereneu for any added folde.rs

r::

" '

\tr i

'--------------.J

l l

l"'._-:=:::::':"":::"'::::::::=(== =)::::"(A: :J ' Can cel :dd::')


13.1. bra

312

Az SQLite3 hasznlata

Megjegyzs A <version> az iPhone SDK-nak azt a verzijt jelenti, amelyet pl

pen hasznlunk. Ha pldul a 3.1-es verzit hasznljuk, az tvonal a kvetkez : /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/usr/lib.

4. Amikor az Add prbeszdablak megjelenik, kapcsoljuk ki a Copy ltems into Destinatien Group's Folder (If Needed) (elemek msolsa szksg esetn a clcsoport mappjba) jellngyzetet, s a referencia tpusa szmra (a 13.1. brnak megfelelen) vlasszuk a Relative to Current SOK lehetsget. 5. A oatabasesvi ewcontroll er. h fjlban deklarljunk egy sql i te3-tpus vltozt, valarnint egy fi l e Path #import <UIKit/UIKit.h> #import "sqlite3.h" @inte rface oatabasesviewcontroller : urviewcontroller { sqlite3 *db;
nev

metdust (lsd a flkvr

betkkel

szedett kdot):

-(NSString @end

*)

filePath;

6. A Databasesviewcontroller.m fj lban definiljuk a filePath metdust a flkvr betkkel szedett kd szerint: #import "oatabasesviewcontroller.h" @impl ementation oatabasesviewcontroller -(NSString *) filePath { NSArray *paths = NSSearchPathForoirectoriesrnoomains ( NSDocumentDirectory, NSUseroomainMask, YES); NSString *documentsoir = [paths objectAtindex:O]; return [documentsDir stringByAppendingPathcomponent:@"database.sql"];

- (void)viewoidLoad { [super viewoidLoad];

@e nd

313

13. fejezet: Adatbzistrols az SQLite3 hasznlatval

Hogyan mkdik?
Ha az SQLite3-mal szeretnnk dolgozr, az alkalmazsunkat ssze kell kapcsolnunk a libsqlite3.dylib dinarrkus knyvtrraL A kivlasztott libsqlite3.dylib knyvtr egy alias az SQLite3 knyvtr legjabb verzijhoz. Az iPhone-eszkzkn a l i bsql i te 3. dyl i b knyvtrat a / us r/l i b/ mappban tallj uk. SQLite adatbzis hasznlathoz sql i te 3- tpus objektumot kellltrehozn unk:
sqlite3 *db;

A fi l ePath metdus visszaadja az SQLite adatbzis teljes elrsi tvonalt. Az adatbzist az alkalmazs az iPhone-eszkznkn a Documents knyvtrban hozza ltre (az alkalmazs sandboxban):
-(NSString *) filePath { NSArray *paths = NSSearchPathForoirectoriesinDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsoir = [paths objectAtindex:O]; return [documentsDir stringByAppendingPathcomponent:@"database.sql"];
}

Megjegyzs A 12. fejezetben rszletesen megvizsgltuk a mappkat, amelyekhez az alkalmazsunk sandboxban hozzfrnk.

Adatbzis ltrehozsa s megnyitsa


Miutn a szksges knyvtrat a projekthez adtuk, megnyithatunk egy adatbzist, s hasznlhatjuk. A kvetkez gyakorlati rszben kiderl, hogy az SQLite3 klnbz C fggvnyeit alkalmazzuk az adatbzis ltrehozshoz vagy megnyitshoz.
Adatbzis megnyitsa

1. A korbbiakban ltrehozott projekt segtsgvel definiljuk az openos metdust a Databasesvi ewcont ro ll e r. m fjlban:
#import "oatabasesviewcontroller .h " @implementation Databasesviewcontroller -(NSString *) filePath { // ...

314

Adatbzis ltrehozsa s megnyitsa


-(void) openos { 11---create database--if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK) { sqlite3_close(db); NSAssert(O, @"Database failed to open.");
} }

- (void)viewoidLoad { [self openDB]; [super viewDidLoad];

@end

Hogyan mkdik?

Az sqlite3_open() C fggvny megnyitja azt az SQLite adatbzist, amelynek fjlnevt


els

argumentumknt hatrozzuk meg:

[[self filePath] UTF8String]

Ebben az esetben az adatbzis fjlnevt C sztringknt hatrozzuk meg az NSStri ng osztly UTF8String metdusnak a segtsgve!, az sqlite3_open() C fggvny ugyanis nem tud NSString objektummal dolgozni. A msodik argumentum tartalmazza az sqlite3 objektum nyelt (handle), amely ebben az esetben a db. Ha az adatbzis a rendelkezsre ll, a fggvny megnyitja. Ha nem tallja a meghatrozott adatbzist, ltrehoz egy jat. Ha az adatbzis sikeresen megnyilik, a fggvny a O rtket adja vissza (amelyet az SQLITE_OK lland kpvisel). A http: l lwww. sql i te. orglc3reflc_abort. htm l webhelyrl szrmaz kvetkez lista bemutatja a klnbz SQLite-fggvnyektl eredmnyknt visszakapott kdot:
#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define SQLITE_OK SQLITE_ERROR SQLITE_INTERNAL SQLITE_PERM SQLITE_ABORT SQLITE_BUSY SQLITE_LOCKED SQLITE_NOMEM SQLITE_READONLY SQLITE_INTERRUPT SQLITE_IOERR SQLITE_CORRUPT SQLITE_NOTFOUND SQLITE_FULL SQLITE_CANTOPEN

o l*
l

2 3 4
5 6 7 8 9 10
ll

12 13 14

l* l* l* l* l* l* l* l* l* l* l* l* l* l*

successful result *l SQL error or missing database *l Internal logic error in SQLite *l Access permission denied *l Callback routine requested an abort *l The database file is loeked *l A table in the database is loeked *l A malloc() failed *l Attempt to write a readonly database *l Operation terminated by sqlite3_interrupt()*l some kind of disk IlO error occurred *l The database disk image is malforrned *l NOT USED. Table or record not found *l Insertion failed because database is full *l unable to open the database file *l

315

13. fejezet: Adatbzis-trols az SQLite3 hasznlatval #define #define #define #de fi ne #define #define #define #define #define #define #de fi ne #define #define #define SQLITE_PROTOCOL SQLITE_EMPTY SQLITE_SCHEMA SQLITE_TOOBIG SQLITE_CONSTRAINT SQLITE_MISMATCH SQLITE_MISUSE SQLITE_NOLFS SQLITE..AUTH SQLITE_FORMAT SQLITE_RANGE SQLITE_NOTADB SQLITE_ROW SQLITE_DONE 15 16 17 18 19 20 21 22 23 24 25 26 100 101

l* NOT USED. Database lock protocol error


/* Database is empty */

*/

/* /* /* /* /*

l* l*
/*

/* /* /* /*

The database schema changed */ st ri ng or BLOB exceeds size limit */ Abort due to constraint vialation *l Data type mismatch */ Library used incorrectly */ uses os features not supported on host */ Authorization denied */ Auxiliary database forrnat error */ 2nd parameter to sqlite3_bind out of range *l File opened that is not a database file */ sqlite3_step() has another row ready */ sqlite3_step() has finished executing */

A ltrehozott adatbzis vizsglata


Ha sikeresen elkszlt az adatbzis, az alkalmazsunk sandboxban a Documents mapp ban tallj uk. Az alkalmazsunk Documents mappjt az iP h one Simulatoron a -/Li brary/ Application support/ i Phone Simulator/User/ Applications/<App_ID>/ Documents/ knyv trban is elhelyezhetjk Osd a 12. fejezetet) . A 13.2. bra a database. sql fjlt
muta~a

be.

Maontosh HD

t:i !01Sk
.. PlA<IS

Documents l darabast sal

A Desktop
~ wttme:nglee

Ubrarv
tm p

Apphc.atlons
Oocume.nls

13.2. bra

Tbla ltrehozsa
Az adatbzis ltrehozst kveten elkszthetnk egy tblt az adatok trolshoz. A kvetkez gyakorlati rszben megnzzk, hogy h ogyan valsthatunk m eg egy tblt kt szveges mezvel. Pldakppen hozzunk ltre egy contacts tblt, amely a kvetke z kt m ezvel rendelkezik: email s name.

31 6

Adatbzis ltrehozsa s megnyitsa

Tbla ltrehozsa

Ez a folyamat egyetlen
tdust:

lpsbl

ll. A fejezet korbbi rszben ltrehozott projekt segt-

sgvel a kvetkezkppen definiljuk a createTabl eN ame d :wi th Fi el dl:withFi el d 2: me-

#import "oatabasesvi ewcontro ll er. h" @implementation oatabasesviewcontroller -(NSString *) filePath {


// .. o

-(void) openos
// .. o

-(void) createTableNamed:(NSString *) tableName withFieldl:(NSString *) fieldl withField2:(NSString *) field2 { char *err; NSString *sql = [NSString stringwithFormat: @"CREATE TABLE IF NOT EXISTS '%@' ('%@' TEXT PRIMARY KEY, '%@' TEXT);", tableName, fieldl, field2]; if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { sqlite3_close(db); NSAssert(O, @"Tabled failed to create.");
} }

- (void)viewoidLoad { [self openDB]; [self createTableNamed:@"Contacts" withFieldl:@"email" withField2:@"name"]; [super viewoidLoad]; @ end

Hogyan mkdik?
A createTableNamed:withFieldl:withField2: metdus a kvetkez hrom paramterrel mkdik: tab l eName, fi e l dl s fi e l d 2. A paramterekkel elszr ellli~uk az SQL-sztringet, majd az sqliteLexec() C fggvny alkalmazsvalltrehozunk egy tblt. A fggvny
argumentumai rendkvl fontosak: az sqlite3 objektum, az SQL lekrdezsi sztring s a hibazenetek vltozjnak a mutatja. Ha az adatbzis ltrehozsa sorn hiba lp fel, az NSAssert metdussallellitjuk az adatbzist, s lezrjuk az adatbzis-kapcsolatot.

317

13. fejezet : Adatbzis-trols az SQLite3 hasznlatval

A 13.3. brn a contacts tbla lthat, amely a mvelet sikeres vgrehajtsa utn jn ltre.
email name

J
-___J

13.3. bra

ll

Megjegyzs Az SOL-nyelv alapjainak megismershez tanulmnyozzuk a ht tp: l /w3schoo ls. com/ sq l l de fau l t. as p webhelyen tallhat SOL-bevezett.

Rekordok beszrsa
Miutn ltrehoztuk a tblt, feltlthetjk adatokkal, s beszrhatunk nhny rekordot.

A kvetkez gyakorlati rsz bemutatja, hogyan amelyet az elz rszben hoztunk ltre.
Rekordok beszrsa

rha~uk

azt a kt rekordsort a tblba,

1.

A korbbiakban ltrehozott projekt segtsgvel a kvetkezkppen definiljuk az insertRecordintoTableNamed:withFieldl:fieldlvalue:andField2:field2Value :


metdust, tovbb a flkvr betkkel szedett kd alapjn m dos~uk a vieWDidLoad metdust:

#import "oatabasesviewcontroller.h" @i mplementation Databasesviewcontroller -(NSString // ...


}
*)

filePath {

-(void) openos { l l ...

-(void) createTableNamed: (NSString wit hFieldl :(NSString *) fieldl withField2:(NSString *) field2 { // .. .

*)

tableName

318

Adatbzis ltrehozsa s megnyitsa


-(void) insertRecordintoTableNamed: (NSString * ) tableName withFieldl: (NSString *) fieldl fieldlvalue: (NSString * ) fieldlvalue andField2: (NSString *) field2 field2value : (NSString *) field2Value { NSString *sql = [NSString stringwithFormat: @"INSERT OR REPLACE INTO '%@' ('%@', '%@') VALUES ('%@' tableName, fieldl, field2, fieldlvalue, field2value];

, '%@')" ,

char *err; if (sqlite3_exec(db , (sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { sqlite3_close(db); NSAssert(O, @"Error updating table.");
} }

- (void)viewoidLoad { [self openDB]; [self createTableNamed :@" contacts " wi thFieldl :@"emai l" withField2 :@ "name"]; for (int i=O; <=2; ++)
{

NSString *email = [[NSString alloc] initWithFormat: @"user%d@l earn2develop. net", i J; NSString *name= [[NSString alloc] initWithFormat: @"user %d",i] ; [self insertRecordintoTableNamed:@"Contacts " withFi eldl:@"email" fi eldlvalue :email andField2:@"name" field2Value:name];

} [super viewoidLoad];

@ end

Hogyan mkdik?
Ez a programkd hasonlt az elz pldhoz. Elksztjk az SQL-sztringet, majd az sql i te3_exec () C fggvnnyel beszrunk egy rekordot az adatbzisba:
NSString *sql = [NSStri ng stringwithFormat: @ "INSERT OR REPLACE INTO ' %@ ' (' %@ ' , ' %@ ' ) VALUES (' %@ ' tableName, fieldl, f i eld2 , f i eldlval ue , field 2value];

, ' %@ ' )"' ,

char *err ; TF8String) , NULL, NULL , &err) != SQLITE_OK) i f (sqlite3_exec(db, (sql U { sqlite3_close(db); NSAssert (O, @ "Error updat i ng table. ");

319

13. fejezet: Adatbzistrols az SQLite3 hasznlatval

A vi ewoi d Load metdusban az i nsert:Recordint:oTab l eN ame d :wi t: h Fi e l dl: fi e l dlva l ue: and Fi el d 2: fi el d2val ue: metdus illvsval kt rekordot helyeznk el az adatbzisban:
for (int: i=O; i<=2; i++)
{

NSSt:ring *email = [[NSSt:ring alloc] init:WithFormat: @ "user%d@learn2develop.net:",i]; NSString *name= [[NSSt:ring alloc] init:Wit:hFormat: : @"user %d",i]; [self insert:Recordint:oTableNamed:@"Cont:act:s" wit:hFieldl:@"email" fieldlvalue:email andField2:@"name" field2Value:name];

A 13.4. brn a sorok beszrst


email

kveten

a tbla tartalma lthat.


name

userO@Ieam2developJlet userl@learn2develop.net

user O user l

13.4. bra

Vltozk sszekapcsolsa
Az SQL-sztringek kialaktsakor az egyik gyakori teendnk az rtkek beszrsa a lekrdezsi sztringbe, valamint a sztring helyes sszellitsnak a biztostsa, tovbb annak ellenrzse, hogy a sztring nem tartalmaz-e rvnytelen karaktereket. Az elz rszben lthattuk, hogy az adatbzisban a sorok beszrshoz az SQL-utastsunkat a kvetkezkppen kell megfogalmazni:
NSSt:ring *sql = [NSSt:ring st:ringWit:hFormat: "INSERT OR REPLACE INTO '%@' ( ' %@ ', ' %@ ') VALUES ( '%@', '%@')", @ tableName, fieldl, field2, fieldlvalue, field2value];

char *err; if (sqlite3_exec(db, [sql UTF8St:ring], NULL, NULL, &err) != SQLITE_OK)


{

sqlite3_close(db); NSAssert:(O, @"Error updating table.");

Az SQLite az SQL-sztring sszellirshoz tmogatja azt a szolgltatst, amely a vltozk iisszekapcsolst biztostja. Az elz SQL-sztringet pldul a kvetkezkppen lehet szszekapcsolt vltozk segtsgvel sszelltani:

320

Adatbzis ltrehozsa s megnyitsa NSString *sqlstr = [NSString stringWithFormat: @"INSERT OR REPLACE INTO ' %@ ' (' %@ ' , ' %@ ') VALUES ( ? , ?) ", tableName, fieldl, field2] ; const char *sql = [sqlStr UTF8String]; Itt a ?
helyrz,

amelyet a lekrdezs tn yleges rtkvel helyettesthetnk. H a azt feltelz

telezzk, h ogy az

utastsban a t ab l eN ame a contacts, a fi e l dl az email, s a fi e l d2


megfelele rr

a name, az sql az albbiaknak

n z ki:

INSERT OR REPLACE INTO Contacts ('email' , 'name') VALUES (? ,?)

Megjegyzs A? kizrlag az SQL-utasts VALUES and WHERE rszben helyezhet el; nem illeszthet pldul tbla nevbe. A kvetkez utasts rvnytelen lenne: INSERT OR REPLACE INTO? ('email', 'name') VALUES (?,?).

H aszeretnnk rtkeke t helyettesteni a ? helyre, az SQL-sztrin get az sqlite3_stmt o bjektum m egvalstsval s az sql i te3_prepare_v2 O fggvny alkalmazsval hozhatjuk binri s form ra, s a kve tk ez k pp en illeszthetj k be a h el y rz rtkeket az sq l i te Lb i nd_text() fggvnnyel: sqlite3_stmt *statement; i f (sqlite3_prepare_v2(db, sql, - 1 , &statement, nil)== SQLITE_OK { ) sqlite3_bind_text(statement , l , [fieldlvalue UTF8String], - 1, NULL) ; sqlite3_bind_text(statement, 2, [fiel d2value UTF8String], - 1, NULL) ;

Megjegyzs Int eg" rtkek ~'ekapolsho' ., sq,; Lbi nd_.i "' 0


fggvnyt kell hasznlnunk.

Az elz hvs utn az SQL-sztring a kvetkez kpp en alakul: INSERT OR REPLACE INTO Contacts ( 'email' , 'name') VALUES ( 'user0@ learn2develop.net', 'userO' ) Az SQL-utasts vgreh ajtshoz az sqlite 3_step() fggvnyt haszn lj uk, m ajd az sql i te 3_fi nal i ze() fggvny segtsgvel trljk az elksztett SQ L-utastst: if (sqlite3_step(statement) != SQLITE_DONE) NSAssert(O, @ "Error updating table . ") ; sqlite3_finalize(statement);

321

13. fejezet: Adatbzis-trols az SQLite3 hasznlatval


~

Megjegyzs Az elz rszben az sql i teLexecO fggvny alkalmazsval hajtottunk vgre SQL-utastsokat. Ebben a pldban az sqliteLprepare(), az sqliteLstep() s az sqliteLfinalize() fggvnyek kombincijval valstjuk meg ugyanezt. Az sqliteLexec() fggvny tulajdonkppen ennek a hrom fggvnynek a wrappere. Nem lekrdezsekkel kapcsolatos SQLutastsokban (pldul tblk ltrehozsa, sorok beszrsa s tovbbi mve letek sorn) mindig tancsosabb az sql i teLexecO fggvnyt hasznlni.

Rekordok beolvassa
Miutn sikeresen beillesztettk a rekordokat a tblba, ki is kell olvasnunk onnan az adatokat. Ezzel biztostjuk, hogy az adatokat valban mentsk. A bemutatja a rekordok beolvasst.
kvetkez

gyakorlati rsz

Rekordok beolvassa
l.

A fejezetben korbban ltrehozott projekt segtsgvel definiljuk a kvetkezkppen a ge tA ll RowsFromTabl eN ame d: metdust, valamint a flkvr betkkel
szedett kd alapjn mdostsuk a vi ewoi d Load metdust:

#import "Databasesvi ewcontroller. h" @implementation Databasesviewcontroller -(NSString *) filePath { // ...

-(void) openos { // . . .

-(void) createTableNamed:(NSString withFieldl:(NSString *) fieldl withField2:(NSString *) field2 { // ...

*)

tableName

-(void) insertRecordintoTableNamed: (NSString *) tableName withFieldl: (NSString *) fieldl fieldlvalue: (NSString *) fieldlvalue andField2:(NSString *) field2 field2value: (NSString *) field2value {

// . ..

322

Adatbzis ltrehozsa s megnyitsa


-(void) getAllRowsFromTableNamed: (NSString *) tableName { //---retrieve rows--NSString *qsql = @"SELECT * FROM CONTACTS"; sqlite3_stmt *statement; if (sqlite3_prepare_v2( db, [qsql UTF8String], -1, &statement, nil) SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) { char *fieldl =(char*) sqlite3_column_text(statement, O); NSString *fieldlstr = [[NSString alloc] initwithUTF8String: fieldl]; char *field2 =(char*) sqlite3_column_text(statement, l); NSString *field2str [[NSString alloc] initWithUTF8String: field2]; NSString *str NSLog(str); [fieldlstr release]; [field2str release]; [str release]; } //---deletes the compiled statement from memory--sqlite3_finalize(statement);
}

[[NSString alloc] initwithFormat:@"%@- %@", fieldlstr, field2str];

- (void)viewoidLoad { [self openDB]; [self createTableNamed:@"contacts" withFieldl: @ "email" withField2: @ "name" ]; for (int i=O; i <=2 ; i++)
{

NSString *email = [[NSString alloc] initWithFormat: @ "user%d@learn2develop.net",i]; NSString *name = [[NSString alloc] initWithFormat: @ "user % d",i]; [self insertRecordintoTableNamed:@"contacts " withFieldl:@"email" fieldlvalue:email andField2:@"name" field2Value:name];
}

[self getAllRowsFromTableNamed:@"Contacts"]; sqlite3_close(db); [super viewoidLoad] ;

@ end

323

13. fejezet: Adatbzis-trols az SQLite3 hasznlatval

2. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst teszteljk Nyomjuk meg a Command-Shift-R gombot az Xcode-ban a Debugger Console ablak megjelentshez. Arnikor az alkalmazs betltse befejezdtt, a rekordok a Debugger Console-on jelennek meg (lsd a 13.5. brt). Lthat, hogy a sarok valban a tblban vannak.
....._ Da.tabases - Debugger Console

( session started at 2009-09-19 14: l l : 2S +0 800. 1 2009-09-19 1& : 11 : 27 . 761 Dllltabases(7fo75 : 207) uaer0flea.l'112ctavelop.aat. -user O 2009-0t-n U : ll:Z7.710 oata.bases{7475:201 ) u.aerlllea.n..Zd.eelop . aet- user 1 2009-0919 lt:ll : 27.771 Databasest7fo75 : 207) user2tlaarn.2develop . net.- user 2

13.5. bra

Hogyan

mkdik?

Ha szeretnnk rekordokat beolvasni a tblb~ elszr elksztjk az SQL-utastst, majd az sqliteLstep() fggvny segtsgvel vgrehajtjuk Az sqliteLstep() fggvny a 100-as rtket adja vissza (amelyet az SQLITE_ROW lland kpvisel), ha msik sor is a rendelkezsre ll. Ebben az esetben whi l e ciklus segtsgvel hvjuk az sql i teLstep() fggvnyt, s a ciklus mindaddig folytatdik, amg a visszatrsi rtk nem lesz QLITE_ROW:
if (sqlite3_prepare_v2( db, [qsql UTF8String], -1, &statement, nil) SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW)
{

char *fieldl =(char*) sqlite3_column_text(statement, O); NSString *fieldlstr = [[NSString alloc] initWithUTF8String: fieldl]; char *field2 =(char*) sqlite3_column_text(statement, l); NSString *field2Str = [[NSString alloc] initWithUTF8String: field2]; NSString *str NSLog(str); [[NSString a ll oc] initwithFormat:@"%@ - %@", fieldlStr, field2Str];

324

Adatbzis ltrehozsa s megnyitsa


[fieldlStr release]; [field2Str release]; [str release];

} //--- deletes the compiled statement from memory--sqlite3_finalize(statement);

A sorban az els mez rtknek beolvasshoz az sqlite3_column_text() fggvnyt hasznljuk. A fggvnynek az sqlite3_stmt objektumot, valamintabeolvasand mez indext adjuk t. A visszaadott sor kdot hasznljuk: char *fieldl =(char*) sqlite3_column_text(statement, 0); Integer oszlop (mez) beolvasshoz alkalmazzuk az sqlite3_column_int() fggvnyt.
els mezjnek

beolvasshoz pldul a

kvetkez

SSZEFOGLALS
A fejezet rvid bevezetst nyjtott az iPhone okostelefonokon hasznlatos SQLite3 adatbzisok tmakrbe. Az SQLite3 segitsgvel hatkonyan trolhatjuk strukturlt adatainkat, valamint az informcik bonyolult aggregciit hajtha~uk vgre.

1.

Mi a klnbsg az s qliteLexec() fggvny s a

kvetkez

hrom fggvny kztt:

sqlite3_prepare(), sqlite3_step() s sqlite3_finalize()?

2.
3.

Hogyan ksztnk C-stlus sztringet egy NSStri ng objektumbl? Ksztsk el azt a programkdszegmenst, amely sorokat o lvas be egy tblbl.

A FEJEZET TUDNIVALI
Tma
SQLire3 adatbzis hasznlata az alkalmazsunkban C sztting kinyerseNSString objektumbl SQLire3 adatbzis ltrebozsa s megnyitsa SQL-Iekrdezs vgrebajtsa Adatbzis-kapcsolat lezrsa

Alapelvek
A projektnkhz a l i bs ql i te 3. d y l i b hivatkozsr kell hozzadni.

Hasznljuk az NSStri ng oszrly UTF8Stri ng metdust. Hasznljuk az sq l i te3_open () C fggvnyt. Hasznlj uk az sql i teLexecO C fggvnyt. Hasznljuk az sql i te 3_cl o se() C fggvnyt.

325

13. fejezet: Adatbzis-trols az SQLite3 hasznlatval


Tma
Kapcsolt vltozk hasznlata

Alapelvek
H ozzunk ltre sql i teLstmt objektumot. Hasznljuk az sqlite3_prepare_v2() C fggvnyt, s ksztsk el az utastst. Az sql i te3_bi nd_text() (vagy az sql i te3_bi nd_ i nt() s gy tovbb) C fggvny segtsgvel illesszk az rtkeket az utasts ba. Hasznljuk az sql i te3_step() C fggvnyt, s hajtsuk vgre az utastst. Hasznljuk az sqlite3_finalize() C fggvnyt, s trljk az utastst a memribl. Hasznljuk az sq l i te3_step () C fggvnyt, s olvassuk be az egyes sorokat. Hasznljuk az sq l i te3_co l umn_text () (vagy az sqlite3_column_int() s gy tovbb) C fggvnyt.

Rekordok beolvassa Rekordok beolvassa egy sorbl

326

~--::::~---.::-----------

-.....o~-

'--s2'.
~-;.

'"'

RSZ
Fej lett i Phone-programozsi mdszerek
14. Tbbrintses alkalmazsok programozsa .... 329 15.
Egyszer

animcik ......................................... 349

16. A beptett alkalmazsok elrse ...................... 365 17. Hozzfrs a hardverhez .................................. 391

Tbbrintses alkalmazsok programozsa


A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan szleljk alkalmazsunkban az rintseket? Hogyan tehetnk klnbsget egyes s tbbes rints kztt? Hogyan valsthatjuk meg a csptetsgesztus t? Hogyan valsthatjuk meg a hzsgesztust?

Az iPhone egyik legfontosabb vonzereje a

kpern yje, amely kpes a bemenetet tbb ponton egyszerre szlelni. A tbbrintses bemenet a felhasznl s az alkalmazs termszetes egyttmkdst biztostja. A tbbrintses szolgltatsnak ksznheterr a mobil Safari webbngsz az okostelefonok egyik leginkbb felhasznlbart verzija. Ebben a fejezetben megismerkednk azzal, hogy hogyan szlelhetjk az rintseket az alkalmazsunkban, s hogyan valsthatjuk meg azokat a szolgltatsokat, amelyek tkletestik a felhasznl s az alkalmazs - pldul a Jigsaw Puzzle - kztti egyttm kdst. Az rintsek szlelsvel a felhasznl a kijelzn trendezheti a kpeket az alkalmazsunkban, valarnint a csptetsgesztussal mdosthatja a kpek mrett.

14. fejezet: Tbbrintses alkalmazsok programozsa

rintsek rzkelse
Elszr

meg kell ismerkednnk nhny olyan esemnnyel, amelyek az rintsek szlelst kezelik. gy rzkelhetjk, hogy a felhasznl egyszer vagy ktszer rintette-e meg az alkalmazsunkat, s ennek megfelelen reaglhatunk A kvetkez gyakorlati rszhez le kell tltennk a megjellt programkdot. rintsek szlelse
A programkd [MulttTouch.ifp] a Wrox.com oldalrl tolthel le.

1. Hozzunk ltre egy j nzetalap alkalmazs- (View-based Application) projektet

az Xcode segtsgvel MultiTouch nven. 2. Hzzunk egy kpet a Resources mappba. A 14.1. brn az az apple .jpeg kp lthat, amely a Resources mappban van.

~
ll>
jllo

MultiTouchVie:wContr
M~mWindow. xtb

Muhrrooch- lnfo.phs!

Fr.une:works

Products

e n.rge:u ll> <.J. Enc::utabl6


Errors 11nd Warntngs Find Re:sults ..,

.. L:!JBoolululrks , .. SCM

Pro.tea Svmbols lmple:me:nution Files


.. . NI!Files

14.1. bra

3. Kattintsunk ktszer a MultiTouchviewcontroller . xib fjira ahhoz, hogy az Interface Builderben szerkesszk. 4. Tltsk fel a View ablakot az ImageView nzettel. az Imageview eltakarja a teljes View ablakot.
Gyzdjnk

meg rla, hogy

330

rintsek rzkelse

5. Vlasszuk az ImageView nzetet, s nzzk meg az Attributes ablakt Osd a 14.2. brt) . llitsuk az Image tulajdonsg rtkt apple.jpeg-re.

AJ ph;~
bckground
Tg Drawing

1.00

:l

0 Op.aqut: 0 H1dden 0 Oe:ar Contut Before Dnwtng C Olp Subvlews


~ AutoresiZe Subvit:ws

lntenction

O User lnter.actlon En<~bl ed O MulttJ)tt: Touch

14.2. bra

6. Adjuk hozz a MultiTouchviewcontroller.h fjlhoz a dett utastst: #import <UIKit/UIKit. h> @i nterface MultiTouchviewcontroller IBOutlet UIImageview *imageview; UIViewcontroller {

kvetkez

flkvren sze-

@property (nonatomic, retain) urimageview *imageview; @end 7. Az Interface Builderben, Conttol-kattints mellett hzzuk r a File's Owner elemet az ImageView nzette. Vlasszuk az Imageview l ehetsget. 8. Adjuk hozz a MultiTouchvi ewcontroll er. m fjlhoz a dett utastst:
kvetkez

flkvren sze-

331

14.fejezet: Tbbrintses alkalmazsok programozsa #import "Multi Touchviewcontroller.h" @implementation MultiTouchviewController @synthesize imageview; //---fired when the user finger(s) touches the screen---(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event { //---get all touches on the sereen--NSSet *allTouches ~ [event allTouches]; //---compare the number of touches on the screen--switch ([allTouches count])
{

//---single touch--case 1: { //---get info of the touch--UITouch *touch ~ [[allTouches allobjects] objectAtindex:O]; //---compare the touches--switch ([touch tapcount])
{

//---single tap--case 1: { imageview.contentMode } break; //---double tap--case 2: { imageview.contentMode } break;


}

urviewcontentModescaleAspectFit;

urviewcontentModecenter;

} break;
} }

- (void)dealloc { [imageView release]; [super dealloc];


}

9. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatorban teszteljk 10. A nagytshoz rintsk meg egyszer az almaikont. Ezutn rintsk meg ktszer, s az ikon ismt eredeti mret lesz Qsd a 14.3. brt) .

332

rintsek rzkelse

14.3. bra

Hogyan mkdik?
Ez az alkalmazs az iPhone vagy az iPod Touch kijelzjn rzkeli a felhasznl rintst. Amikor a felhasznl megrinti a kij elzt, a nzet vagy az elemvezrl olyan esemnyek sorozatt indtja el, amelyeket kezelhetnk Ngy ilyen esemny ll a rendelkezsnkre: touchesBegan :withEvent: touchesEnded:withEvent: touchesMoved :withEvent: touchescancelled:withEvent:

A touchesBegan: wi th Event: esemny akkor indul el, amikor az alkalmazs legalbb egy
rintst rzkel a kijelzn. Ezzel az esemnnyel megllapthatjuk, hogy hny ujj rinti a kpernyt, ha a UIEvent ob jekrum (event) allTouches metdust hvjuk: //-- -get all touches on the s e reen--NSSet *allTouches = [event allTouches];

333

14. fejezet: Tbbrintses alkalmazsok programozsa

Az allTouches metdus NSSet objektumot ad vissza, amely UITouch objektumok kszlett tartalmazza. Annak megllaptshoz, hogy hny ujj rinti a kpernyt, a count metdussal egyszeren megszmoljuk a UITouch objektumokat az NSSet objektumban. Ebben az esetben csak egyetlen rints rdekes, ezrt csak az egy rintsre vonatkoz esetet valstjuk meg: //---compare the number of touches on the screen--switch ([allTouches count])
{

//---single touch--case 1: { //---get info of the touch--UITouch *touch = [[allTouches allobjects] objectAtindex:O]; //---compare the touches--switch ([touch tapcount])
{

//---single tap--case l: { imageview.contentMode } break; //---double tap--case 2: { imageview.contentMode break;


}

urviewcontentModescaleAspectFit;

UIViewcontentModecenter;

break;

Az els rints rszleteit az NSSet objektum allobjects metdusval nyerjk ki, s egy NSArray objektumot adunk vissza. Majd az objectAtindex: metdus alkalmazsval nyerjk ki az els tmbelemet. A UITouch objektum (touch) magban foglalja a tapcount tulajdonsgot, amellyel megllapthatjuk, hogy a felhasznl egyszer koppintott-e a kijelzre, vagy ktszer (esetleg tbbszr). Ha a felhasznl egyszer koppintott a kijelzre, akkor a urvi ewcontentModesca leAspectFit llandval tmrerezzk a kpet, hogy az teljesen betltse az Imageview nzetet. Ha kt koppints trtnt, a urvi ewcontentModecenter llandval a kpet visszall~uk az eredeti mretre. A msik hrom esemny, amelyet ebben a rszben nem vizsglunk meg, a touchesEnded :wi th Event:, a touchesMoved :wi th Event: s a touchescancell ed :withEvent:. A touchesEnded: wi thEven t: esemny akkor indul el, amikor a felhasznl felemeli az ujjt vagy ujjait a kijelzrl. A touchesMoved: wi th Event: esemny akkor indul el, amikor a felhasznl ujja(i) megrintik a kijelzt, s mozognak rajta. Vgl, ha az alkalmazs megszakad, mikzben a felhasznl ujja a kijelzn helyezkedik el, a touchescancelled:withEvent: esemny lp mkdsbe.

334

rintsek rzkelse

Megjegyzs A touchessegan :wi thEven t: esemnyen kvl a touchesEnded: wi thEven t: esemnnyel is szlelhetjk az rintseket.

A kvetkez rszben megvizsgljuk, hogyan rzkelhetnk tbb rintst az alkalmazsunkban.

A TBBSZRI KOPPINTS
Amikor a felhasznl tbbszr rkoppint a kijelzre, az alkalmazsunk tbbszr elindtja a touchesBegan: s a touchesEnded: esemnyeket. Ha pldul a felhasznl egyszer rinti meg a kijelzt, a touchessegan: s a touchesEnded: esemnyek egyszer indulnak el, s az urrouch objektum tapcount tulajdonsgnak visszatrsi rtke 1 lesz. Ha azonban a felhasznl (gyors egymsutnban) ktszer rinti meg a kpernyt, a touchesBegan: s a touchesEnded: esemnyek ktszer indulnak el; az esemnyek els inditsakor a tapcount tulajdonsg rtke 1, a msodik etindulst kveten a tulajdonsg rtke 2 lesz. Fontos tisztban lennnk a tbbes koppints rzkelsvel, mert ha kett koppincist szlelnk, az alkalmazsunk redundnsan hajthat vgre olyan programkdblokkokat, amelyeket egy koppintshoz ksztettnk. A kvetkez gyakorlati rszben pldul a kp ketts koppintsval a kp UIViewcontentModescaleAspectFit mdba vlt (s ennek az egyes rintseket kveten kellene bekvetkeznie; ebben az esetben, mivel a kp mr UIViewcontentModescaleAspectFit mdban van, a felhasznl nem tapasztal semmilyen klnbsget), majd visszavlt UIVi ewcontentModecenter mdba (a ketts rintsnek pontosan ez a feladata). Idelis esetben az alkalmazsnak nem kellene vgrehajtania az egyes rints kdblokkjt. A problma megoldshoz olyan programkdot kell rnunk, amely ellenrzi, hogy a felhasznl msodszor is valban megrinti a kijelzt: Egy rints szlelse sorn az NSTimer objektum segtsgvel hasznljunk idztt. Dupla koppints rzkelse esetn lltsuk meg az idztt, s ellenrizzk, hogy a msodik s az els rints kztt eltelt id elg rvid-e ahhoz (pldul a msodperc trtrsze), hogy ketts rintsknt kezelhessk. Ha igen, akkor hajtsuk vgre a dupla koppints programkdjt. Ellenkez esetben hajtsuk vgre a szimpla rints programkdjt.

A kvetkez rszben megvizsgljuk, hogyan rzkelhetnk tbbes rintst az alkalmazsunkban.

335

14. fejezet: Tbbrintses alkalmazsok programozsa

Tbbes rints rzkelse


A tbbes rints (vagyis tbb ujj prhuzamos rtinse) rzkelse egyszer feladat, ha az el z rsz alapfogalmaival tisztban vagyunk. A tbbes rints rzkelsnek kpessge rendkvl hasznos, hiszen segtsgvel az alkalmazsunkban pldul a nzeteket nagytha~uk. A kvetkez gyakorlati rsz bemuta~a, hogyan szlelhetjk a tbbes rintseket.
Tbbes rints rzkelse

1. A korbbiakban ltrehozott projekt segtsgvel mdostsuk a touchesBegan : wi thEven t: metdust, s adjuk hozz az albbi flkvrrel szedett programkdot
-(void) touchesBegan: (NSSet *) touches withEve nt : CUIEvent *) event { //--- get all touches on the sereen--NSSet *allTouches: [event allTouches]; //--- compare the number of touches on the screen--switch ([allTouches count])
{

//--- single touch--case 1: { //---get info of the touch- -UITo uch *touch : [[al lTouches allobjects] objectAtindex:O]; //---compare the touches- - switch ([touch tapcount])
{

//---single tap--case 1: { imageview.contentMode } break ; case 2: { imageview.contentMode } break;


}

urviewcontentModescaleAspectFit;

urviewcontentModecenter;

break; /1---double-touch--case 2: { //---get info of first touch--UITouch *touch1: [[allTouches allobjects] objectAtindex:O]; //---get info of second touch--UITouch *touch2: [[allTouches allobjects] objectAtrndex:1];

336

Tbbes rints rzkelse

//---get the points touched--CGPoint touch1PT = [touch1 locationinView:[self view]]; CGPoint touch2PT = [touch2 locationrnview:[self view]]; NSLog(@"Touch1: %.Of, %.Of", touch1PT.x, touch1PT.y); NSLog(@"Touch2: %.Of, %. Of", touch2PT.x, touch2PT.y); } break;

2. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljk 3. Az iPhone Simulatorban nyomjuk meg az Option gombot, ekkor kt kr jelenik meg (lsd a 14.4. brt). Ha a kpernyre kattintunk, ezzel szimulljuk, hogy kt ujjal megrin~k az eszkz kijelzjt. A kijelz csptetsnek szimullshoz kattintsunk, s mozgassuk az egeret.
4. Nyissuk meg a Debugger Console ablakot (nyomjuk meg a Cornmand-Shift-R billentykombincit), s vizsgljuk meg a kimenetet, rnikzben az iPhone Simulator kijelzjn az Option lehetsgekre kattintunk.
14.4. bra

2009-08-25 2009-08-25 2009-08-25 2009-08-25 2009-08-25 2009-08-25 2009-08-25 2009-08-25 2009-08-25 2009-08-25

10:01:15.510 10:01:15.511 10:01:15.758 10:01:15.759 10:01:15.918 10:01:15.919 10:01:16.054 10:01:16.055 10:01:16.238 10:01:16.239

MultiTouch[2230:207] MultiTouch[2230:207] MultiTouch[2230:207] MultiTouch[2230:207] MultiTouch[2230:207] MultiTouch[2230:207] MultiTouch[2230:207] MultiTouch[2230:207] MultiTouch[2230:207] MultiTouch[2230:207]

Touch1: Touch2: Touch1: Touch2: Touch1: Touch2: Touch1: Touch2: Touch1: Touch2:

107, 213, 105, 215, 215, 105, 105, 215, 105, 215,

201 239 201 239 239 201 201 239 201 239

Megjegyzs Az iPhone Simulator hasznlatakor a kt rints koordintit az


alkalmazs gyakran felcserli, mikzben az iPhone Simulator azon a ponton az Option
lehetsgeire kijelzjn

ugyan-

kattintunk.

337

14.fejezet: Tbbri ntses alkalmazsok programozsa

Hogyan

mkdik?

A tbbes rints t is a t ouches B egan :wi th Event : esemnnyel ellenrizzk. Ahelyett, hogy az els rintssel kapcsolatos informcikkal dolgoznnk, most az els s a msodik rintsrl egyarnt kapunk adatokat: //-- -get i nfo of fi rs t tou ch--UITouch *touchl ; [[allTou ches al l ob j ect s ] obj ectA tindex:O]; //---get info of second t ou ch--UITouch *touch2 ; [[allTouches al l Obj ects] objectAtindex :l];

Megjegyzs Kettnl tbb rints rzkelshez alapveten csak az elz programkdot kell bvtennk a harmadik rintsre, a negyedik rintsre s a tbbi rintsre vonatkoz informcik begyjtsveL

Az egyes rintsek koordintinak (amelyet a CGPoi nt struktra kpvisel) megszerzshez a


un ouch osztly l ocation r nvi ew: metdust hasznljuk, s tadjuk az aktulis nzet rtkt //---get t he poi nt s touc hed --CGPoi nt touch l PT ; [touch l locat i onrnvi ew:[self view ; ]] CGPoint t ouch2PT ; [touch 2 locationrnvi ew: [self vi ew]] ; A locati onrnview: metdustl rkez koordintk a meghatrozott nzetre vonatkoznak. Az elz kdrszletben a megjelen koordintk a f View ablakra vonatkoznak. f A CGPoi nt struktra x s y koordintit a CG Fl oa t pussal brzolha~ uk, gy a % formtumjellt kell hasznlnunk, amikor a koordintkat a D ebugger Console abiakba rjuk: NSLog (@"Touch l: %.Of , %. Of" , touchlPT .x , touchlPT.y); N SLog (@"Touch2: %.Of , %.Of", touch2PT.X, touch2PT. y); A megjelen koordintartkek a meghatrozott nzetre vonatkoznak. A 14.5. brn a bal fels sarok koordinti (O, -20), a jobb als sarok koordinti (320, 460) rtket kapnak, ha a f View ablakra vonatkoztatjuk ket: //- - - get the points t ouched --CGPoi nt t ouchlPT; [t ouch l locationrnview: [self view]]; C GPoi nt t ouch2PT; [t ouch2 locationrnvi ew:[sel f vi ew]]; Ttelezzk fel, hogy a kp nzet nek m rett a 14.6. brn lthat mretre cskkentettk agevi ew n(ne feledjk, hogy a nzet pillanatnyilag a teljes kpernyt betlti). Ha az I m zetre hivatkoztunk, a (O, O) pozci a kp nzetnek bal fels sarknl kezddik. Ekkor a (O, O) ponttl balra fent elhelyezked tovbbi pontok negav x s y koordintkkal rendelkeznnek:

338

Tbbes rints rzkelse


//---get the points touched--CGPoint touchlPT = [touchl locationrnview:imageview] ; CGPoint touch2PT = [touch2 locationrnview:imageview];
(O.
-~0)

. .dl carrier 9

9:29AM

(0.1J)

[ s elf view)

320.460)

14.5. bra
.olllcanier 9 9:2!1 AM

( - 11;1. - 10)

(0.0)
imageView --+---------~

14.6. bra

339

14.fejezet: Tbbrintses alkalmazsok programozsa

A csptetsgesztus megvalstsa
Megismerve a tbbes rints rzkelsnek mdszert, elkszthetnk nhny olyan alkalmazst, amely kihasznlja ezt a szolgltatst. Meg lehet valstani a hres iPhone csptetsi gesztust, amely ezt az eszkzt megklnbzteti a versenytrsaitL A csptetsgesztus alkalmazsakor kt ujjunkat a kijelzre helyezzk, s a kt ujj egymshoz kzeltsvel cspternk Ez gyakran kicsinytsi mveletet indt el, ha pldul egy fnykpen vagy Mobile Safariban egy weblapon alkalmazzuk. Ha ujjaink tvolodnak egymstl, a fnykpet vagy a weboldalt nagytjuk. Ahhoz, hogy egy kpen a csptetsgesztust hasznlhassuk, elszr nagytanunk kell a kpet. Ennek az az oka, hogy a kpet csak akkor lehet tmretezni, ha a kp megjelentsi mdja urvi ewcontentModesca l eAspectFi t. Ezrt ebben az esetben egyszer meg kell rintennk a kpet (s ezltal a kp mdjt urviewcontentModescaleAspectFit rtkre lltjuk), rnieltt kiprblhatnnk a csptets t. A kvetkez gyakorlati rszben megrudhatjuk, hogyan valsthatjuk meg a csptetsgesztust a kp nagytshoz s kicsinytshez a kpnzetben.

Nagyits s kicsinyits

1. A korbbiakban ltrehozott projekt segtsgvel adjuk hozz az albbi flkvrrel szedett utastst a Mul tiTouchvi ewcontroll er. h fj !hoz:
#import <UIKit/UIKit.h> @inte rface MultiTouchviewcontroller IBOutlet urimageview *imageview; urviewcontroller {

@property (nonatomic, retain) urimageview *i mageview; -(CGFloat) distanceBetweenTWoPoints: (CGPoint)fromPoint toPoint: (CGPoint)toPoint; @end 2. A MultiTouchviewcontroller.m fj lban valstsuk meg a distanceBetweenTWoPoi nts: to Po i nt: s a touchesMoved: wi th Event: metdusokat, majd adjuk hozz az albbi flkvrrel szedett sorokat a touchesBegan: wi thEven t: metdushoz:

340

Tbbes rints rzkelse


#import "MultiTouchviewcontroller.h" @implementation MultiTouchviewcontroller @synthesize imageview; CGFloat originaloistance; -(CGFloat) distanceBetweenTWoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint { float lengthx = fromPoint.x - toPoint.x; float lengthY = fromPoint.y - toPoint.y; return sqrt((lengthx * lengthX) + (lengthY * lengthY));
}

-(void) touchesBegan: (NSSet *) touches withEvent: CUIEvent *) event { //---get all touches on the sereen--NSSet *allTouches = [event allTouches]; //---compare the number of touches on the screen--switch ([allTouches count]) { //---single touch--case 1: { //---get info of the touch--UITouch *touch = [[allTouches allobjects] objectAtindex:O]; //---compare the touches--switch ([touch tapcount]) { //---single tap--case l: { imageview.contentMode } break; case 2: { imageview.contentMode } break;
}

UIViewcontentModescaleAspectFit;

UIViewcontentModecenter;

} break; 1/---double-touch--case 2: { //---get info of first touch--UITouch *touchl = [[allTouches allobjects] objectAtindex:O]; //---get info of second touch--UITouch *touch2 = [[allTouches allobjects] objectAtindex:l];

341

14. fejezet: Tbbrintses alkalmazsok programozsa

//---get the points touched--CGPoint touchlPT [touchl locationrnview: [self view]]; CGPoint touch2PT = [touch2 locationrnview:[self view]]; NSLog(@"Touchl: %.Of, %.Of", touchlPT.x, touchlPT.y); NSLog(@"Touch2: %.Of, %.Of", touch2PT.x, touch2PT.y); //---record the distance made by the two touches--originaloistance [self distanceBetweenTWoPoints:touchlPT toPoint: touch2PT]; } break;

//---fired when the user moved his finger(s) on the screen---(void) touchesMoved: (NSSet *) touches withEvent: CUIEvent *) event { //---get all touches on the sereen--NSSet *allTouches = [event allTouches]; //---compare the number of touches on the screen--switch ([allTouches count])
{

//---single touch--case 1: { } break; /1---double-touch--case 2: { //---get info of first touch--UITouch *touchl = [[allTouches allobjects] objectAtindex:O]; //---get info of second touch--UITouch *touch2 = [[allTouches allobjects] objectAtindex:l]; //---get the points touched--CGPoint touchlPT = [touchl locationrnview:[self view]]; CGPoint touch2PT = [touch2 locationrnview:[self view]]; NSLog(@"Touchl: %.Of, %.Of", touchlPT.x, touchlPT.y); NSLog(@"Touch2: %.Of, %.Of", touch2PT.x, touch2PT.y); CGFloat currentDistance
=

[self distanceBetweenTWoPoints: touchlPT toPoint: touch2PT];

//---zoom in--if (currentoistance


{

>

originaloistance) CGRectMake(imageView.frame.origin.x - 2, imageview.frame.origin.y - 2, imageview.frame.size.width +4, imageview.frame.size.height +4);

imageview.frame

342

Tbbes rints rzkelse else { //--- zoom out--imageview.frame = CGRectMake(imageview.frame.origin .x +2, imageview.frame.origin.y + 2, imageView.frame.size .width- 4, imageview.frame.size.height- 4);
}

originaloistance } break;
}

= currentDistance;

3. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst teszteljk az iPhone Simulatorban.

4. A nagytshoz egyszer rintsk meg a kpnzetet. A nagytshoz s a kicsinytshez kattintsunk a kp Option lehetsgeire (lsd a 14.7. brt).

Hogyan mkdik?
A csptetsgesztus rzkelshez ismernnk kell a kt ujj kztti tvolsgot, s a tvolsgukat folyamatosan ssze kell hasonltanunk, hogy tudjuk, a kt ujj egymshoz kzelt-e, vagy egymstl tvolodik A kt ujj kztti tvolsg meghatrozshoz a di stanceBetweenTwoPoi nts: to Po i nt: metdust kell definilnunk
14.7. bra

-(CGFloat) distanceBetweenTWoPoints: (CGPoint)fromPoint toPoint:(CGPoint)toPoint { float lengthx = fromPoint .x - toPoint .x; float lengthY = fromPoint.y - toPoint.y; return sqrt ((lengthx * lengthX) + (lengthY * lengthY));

A metdus kt bemeneti CG Po i nt struktrval dolgozik, s kiszmrja a kett kztti tvolsgot, a Pitagorasz-ttel alkalmazsval. Amikor a kt ujj elszr megrinti a kpernyt, a tvolsgukat a touchesBegan :wi thEvent: metdussal
rgz~k

(lsd a flkvr

betkkel

szedett kdot):

343

14.fejezet: Tbbrintses alkalmazsok programozsa


-(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event {

// .. . /1 ---double-touch--case 2 : { // ---get info of first touch- - UITouch *touchl = [[allTouches allobjects] objectAtindex:O]; // ---get info of second touch--UITouch *touch2 = [(allTouches allobjects] objectAtindex:l] ;
//---get the points touched- -CGPoint touchlPT [touchl locationinView:[self view]]; CGPoint touch2PT = [touch2 locationinview:[self view]]; NSLog(@ "Touchl : %.Of , %.Of", touchlPT . x, touchlPT.y); N5Log(@ "Touch2: %. Of, %.Of", touch2PT.x, touch2PT . y); //---record the distance made by the two touches--originaloistance [self distanceBetweenTWoPoints:touchlPT toPoint: touch2PT]; } break;
}

Ahogyan a kt uj j mozog a kij elzn, az aktulis tvolsgukat folyamatosan az eredeti tvolsghoz hasonl~ uk (lsd a 14.8. brt).

14.8. bra

344

Tbbes rints rzkelse

Ha az aktulis tvolsg nagyobb, mint az eredeti tvolsg, akkor ez egy nagytsi gesztus. Ha nem, akkor kicsinytsi gesztus:
//---fired when the user moved his finger(s) on the screen-- -(void) touchesMoved: (NSSet *) touches withEvent: CUIEvent *) event {

// ... /1---double-to uch--case 2: { // ---get info of first touch--UITouch *touchl; [[allTouches allobjects] objectAtindex:O];
//---get info of second touch--UITouch *touch2 ; [[allTouches allObjects] objectAtindex:l]; //---get the points touched --CGPoint touchlPT; [touchl locationrnview:[self view]]; CGPoint touch2PT ; [touch2 locationinView:[self view]]; NSLog(@"Touchl: %. Of, %. Of", touchlPT.x, touchlPT . y); NSLog(@"Touch2: %.Of, %. Of", touch2PT.x, touch2PT . y); CGFloat currentDistance ; [self di stanceBetweenTwoPoints: touchlPT toPoint: touch2PT]; //---zoom in--if (currentDistance
{

>

originaloistance) CGRectMake(imageview.frame.origin.x - 2, imageview.frame.origin . y- 2, imageview.frame.size.width +4, imageview.frame.size.height +4);

imageview . frame

} else { //---zoom out--imageview.frame; CGRectMake(imageview.frame.origin.x +2, imageview.frame.origin.y +2, imageview.frame.size.width -4, imageview.frame.size.height -4);
originalDistance } break;
}

currentDistance;

345

14. fejezet: Tbbrintses alkalmazsok programozsa

A hzsgesztus megvalsitsa
A msik gesztus, amelyet az alkalmazsunkban megvalsthatunk, a hzsgesztus, ennek sorn a kijelz n megrintnk egy elemet, s uj junk mozgatsval hzzuk. A kvetkez gyakorlati rszben megismerjk, hogy a hzsgesztus megvalstsval hogyan hzhatunk egy kpnzetet a kijelz n . Az ImageView hzsa
1. A korbban ltrehozott projekt segtsgvel mdostsuk az ImageView nzet m-

rett, hogy az megfeleljen a kpmretnek O.sd a 14.9. brt).

14.9. bra

14.10. bra

2. Adjuk a touchesMoved: wi thEven t: metdushoz az albbi flkvrrel szedett utastso kat:


//--- fired when the user moved his finger(s) on the screen---(void) touchesMoved: ( NSSet *) touches withEvent: (UIEvent *) event { //---get all touches on the sereen--NSSet *allTouches = [event allTouches];

346

Tbbes rints rzkelse

// ---compare the number of touches on t he screen- -switch ([allTouches count] ) { //---single touch--case 1: { //---get info of the touch--UITouch *touch = [[allTouches allobjects] objectAtindex:O]; //- - -check to see if the image is being touched--CGPoint touchPoint = [touch locationinView:[self view]); if (touchPoint.x > imageview.frame.origin.x && touchPoint.x < imageview.frame.origin.x + imageview.frame.size.width && touchPoint.y > imageview . frame.origin . y && touchPoint.y <imageview.frame.origin.y + imageview.frame.size.height) { [imageview setcenter:touchPoint];
}

break;

/1-- -double-touch- - case 2: { //- - - get info of first touch --UITouch *touchl = [[allTouches allobjects] objectAtindex :O] ; // ---get info of second touch- -UITouch *touch2 = [[allTouches al l object s] obj ectAt index: l]; // .. . // .. . } break;
}

3. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst teszteljk az iPhone Simulatorban. 4. Ekkor megrin thetjk a kp nzett, s ujjunk mozgatsval a gesen mozgathatjuk a kpet Qsd a 14.10. brt) .
kijelzn tetsz le

Hogyan mkdik?
Az alapelv rendkvl egysz e r. Amikor egy ujj megrinti a kij elzt, ujj pozcija a kp nzetnek tanomnyba esik-e, vagy sem:
CGPoint touchPoint
=

ellen rizz k,

hogy az

[touch locationinView:[self view]];

if (touchPoint.x > imageview.frame.origin.x && touchPoint.x < imageview . frame . origin.x + imageview.frame.size.width &&

347

14. fejezet: Tbbrintses alkalmazsok programozsa


touchPoint.y > imageview.frame .o rigin . y && touchPoint.y <imageview.frame.origin.y + imageview.frame .s ize.height) [imageview setcenter:touchPoint];

Ha igen, akkor setcenter fggvny hvsval egyszeren thelyezzk a kp nzetnek pozcijt. Ezzel a mdszerrel gyorsan kszthetnk kiraks alkalmazst, amelyben ha az elemeket a kijelzn hzza a felhasznl, trendezheti a kiraks jtk darabjait.

SSZEFOGLALS
Ebben a fejezetben megismerkedtnk azokkal a klnbz esemnyekkel, amelyeket akkor kell kezelnnk, ha azt szeretnnk tudni, hogy a felhasznl egyszer vagy tbbszr rintette-e meg az alkalmazsunkat. Megvizsgltuk, hogy alkalmazsunkban hogyan rzkelhetjk a tbbes rintst, s hogyan kszthetnk ezzel tovbbi alkalmazsokat.

1. Nevezzk meg azt a ngy esemnyt, amelyekkel szlelhetjk alkalmazsunkban az rintseket. 2. Mi a klnbsg a tbbes koppints s a tbbes rints kztt? 3. Hogyan szimulljuk a tbbes rintst az iPhone Simulatoron?

A FEJEZET TUDNIVALI
Tma
rintsek szlelse a nzeten

Alapelvek
Kezeljk a
kvetkez

esemnyeket a nzeten vagy a

nzetvezrln:

touchesBegan: wi th Event: touchesEnded:withEvent: touchesMoved:withEvent: touchescancelled:withEvent:

Kappamsok (egy, tbb s gy tovbb) szlelse A csptetsgesztus megvalsts a A hzsgesztus megvalstsa

A koppintsokat a touchesBegan: wi th Event: vagy a touchesEnded: wi th Event: metdussal szlelhetjk Hasonltsuk ssze a kt rintsi pont tvolsgt, s kvetkeztessnk, hogy a gesztus nagyts-e, vagy kicsinyts.
Gyzdjnk meg rla, hogy az rintsi pont a krdses nzet ltal elfoglalt terletre esik-e.

348

Egyszer

animcik

A FEJEZET FBB RSZEl A KVETKEZK:


az NSTimer osztly hasznlata idztk (timers) ltrehozsnl metdusok rendszeres idkznknt trtn aktivlshoz,
egyszer

animcik tervezse az NSTimer osztllyal,

affintranszformci az Imagevi ew-ben, kpsorozatok animlsa az Imageview segtsgveL

Az elzekben megrt alkalmazsok az iPhone SDK alapmretezett nzeteit hasznltk

Ahogyan az Apple tbbszr bizonytotta, az iPhone s az iPod Touch tbb az egyszer telefonoknl. Az iPhone egyben zenelejtsz, s ami a jelen fejezet szempontjbl fontosabb, jtkplatform is. A kvetkezkben vizulis tervezst vgznk. Megnzzk, hogyan ksztsnk egyszer animcikat idztvel, illetve hogyan vgezznk transzformcikat adott nzeten. Jllehet az OpenGL animcik bemutatsa tlmutat ennek a knyvnek a keretein, a kvetkezk ben tbb olyan technikt valstunk meg, amelyekkel letre kelthetjk az alkalmazsainka t.

Az NSTimer osztly hasznlata


Az animcik vilgban legegyszerbben az NSTimer osztly hasznlatvallehet elindulni. Az NSTi me r osztly idztobjektumokat kszt, amelyekkel rendszeres idkznknt aktivlhatunk metdusokat. Az NSTimer objektum hasznlatakor a kpek rendszeres id kznknt frisslnek, a mozgs benyomst keltve.

15. fejezet:

Egyszer

animcik

A kvetkez gyakorlati rszben bemutatjuk, hogyan kszthetnk az NSTimer osztlylyal pattog labdt a kpemyre. Arnikor a labda a kperny falhoz r, visszapattan az ellenkez irnyba. Megnzzk azt is, hogyan vezreljk a labda animcijnak frekvencijt. A gyakorlati rszekhez le kell tlteni a megjellt kdfjlokat. Labda animlsa

Az [Animation.ifp} kdftijl a lf'rox.com-rl tlthet le.


1. Nyissuk meg az Xcode-ot, s hozzunk ltre egy j nzetalap alkalmazs- (Viewbased Application) projektet, s nevezzk Animation-nek.
2. Az Xcode-ban hzzuk a tennisball.jpg kpet a Resources mappba. Amikor az Add prbeszdablak megjelenik, jelljk ki a Copy Item into Destinatien Group's Folder (If eeded) jellngyzetet; ezzel a kp egy msolatt a projekthez rjuk. 3. Kattintsunk ktszer a fjlra, hogy az Interface Builderrel szerkesszk. 4. A View ablakban hzzunk r egy ImageView elemet, s llitsuk ennek Image tulajdonsgt a tennisball.jpg-re (lsd a 15.1. brt).

Tg

Dnwlng

0 Opaque D Hidden O Our Contut &efore Ora.wmg O Otp Sub111ews


~ Autoresze SubVIews

x
Wldth
IntenelJOn

Heght

O User InterilelJon En.Jbled


O Muk1ple Touch

15.1. bra

350

Az NSTimer osztly hasznlata

Stuus hr
Top~r

~ ~
~

louambr

--Mod._
AJpha

--

b c:kg round
Tg

Dn.wing

!5'l o.....
O Our Context kfore O Cllp SubVitws !5'l AUiorosozt SuiM~

Stretd\ing

l(). ~
~

_ ._
Wldth

LOO ,Q}

Inter.cbon

15.2. bra

Min1mum

Max1mum

~
lnul.l
Min lm<tge

f. g

Cont1nuous

i:)

Max Image

B
D

Content

O!B
En.abltd

H. Alignment

Hlghllghtd

Mode

JSaM To FiU
---

Al p ha
hckground

Tg

- - -0 -

Dnwing

.= 0p.Jqut
~ Otp Subvtews

Hddtn

~ Clur Conttxt Betore OBWmg

15.3. bra

351

15. fejezet :

Egyszer

ani mcik

ImageView elemben .

Megjegyzs Bizonyosodjunk meg arrl, hogy a teniszlabda kpe elfr az Ksbb az ImageView elemet mozgatjuk a kpernyn, gy fontos, hogy ne tltsk meg a kppel az egsz kpernyt .

5. Az ImageView-n kvl, a View ablakban vltoztassuk a httr sznt feketre (lsd a 15.2. brt). 6. A Library osztlybl adjunk egy Label s egy Slider (csszka) elemet a View ablakhoz (lsd a 15.3. brt). llitsuk a Slider elem Ini ti a l tulajdonsgt O. 01-re.

15.4. bra

7. Az Ani ma ti onvi ewcontro ll er. h fjlban deklarljuk a


mvel eteket

kvetkez

kivezetseket,

mezket:

#import <U IKit/ UIKit.h> @i nterface Animationviewcontroller UIViewcontroller { IBOutlet UIImageView *imageview; IBOutlet UISlider *slider; CGPoint position; NSTimer *timer; float ballRadius;

352

Az NSTimer osztly hasznlata @property (nonatomic, retain) urimageview *imageview; @property (nonatomic, retain) urslider *slider; -(IBAction) sliderMoved:(id) sender; @end

8. Kssk be a kivezetseket s a
brt).

mveleteket

az Interface Builderben Osd a 15.4.

9. Az Animationviewcontroller.m fjlhoz adjuk a


stsokat: #import "Animationviewcontroller.h" @implementation Animationviewcontroller @synthesize imageview; @synthesize slider;

kvetkez

flkvrrel szedett uta-

-(void) onTimer { imageview.center = CGPointMake( imageview.center.x + position.x, imageview.center.y + position.y); if (imageview.center.x > 320 - ballRadius l l imageview.center.x < ballRadius) position.x = -position.x; if Cimageview.center.y > 460 - ballRadius l l imageview.center.y < ballRadius) position.y = -position.y;
}

- (voi d)viewDidLoad { ballRadius = imageview.frame.size.width/2; [slider setshowvalue:YES]; position = CGPointMake(12.0,4.0); timer= [NSTimer scheduledTimerwithTimernterval:slider.value target:self selector:@selector(onTimer) userrnfo:nil repeats:YES]; [super viewoidLoad];

-(IBAction) sliderMoved:(id) sender { [timer invalidate]; timer = [NSTimer scheduledTimerwithTimeinterval :slider.value target:self selector:@selector(onTimer) userrnfo:nil repeats:YES];
}

353

15. fejezet:

Egyszer

animcik

- (void)didReceiveMemoryWarning { [super didReceiveMemorywarning];


}

- (void)dealloc { [timer invalidate]; [imageview release]; [slider release]; [super dealloc];

@end

10. Nyomjunk meg a Command-R gombokat


ahhoz, hogy az alkalmazst az iPhone Simulatorban teszteljk A kpernyn ekkor az animlt teniszlabdt kellltnunk (lsd a 15.5. brt). Az animci gyorsasgnak lltshoz hasznljuk a csszkt. A csszka balra hzsval lasstjuk, jobbra hzsval gyorstjuk az animcit.
15.5. bra

Hogyan

mkdik?
betltdtt,

Amikor a nzet

az

els

dolog a teniszlabda sugarnak meghatrozsa volt,

amely ebben az esetben a kp szlessgnek a fele: ballRadius


=

imageview.frame.size.width/2;

Ez az rtk az animci sorn azt mri, hogy a teniszlabda rintette-e mr a kperny falt. A csszka bellthat arra, hogy megmutassa ezt az rtkt; ehhez itt hasznljuk a setshowval ue: metdust: [slider setshowvalue:YES];

Megjegyzs Mivel a setshowval ue: metdus nincs bektve, a fordtprog-

ram (compiler) figyelmeztetst dob.

Inicializljuk a pos i ti on varins t is: position


=

CGPointMake(l2.0,4.0);

354

Az NSTimer osztly hasznlata

A position varins hatrozza meg, hogy a kp mekkort mozdul el az idzt aktvcijakor. Az elz kd azt rja el, hogy vzszintesen 12 pixelnyit, fgglegesen pedig 4 pixelnyit mozduljon el. Ezutn az NSTimer osztruy scheduledTimerwithTimeinterval:target:selector:userInfo: repeats: osztruymetdust hvjuk meg, hogy j msolatot kszthessnk az NSTimer objektumrl: timer
=

[NSTimer scheduledTimerwithTimeinterval :slider.value target:self selector:@selector(onTimer) userinfo:nil repeats:YES];

A scheduledTimerwithTimeinterval: hatrozza meg az idzt aktivcii kztt eitel idt. Ezt most a Slider elem rtkre illtottuk, amely 0,0 s 1,0 kztt vesz fel rtket. Ha a csszka rtke 0,5, az idztobjektum minden msodpercben ktszer aktivruja magt. A selector: paramter az idzt aktivrusakor letbe lp metdust hatrozza meg, a repeats: paramter pedig megmutatja, ha az idztobjektumnak folyamatosan t kell temeznie magt. Ebben az esetben az onTime r metdus lp rvnybe, arnikor az idzt aktivrudik. Ezt az albbiakban meg is hatrozzuk. AzonTimer metdusban az ImageView elem pozcijt gy vrutoztatjuk meg, hogy a center tulajdonsgt j rtkre illtjuk. Az thelyezs utn nzzk meg, hogy a kp tkzik-e a kperny falaival; ha igen, a pos i ti on varins rtke negatvv vrutozik: -(void) onTimer { imageview.center

CGPointMake( imageview.center.x + position.x, imageview.center.y + position.y);


< <

if (imageview.center.x > 320 - ballRadius l l imageview.center.x position.x = -position.x; if (imageview.center.y > 460 - ballRadius l l imageview.center.y position.y = -position.y;

ballRadius) ballRadi us)

A csszka illtgatsakor a sliderMoved: metdus lp rvnybe. Ennl a metdusnru el szr tiltsuk le az idztobjektumot, s hozzunk ltre egy msik pldnyt az NSTimer osztruyrl: -(IBAction) sliderMoved:(id) sender { [timer invalidate]; timer = [NSTimer scheduledTimerwithTimeinterval :slider.value target:self selector:@selector(onTimer) userinfo:nil repeats:YES];

355

15. fejezet :

Egyszer

ani mcik

gy a csszka llitgatsval a kp animltsgnak frekvencijt vltoztathatjuk

Megjegyzs Az NSTimer objektum indtsa utn mr nem llthatjuk az akti-

vcik i dkzt . gy az idkz megvltoztatsnak egyetlen mdja a jelenlegi elhagysa, majd j NSTimer objektum ltrehozsa . ~

il

......

A vizulis vltoztats animlsa


Amint jobbra hztuk a csszkt, az animci egyre inkbb lelassult, a teniszlabda mozgsa pedig daraboss vlt. Az animcit el tudjuk simtani az animcis blokkban a nzet center tulajdonsgnak az llitsval, amely a vizulis vltoztatsok animlsrt felel. Az animcis blokk elejt a urvi ew osztly begi nAni ma ti on s : context: osztlymetdusa hatrozza meg: [UIView beginAnimations: 15.6. bra @"my_own_animat i on " context :nil ] ; imageview.center = CGPointMake( imageview .center. x + posi tion.x, imageview.center.y + position.y); [UIVi ew commitAnimations]; Az animcis blokk vgn pedig a urvi ew osztly comm i tAn i ma ti ons osztlymetdust !vjuk meg. Az elz kd az ImageView elemet animlja, amint az egyik pozcibl a msikba mozog Osd a 15.6. brt). Ez az elznl jval finomabb animcit eredmnyez.

Nzetek transzformlsa
Az elz rszben azt vizsgltuk meg, hogyan hasznljuk az NSTimer osztlyt egyszerbb animcik ksztsre, az ImageView elem pozcijnak konstans vltoztatsval. Ugyanazon hats elrshez a nzet jrapozicionlsa mellett az iPhone SDK ltal tmogatott transzformcis technikkat is hasznlhatjuk A transzformcikat a Core Graphicsban definiltk, az iPhone SDK pedig standard 2D-s affintranszformcikat is tmogat. Az iPhone SDK-val a kvetkez 2D-s affintranszformcikat hajthatjuk vgre:

356

Nzetek transzformlsa

Megjegyzs Az affintranszformci lineris transzformci, amely megrzi a kolinearitst (prhuzamossgot) s a tvolsgok arnyt. Ez azt jelenti, hogy adott egyenes pontjai annak transzformdja utn is megmaradnak, a megfelel egyms kzti tvolsg megtartsvaL

Eltols: a nzet eredetijt meghatrozott rtkkel eltolja az x s y tengelyeken. Forgats: a nzetet a megfelel szgben elmozdtja. tmretezs: a nzet mrett megvltoztatja adott x s y faktoroknak megfelelen.

A 15.7. bra az itt vzolt transzformcik hatsait mutatja.

15.7. bra

357

15. fejezet:

Egyszer

animcik

Eltols
Adott nzet affintranszformlshoz hasznljuk a nzet transform tulajdonsgt. pldban a nzet pozcijt a center tulajdonsgval vltoztattuk meg: imageview .center
=

Elz

CGPointMake( imageview.center.x + position .x, imageview .center.y + position .y);

2D-s transzformcik esetben is hasznlhatjuk a transform tulajdonsgot, ezt lltsunk a CGAffi neTransformMakeTranslati on() funkci ltal visszakldtt CGAffi neTransform adatstruktrra a
kvetkezkppen:

//---in the Animationviewcontroller.h file--CGPoint position; CGPoint translation; //---i n the viewDidLoad method--position = CGPointMake(12.0,4 .0); translation = CGPointMake(O.O,O.O); -(void) onTimer { imageview.transform = CGAffineTransformMakeTranslation( translation.x, translation.y); translation.x translation.y translation.x + position.x; translation.y + position.y;

if (imageview.center.x + translation.x > 320 - ballRadi us l l imageview . center.x + translation.x < ballRadius) position.x = -position.x; if (imageview.center .y + translation.y > 460 - ballRadius l l imageview.center.y + translation.y < ballRadius) position.y = -position.y;

A CGAffineTransformMakeTranslation() fggvny kt argumentum fggvnyben mk dik: az x s az y tengelyen val mozgats rtknek a fggvnyben. Az elz kd ugyanezt a hatst az ImageView elem center tulajdonsgnak belltsval ri el.

358

Nzetek transzformlsa

Forgats
A forgatstranszformcival a nzetet a kivnt szgben forga thatjuk el. A kvetkez gyakorlati rszben az amint az a
kp erny elz

p lda kdj t gy

md os~uk,

h ogy a teniszlabda elforduljon,

falh oz r.

Bi@i A teniszlabda elforgatsa


1. Az Animationviewcontroller.h fjlh oz adj uk az angle varin s deklarcijt:
#import <UIKit/UIKit.h> interface Animationviewcontroller : urviewcontroller { @ IBOutlet urimageview *imageview; IBOutlet urslider *slider; CGPoint position; NSTimer *t i mer; float ballRadius; float angle;

@ property (nonatomic, retain) urimageview *imageview; property (nonatomic, retain) urslider *sl i der; @ - (IBAction) sliderMoved:(id) sender; @ end

2. Az Animationviewcontroller.m fjlhoz adjuk a stsokat:

kvetkez

flkvrrel szedett uta-

-(void) onTimer { /1---rotation--imageview.transform = CGAffineTransformMakeRotation(angle); angle += 0.02; if (angle>6.2857) angle = O; imageview.center = CGPointMake( imageview.center.x + position.x, imageview.center.y + position.y); if (imageview.center.x > 320 - ballRadius l l imageview . center.x < ballRadi us) position.x = -position . x; if (imageview.center.y > 460 - ballRadius l l imageView.center . y < ballRadi us ) position.y = -position . y;

359

15. fejezet:

Egyszer

animcik

- (void)viewDidLoad { //---set the angle to O--angle : O; ballRadius: imageview.frame.size.width/2; [slider setshowvalue:YES]; position: CGPointMake(l2.0,4.0); timer: [NSTimer scheduledTimerWithTimeinterval:slider.value target:self selector:@selector(onTimer) userinfo:nil repeats:YES]; [super viewDidLoad];
}

Megjegyzs Ha a Translation szakaszban az eltols kdjt mr alkalmaztuk, bizonyosodjunk meg arrl, hogy a msodik pont kdjnak hozzadsa eltt eltvoltottuk.

3. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst teszteljk A teniszlabda elfordul, ha a kperny falhoz r.
Hogyan mkdik?

A nzet elforgatshoz a transform tulajdonsgt kell tillitanurUk a CGAffineTransformMakeRotation() funkci ltal visszakldtt CGAffi neTransform adatA CGAffi neTransformMakeRotati on() struktrval. funkci lnyegben egy egyedlll argumentum, amely radinban tartalmazza a forgats szgt. Itt minden egyes fordulskor 0,02-vel nveljk a szget.
1/---rotation--imageview.transform CGAffineTransformMakeRotation(angle); angle +: 0.02;

A teljes tforgats 360 fokot jelent, azaz kt re radint. gy ha a szg meghaladja a 6,2857-t (= 2 * 3,142857), az angle O-ra ll vissza.
if (angle>6.2857) angle : O;

15.8. bra

360

Kpsorozat animlsa

tmretezs
A nzetek tmrerezshez a CGAffineTransformMakescale() fggvnyt hasznljuk, amely visszakldi a CGAffi neTransform adatstruktrt, amelyet ezutn a nzet transform tulajdonsgra llithatunk: imageview.transform
=

CGAffineTransformMakescale(angle,angle);

A CGAffi neTransformMakesca l e() fggvny kt argumentum fggvnyben mkdik: az x tengely s az y tengely tmretezsi faktornak megfelelen. Ha az elz pldt mdos~uk a fenti utastssal, a teniszlabda a kperny falhoz rve megn Osd a 15.8. brt). Ezutn ismt visszatr eredeti formjba, majd megint
megn.

Kpsorozat animlsa
Az ImageView nzett eddig statikus kpek megjelentsre hasznltuk. Emellett azonban kpsorozatok megjelentsre, illetve bngszsre is hasznlhat. A kvetkez gyakorlati rsz megmutatja, hogyan tehetjk ezt meg az Image View-val.
Kpsorozat megjelenitse
Az [Animations2.ifp} programkdfo/l a Wrox.com-rl tlthet le.

1. Nyissuk meg az Xcode-ot, s hozzunk ltre egy j nzeralap alkalmazs- (Viewbased Application) projektet, majd nevezzk Ani ma ti ons2-nek. 2. Adjunk egy sorozatnyi kpet a Resources mapphoz gy, hogy azokat az Xcodeban a Resources mappba hzzuk. Amikor az Add prbeszdablak megjelenik, jelljk ki a Copy Item in to Destination Group's Folder (If Needed) jellngyzetet; ezzel a kpsorozat minden tagjnak egy msolatt a projekthez rjuk. A hozzadott kpeket a 15.9. bra mutatja.
3. Az Animations2Viewcontroller.m fjlhoz adjuk a utastsokat:
kvetkez

flkvrrel szedett

- (void)viewoidLoad { NSArray *images [NSArray arrayWithobjects: [UIImage imageNamed:@"MacSE.jpeg"], [UIImage imageNamed:@"imac.jpeg"] , [UIImage imageNamed:@"MacPlus.jpg"],

361

15. fejezet: Egyszer animcik

[UIImage imageNamed:@"imac_old.jpeg"], [UIImage imageNamed:@"Mac8100.jpeg"], ni l J ; CGRect frame= CGRectMake(0,0,320,460); urimageview *imageview = [[UIImageview alloc] initwithFrame:frame]; imageview.animationimages = images; imageview.contentMode = urviewcontentModescaleAspectFit; imageview . animationouration = 3; 11---seconds to complete one set ll of animation--imageview.animationRepeatcount O; 11---continuous--[imageview startAnimating]; [self.view addsubview:imageview]; [imageview release]; [super viewoidLoad];
}

( Simulator- 3.1 lOebug


Groups & Flts Y Anm~uons2 l> Cluses l> Other Sources

15.9. bra

4.

yomjunk meg a Command-R gombokat, hogy a kpsorozatot az iPhone Simulatorban tesztelj k. A kpeket az ImageView egyesvel jelenti meg (lsd a 15.1 0. brt).

Hogyan Inkdik?
Elszr

egy NSArray objektumot hozunk ltre, majd ezt nhny urrmage objektummal

inicializljuk: NSArray *images [NSArray arraywithobjects: [U !Image imageNamed :@"MacSE. jpeg"], [UIImage imageNamed:@"imac.jpeg"], [UIImage imageNamed:@"MacPlus.jpg"],

362

Kpsorozat animlsa

[UIImage imageNamed:@"imac_old.jpeg"], [UIImage imageNamed:@"Mac8100.jpeg"], ni l] ; Ezutn ltrehozzuk a UIImagevi ew objektumot: CGRect frame= CGRectMake(0,0,320,460); urimageview *imageview = [[UIImageview alloc] initWithFrame:frame];
Az ImageView a kpsorozat megjelentshez an-

nak animationimages tulajdonsgt lltja az images objekturnra. Emellett itt az ImageView megjelerutsi mdjt is megszabj uk: imageview.animationrmages = images; imageview.contentMode = urviewcontentModescaleAspectFit; A kpek megjelertsnek gyorsasgt az animationouration tulajdonsg egy rtkhez rendelsvel szabhatjuk meg. Ez az rtk azt az idtarta mor fejezi ki msodpercekben, amely a sorozat teljes lejtszshoz szksges az ImageView-ban. Az animci lejtszsnak szmt az animationRepeatcount tulajdonsg hatrozza meg. Nullra akkor lltsuk, ha a vgtelensgig akarjuk jtszani: imageview.animationouration = 3;

15.10. bra

11---seconds to complete one set ll of animation--imageview.animationRepeatcount = O; 11---continuous--~ Az animci megkezdsrt a startAnimating metdus felel. Az ImageView-t is a nzethez kell adnunk; ezt az addsubview: metdussal tesszk meg: [imageview startAnimating]; [self.view addsubview:imageview];

SSZEFOGLAL
Ebben a fejezetben megvizsgltuk, hogyan lehet az NSTimer osztllyai egyszer animcikat vgezni. Emellett sz volt az iPhone SDK ltal tmogatott klnbz affintranszformcikrl is. Vgl pedig arrl, hogy hogyan lehet az ImageView segtsgvel rendszeres idkz kpek sorozatt vetteni.

363

15. fejezet:

Egyszer

animcik

@IMI
1. Nevezzk meg az iPhone SDK ltal tmogatott h rom affintranszformcit.
2. Hogyan llitunk meg egy NSTimer o bjektumot, majd indtjuk el jra?

3. Mire hasznljuk a kdblokknak a urvi ew osztly begi nAni ma ti ons s commi tAn ma ti ons
metdusaival val kzrezrst? [urview beginAnimations:@"some_text" context:nil]; // ---code to effect visual change--[UIView commitAnimations];

A FEJEZET TUDNIVALI
Trgy
Az NSTi me r objekrum hasznlata idztk ltrehozsra

Kulcsfogalmak
Az idzrobjektum minden msodpercben ktszer aktivlja az onTime r metdust:

Timer= [NSTimer scheduledTimerWithTimeinterval :0.5 target:self selector:@selector(onTimer) userinfo:nil repeats:YES]; Az NSTimer objekrummeglltsa Vizulis vltoztatsok animlsa [timer invalidate]; [UIVi ew begi nAni ma ti ons: @"some_text" context: ni l J ; //--- code to effect visual change--[urview commitAnimations]; Hasznljuk a nzet transform tulajdonsgt. A CGAffi neTransformMakeTransl a ti on O fggvnytl visszakapjuk a CGAffi neTransform adatstruktrt, s abban bellitjuk a transform tulajdonsgot. A CGAffi neTransformMakeTransl a ti on O fggvnytl visszakapjuk a CGAffi neTransform adatstruktrt, s abban bellitjuk a transform tulajdonsgot. A CGAffineTransformMakeTranslationO fggvnytl visszakapjuk a CGAffi neTransform adatstruktrt, s abban bellitjuk a transform tulajdonsgot. !Image objektullitsuk az ani ma ti on Images tulajdonsgot egy U mokat tartalmaz tmbre. llitsuk be az animationouration tulajdonsgot. llitsuk be az ani ma ti onRepeatcount tulajdonsgot. Hvjuk meg a startAnimating metdust.

Affintranszformcik vgzse Eltols

Forgats

tmrerezs

Kpsorozat animlsa az ImageView-val

364

A bepitett alkalmazsok elrse


A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan kldhetnk e-mailt az alkalmazsunkon bellrl? Hogyan
hvha~uk

meg a Safarit az alkalmazsunkon

bellrl? bellrl?

Hogyan hvhatjuk meg a Phone-t az alkalmazsunkon Hogyan kldhetnk SMS-t az alkalmazsunkon

bellrl?

Hogyan frhetnk hozz a karnerhoz s a Photo Libraryhez? Hogyan frhetnk hozz a Contacts alkalmazshoz? Hogyan adhatunk hozz vagy tvolthatunk el nvjegyeket a Contacts alkalmazsbl?

Az iPhone szmos gyri alkalmazssal kerl piacra, tbbek kztt ez teszi minden idk egyik legnpszerbb mobilkszlkv. Ezek kztt az alkalmazsok kztt van a Contacts, a Maii, a Phone, a Safari, az SMS s a Calendar. Ezek az alkalmazsok elvgzik a legtbb olyan mveletet, amelyet egy mobiltelefontl elvrunk. iPhone-fejlesztknt persze megtehe~k, hogy prograrnozottan, az iPhone SDK ltal tartalmazott API-k (Application Programming lnterfaces - alkalmazsprogramozi felletek) segtsgvel az ltalunk kszitett alkalmazsokbl hvjuk meg ezeket az alkalmazsokat. Ez a fejezet azt mutatja meg, hogyan hvhatjuk meg a gyri alkalmazsokat, s hogyan lphetnk ezekkel interakciba a sajt alkalmazsunkbL

16. fejezet: A beptett alkalmazsok elrse

E-mailek kldse
E-mailt rninden iPhone-hasznl szokott kldeni. Ezt a feladatot ltja el a beptett Mail alkalmazs. Ez egy gazdag HTML-kliens, amely tmogatja a POP3-at, az IMAP-t, az Exchange email rendszereket s a legtbb webalap e-mail programot, pldul a Yahool-t s a Gmailt. Ugyanakkor elfordul, hogy az alkalmazson bellrl szeretnnk elektronikus levelet kldeni. Erre j plda az, arnikor visszacsatols gombot gyazunk be az alkalmazsainkba, hogy a felhasznlk egyenesen visszakldhessk a vlemnyket. Az e-mailek kldsnek kt programozott lehetsge van: Felpthetjk sajt e-mail kliensnket az e-mail szerverekkel val kommunikcihoz szksges protokollokkal.
Meghvha~uk

a gyri Mail alkalmazst, s azzal kldethetjk el a levelet.

Ha nem vagyunk jratosak a hlzati kommunikci s a protokollok vilgban, jobb, ha a msoclik lehetsget vlasztjuk, s a Mail alkalmazssal vgeztetjk el a munkt. A kvetkez gyakorlati rsz ezt a lehetsget mutatja be. (Ehhez le kell tltennk a kijellt programkdfjlokat.)
E-mailek kldse a Maii alkalmazssal
A [VCExamplqjp} programkd a 1Vrox.com oldalrl toJthel le.

1. Hozzunk ltre egy j, nzeralap alkalmazs- (View-based Application) projektet az Xcode segtsgve!, s nevezzk elEmai ls-nak. 2. Ahhoz, hogy az Interface Builderrel szerkesszk, kattintsunk ktszer a Emai 1viewcontroll er . xi b fjlra. 3. A
kvetkez

elemekkel tltsk fel a View ablakot (lsd a 16.1. brt):

Label TextField Button


kvetkez

4. Szrjuk be a fjlba:

flkvren szedett utastst az Email svi ewcontro ll er. h

366

E-mailek kldse

#import <UIKit/UIKit.h> @i nterface Emailsviewcontroller : UIViewcontroller { IBOutlet UITextField *to; IBOutlet UITextField *subject; IBOutlet UITextField *body;
}

@property (nonatomic, retain) UITextField *to; @property (nonatomic, retain) UITextField *subject; @property (nonatomic, retain) UITextField *body; -(IBAction) btnsend: (id) sender; @ end

5. Visszatrve az Interface Builderbe,


Control-kattintssal hzzuk a File's Owner elemet a hrom TextField elem rnindegyikhez, majd egyenknt vlasszuk a to, a subject s a body elemeket.
Body:

Send

6.

Control-kattintssal hzzuk a Button elemet a File's Owner elemre, s vlasszuk a btnsend : -et.

7. Szrjuk be a kvetkez flkvren szedett utastst az Email svi ewcontro ll er. m fjlba: #import "Emailsviewcontroller.h" @implementation Emailsviewcontroller @synthesize to, subject, body;
16.1. bra

- (void) sendEmailTo:(NSString * ) tostr withsubject: (NSString *) subjectstr withBody: (NSString *) bodystr { NSString *emailstring = [[NSString alloc] initWithFormat:@"mailto:?to=%@&subject=%@&body=%@", [toStr stringByAddingPercentEscapesusingEncoding:NSASCIIStringEncoding], [subjectstr stringByAddingPercentEscapesusingEncoding:NSASCIIStringEncoding], [bodyStr stringByAddingPercentEscapesusingEncoding:NSASCIIStringEncoding]];

367

16. fejezet: A beptett alkalmazsok elrse

[[UIAppl i cati on s haredApplication] openURL : [NSURL URLWithString:emailString]]; [em lst ri ng release]; ai


}

-(IBAction) btnsend: (id) sender{ [self sendEmai lTo:to .text withsubject:subject.text withBody:body.text];
}

- (voi d) deal l oc { [to release]; [subj ect release]; [body release]; [s upe r deall oc];

8. Nyomjuk meg a Command-R gombokat, hogy teszteljk az alkalmazst. A 16.2. bra mkds kzben muta* be az alkalmazsunkat. Miutn a szksges informcikkal feltltttk a TextField elemeket, a Mail alkalmazs meghvshoz nyomjuk meg a Send (klds) gombot, s az alkalmazsunkba is begpelt informcikkal tltsk fl. Ha a Mailen bell nyomjuk meg a Send gombot, elkldjk a levelet.

Megjegyzs Ez a plda csak valdi kszlken mkdik, az iPhone Simulatorban nem tudjuk tesztelni. Az E fggelk bemutatja, hogyan ksztsk fel i Phone telefonunkat a tesztelsre.

Cc/Bec F
Subjec

'"' ~..,..<t:oarn2devel.

Hello therel

l)ending email from wilhin my app ...

space

16.2. bra

368

E-mailek kldse

Hogyan mkdik?
A Maii alkalmazs meghivsnak lnyege az ltalunk meghatrozott sendEmailTo:withsubject: wi th Body: metdusban ltrehozott karakterlncban rejlik: NSString *emailString = [[NSString alloc] initwithFormat:@"mailto:?to=%@&subject=%@&body=%@", [tostr stringByAddingPercentEscapesusingEncoding:NSASCIIStringEncoding], [subjectstr stringByAddingPercentEscapesusingEncoding:NSASCIIStringEncoding], [bodyStr stringByAddingPercentEscapesusingEncoding: NSASCIIStringEncoding)); Ez valjban egy mai lto: protokollal indiklt URL-karaktedn c. Az olyan paramterek, mint a to, a sub j e ct s a body a karakterlncba vannak beszrva. Az NSStri ng osztly st ri ngByAddi ngPercentEscapesusi ngEncodi ng: metdust hasznljuk arra, hogy a klnfle paramtereket kdoljuk a
megfelel

szzalkjel-kdolssal, vagyis a vgeredmnynek hivjuk a sharedApp l i ca ti on metdust,

rvnyes URL-karakterlncnak kell lennie. A Maii alkalmazs meghvshoz


egyszeren

hogy a singleton alkalmazspldnyt visszakapjuk, majd hasznljuk a openURL: metdust, hogy a Maii alkalmazst meghivhassuk: [[UIApplication sharedApplication] openURL: [NSURL URLWithString:emailString)); [email string release];

A Satari meghivsa
Ha a Safari
bngszt

szeretnnk meghvni az iPhone-unkon, akkor is hasznt vehetjk


kvetkezkben

az URL-karakterlncnak, majd a

lertak szerint hasznlhatjuk a szban

forg alkalmazs openURL: metdust: [[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"http://www.apple.com")); Az


elz

kdrszlet meghvja a Safarit, hogy az megnyissa a www. ap pl e. com oldalt Osd a

16.3. brt).

A Phone alkalmazs meghivsa


vetkez

Ha az iPhone trcszjnak segtsgvel szeretnnk telefonhivst inclitani, akkor a kURL-karakterlncot hasznljuk:

369

16. fejezet: A beptett alkalmazsok elrse


[[UIApplication sharedApplication] openURL: [NSURL URL Wi thStri ng: @"te l : 1234567890"]] ;

Az

elz

utasts a megadott telefonszmmal meghvja az iPhone trcszjt.

Az SMS alkalmazs meghivsa


Ahhoz, hogy az SMS alkalmazssal zenetet kldjnk, ugyancsak hasznlhatunk URLkarakterlncot:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"sms :96924065 "]];

Az

elbbi

utasts meghvja az SMS alkalmazst (lsd a 16.4. brt).

16.3. bra

16.4. bra

370

A Carnera s a Photo Library elrse

Megjegyzs Az elbbi utasts csak az i Phone esetben mkdik, az i Pod Touch esetben nem, hiszen azzal nem lehet telefonlni. Az utasts kiprblshoz valdi kszlkre van szksgnk, ugyanis a programkd nem m k dik az iPhone Simulatorban. Az E fggelk lerja, hogyan ksztsk el iPhoneunkat a tesztelshez.

J
AZ SMS ZENETEK FOGADSA
Az iPhone SDK-val szemben tmasztott egyik elvrs az, hogy kpesek legynk egy iPhone alkalmazsorr bellrl SMS zenetet fogadni. Az SD K jelenlegi verzija ezt nem teszi leh etv. Tovbb arra sincs lehetsgnk, hogy kzvetlenl az alkalmazsbl kldjnk SMS zenetet; ezt is csak a gyri SMS alkalmazssal tehe~k meg. Ez viszont megakadlyozza, hogy a csal alkalmazsok a felhasznl tudta nlkl kldhessenek SMS-t.

A Carnera s a Photo Library elrse


Az iPhone s az iPod Touch is rendelkezik olyan kamerval, amellyel kpeket vagy videkat kszthetnk Az elmentett kpek s videk a Photos alkalmazsba kerlnek. Fejlesztknt szmos lehetsgnk van arra, hogy a kamert manipulljuk, vagy hogy a Photos alkalmazsban trolt kpekhez s videkhoz hozzfrjnk: Kpek vagy videk ksztshez meghvhatjuk a Camert. Meghvhatjuk a Photos alkalmazst, s lehetv tehe~k, hogy a felhasznlk kpeket vagy videkat vlogassanak a fotalbumokbL Ezutn felhasznlhatjuk az alkalmazsunkban kivlasztott kpet vagy vide t.

A Photo Library alkalmazs elrse


Az iPhone s az iPod Touch is rendelkezik a Photos alkalmazssal, amelybe a kpeket vagy videkat elmenthe~k. Az iPhone SDK segtsgvel hasznlhatjuk a unmagePickercontroller osztlyt, hogy programozottan olyan felhasznli felletet jelentsnk meg, amelyrl a felhasznl a Photos alkalmazsbl kivlaszthatja a kpeinket s a videinkat. A kvetkez gyakorlati rsz ezt mutatja be.

371

16. fejezet: A beptett alkalmazsok elrse

A Photo Library alkalmazs elrse


A [PhotoUbraty.'{jp) fjl a U 7rox.com oldalrl tolthel le.

1. A2 Xcode segtsgvel hozzunk ltre egy j View-based Application projektet, s nevezzk el Photol i brary-nek.
Load Photo Library

2. Kattintsunk ktszer a Photo Li braryvi ewcontro ll er. xi b fjlra, hogy az Interface Builderben szerkesszk. 3. Tltsk fel a View ablakot a kvetkez

elemekkel (lsd a 16.5. brt) : Button, ImageView.

4. Az ImageView Attributes Inspector ablakban a Made-ot llitsuk Aspect Fi t-re. 5. A


kvetkez,

flkvrrel szedett uta16.5. bra

stsokat szrjuk be a PhotoL i braryviewcontroller.h fjlba:

##import <UIKit/UIKit.h> @interface Photolibraryviewcontroller : UIViewcontroller <UINavigationControlleroelegate, UIImagePickercontrollerDelegate> { IBOutlet urimageView *imageview; UIImagePickercontroller *imagePicker;

@property (nonatomic, retain) urimageview *imageview; -(IBAction) btnclicked: (id) sender; @end

6.

Visszatrve az Interface Builderbe, Control-kattintssal hzzuk a File's Owner elemet az Image View elemre, majd vlasszuk a i magevi ew-t.

7. Control-kattintssal hzzuk a Button elemet a File's Owner elemre, majd vlaszszuk a bt nel i c ked: -et.

372

A Carnera s a Photo Library elrse

8. A kvetkez, flkvrrel szedett utastsokat szrjuk be a Photo Li braryvi ewcontroll er .m fjlba:


#import "PhotoLibraryviewcontroller.h" @implementation PhotoLibraryviewcontroller @synthesize imageview; - (void)viewoidLoad { imagePicker = [[UIImagePickercontroller alloc] init]; [super viewoidLoad];
}

- (IBAction) btnclicked: (id) sender{ imagePicker.delegate = self ; imagePicker.sourceType = urrmagePickercontrollersourceTypePhotoLibrary; //---show the Image Picker--[self presentModalviewcontroller:imagePicker animated:YES];
}

- (void)imagePickercontroller:(urrmagePickercontroller *)picker didFinishPickingMediaWithinfo:(NSDictionary *)info { UIImage *image; NSURL *mediaurl; mediaurl = (NSURL *)[info valueForKey:UIImagePickercontrollerMediaURL]; if emediaurl == nil) { image = (urrmage *) [info valueForKey:urrmagePickercontrollerEditedrmage]; if (image == nil) { //---original image selected--image = (UIImage *) [info valueForKey:urrmagePickercontrolleroriginalrmage]; //---display the image--imageview.image =image; } else //---edited image picked--{ //---get the cropping rectangle applied to the image--CGRect rect = [[info valueForKey:urrmagePickercontrollercropRect] CGRectvalue ]; //---display the image--imageView.image =image;
}

373

16. fejezet: A beptett alkalmazsok elrse


else
{

//---video picked--// ...


}

//---hide the Image Picker-- [picker dismissModalviewcontrollerAnimated:YES];


}

- (void)imagePickercontrolleroidcancel:(UIImagePickercontroller *)picker
{

//---user did not select image/video; hide the Image Picker--[picker dismissModalviewcontrollerAnimated:YES];
}

- (voi d) deall oc { [imageview release]; [imagePicker release]; [super dealloc] ;

9.

yomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatorban teszteljk

16.6. bra

374

A Carnera s a Photo Library elrse

10. Az alkalmazs betltse utn koppintsunk a Load Photo Library (Fnykptr betltse) gombra, gy a Photo Albumok megjelennek az iPhone Simulatoron Osd a

16.6. brt). Vlasszunk kpet; a kivlasztott kp az ImageView elemen jelenik meg.


Hogyan
mkdik?

A Photo Libraryhez a UIImagePickercontroller osztllyai frhetnk hozz, ez biztostja a kpek vagy a videk ksztst s kivlasztst a felhasznli fellet szmra. Nem kell mst tennnk, mint elkszteni ennek az osztlynak egy pldnyt, majd olyan delegltat biztostani, amely megvals~a a UIImagePi ckercontro ll erDe l e gate protokollt. Tovbb a delegltunknak meg kell valstania a UINavigationControlleroelegate protokollt is, hiszen az unmagePickercontroller osztly a navigcis vezrlt hasznlja ahhoz, hogy a felhasznlk fotkat vlaszthassanak ki a Photo Libraryben. gy elszr a Photo Li braryvi ewcontro ll er. h-ban
lv

protokollokat kell meghatroznunk

@interface PhotoLibraryviewcontroller : UIViewcontroller <UINavigationcontrollerDelegate, UIImagePickercontrolleroelegate> {

A Load Library gombra rkattintva llitsuk be a UIImagePickercontroller osztly ltal


megjelentend

"vlaszt"

kezelfellet

tpust, majd jelentsk meg modlisan:

- (IBAction) btnclicked: (id) sender{ //---the delegate that implements the methods defined in the protocols--imagePicker.delegate = self; //---type of source--imagePicker.sourceType

UIImagePickercontrollersourceTypePhotoLibrary;

//---show the Image Picker--[self presentModalviewcontroller:imagePicker animated:YES];

Ha azt szeretnnk, hogy a felhasznl is szerkeszthesse a kivlasztott kpet, adjuk hozz a kvetkez utastst: imagePicker.allowsimageEditing
=

YES;

A forrs tpusa alaprtelmezettknt mindig UIImagePi eke rcontro ll e r so urceTypePhotoLi brary lesz. Persze, ha szeretnnk, meg is
vltoztatha~uk

kvetkezk

valamelyikre:

UIImagePickercontrollersourceTypecamera UIImagePickercontrollersourceTypesavedPhotosAlbum

375

16. fejezet: A beptett alkalmazsok elrse

Arnikor a felhasznl kivlaszt egy kpet/ videt, az imagePickercontroller: didFinishPi ck i ngMedi awi thinfo: esemny megvals ul, s ezt a felhasznl ltal kivlasztott mdiapuson keresztl kezelhe~k:
- (void)imagePickercontroller:(UIImagePickercontroller *) picker didFinishPickingMediawithinfo:(NSDictionary *)i nfo { UIImage *image ; NSURL *mediaurl; mediaurl = (NSURL *)[i nfo valueForKey:UIImagePickercontrollerMediaURL]; if emediaurl == nil)
{

image = CUIImage *) [info valueForKey:UIImagePickerControllerEditedimage]; if (image == nil)


{

//--- original image selected--image = (UIImage *) [info valueForKey:UIImagePickercontrolleroriginalimage]; // ---display the image--imageview.image = image; else //--- edited image picked--{

//- --get the cropping rectangle applied to the image--CGRect rect = [[info valueForKey:UIImagePickercontrollercropRect] CGRectvalue ]; //---display the image- -imageview.image =image;
}

else
{

//-- -video picked---

/l ...

//--- hide the Image Picker--[picker dismissModalviewcontrollerAnimated:YES];


}

A felhasznl ltal kivlasztott mdiapus a di d Fi ni shPi ck ingMedia wi th Info: pararnterhe van gyazva. A klnbz mdiapusok kibontshoz a valueForKey: metdust hasznlhatjuk, hogy azutn a megfelel pushoz utasthassuk
mediaurl = (NSURL *)[info valueForKey:UIImagePickercontrollerMediaURL];

376

A Carnera s a Photo Library elrse

Ha a felhasznl trli a kivlasztst, az imagePickercontrollerDidcancel: esemny kvetkezik be. Ekkor


egyszeren

bezrjuk az Image Pickert:

- (void)imagePickercontrollerDidcancel :(UIImagePickercontroller *) picker //--- user did not select image/video; hide the Image Picker--[picker dismissModalviewControllerAnimated :YES];
}

A Carnera alkalmazs elrse


A Photo Library mellett a karnerhoz is hozzfrhetnk. A hardverhez val hozzfrs a
kvetkez

fejezet tmja lesz, de minthogy a hozzfrs a unmagePickercontroller oszelz

tllyai trtnik, most is kpet kaphatunk rla. Ahhoz, hogy a karnerhoz is hozzfrhessnk, mdostanunk kell az szakaszban ltrehozott projektnket. Nem kell tl sokat vltoztatnunk, a mr megrt programkclak ugyanis tovbbra is rvnyesek.

Ei@i A karnera aktivlsa


1. Az
elz

szakaszban ltrehozott projektben szerkesszk t a Photo l i braryvi ew-

Controller.m fjlt, s az Image Picker forrstpust vltsuk t karnerra (a programkdot lsd flkvrrel kiemelve): -(IBAction) btnclicked: (id) sender{ imagePicker . de legate = self; //---comment this out- -//imagePicker.sourceType = UIImagePickercontrollersourceTypePhotoLibrary; //---invoke the camera--imagePicker.sourceType = urrmagePickercontrollersourceTypecamera; imagePicker.allowsrmageEditing =YES; [self presentModalviewcontroller:imagePicker animated:YES];

2. A PhotoLibraryviewController.h fjlban adjuk meg a ba elmenthessk (a kszlken):

kvetkez

kt, flkvrrel

kiemeit metdust, hogy gy az elksztett kpet az alkalmazs Documents mappj-

377

16. fejezet: A beptett alkalmazsok elrse


#import <UIKit/UIKit.h> @interface PhotoLibraryviewcontroller : UIViewController <UINavigationcontrolleroelegate , UIImagePickercontrolleroelegate> { IBOutlet UIImageview *imageview; UIImagePickercontroller *image Picker ;
}

@property (nonatomic, retain) UIImageview *imageview; -(IBAction) btnclicked: (id) sender; - (NSString *) filePath: (NSString *) fileName; - (void) saveimage; @end

3. A PhotoLibraryviewcontroller.m fjlban hatrozzuk meg az


adott kt metdust:

elz

lpsben meg-

- (NSString *) filePath: (NSString *) fileName { NSArray *paths = NSSearchPathForoirectoriesinDomains( NSDocumentDirectory, NSUseroomainMask, YES); NSString *documentsoir = [paths objectAtindex:O]; return [documentsoir stringByAppendingPathcomponent:fileName];
}

- (void) saveimage{ //---get the data from the Imageview--NSData *imageoata [NSData dataWithData:UIImagePNGRepresentation(imageview.image)]; //---write the date to file--[ i mageoata wri teToFi l e: [self fil e Path: @"MyPi ct u re. png"] atomi ca ll y: YES] ;
}

4. Jobb gombbal kattintsunk az Xcode Frameworks csoporl:jara, s vlasszuk az


Add };>- Existing Frameworks (hozzads };>- meglv keretrendszerek) lehets get. Vlasszuk a Frameworks/Medi aP layer. framework elemet.

5. A

kvetkez

headerllomnyt importljuk a PhotoL i braryvi ewcontroll er. h fjlba:

#import <UIKit/UIKit.h> #import <MediaPlayer/MediaPlayer.h>

6. A

kvetkez

flkvren szedett utasts t szrjuk be a fjlba:

- (void)imagePickercontroller:(UIImagePickercontroller *)picker didFinishPickingMediawithinfo:(NSDictionary *)info { unmage *image; NSURL *mediaurl;

378

A Carnera s a Photo Library elrse

mediaurl = (NSURL *) [info valueForKey:UIImagePickerControllerMediaURL]; if (mediaurl == nil) { image = CUIImage *) [info valueForKey:UIImagePickercontrollerEditedimage]; if (image == nil) { //-- -original image selected--image = (UIImage *) [info valueForKey:UIImagePickercontrolleroriginalimage]; //---display the image--imageview . image =image; //---save the image captured--[self saveimage];
}

else
{

//---edited image picked--/l--- get the cropping rectangle applied to the image--CGRect rect = [[info valueForKey:UIImagePickerControllercropRect] CGRectvalue ]; //---display the image--imageview.image =image; //---save the image captured--[self saveimage];
} }

else
{

//---video picked--MPMoviePlayercontroller *player [pl ayer pl a y];


}

[[MPMoviePlayercontroller alloc] initwithcontentURL:mediaurl];

//--- hide the Image Picker- -[picker dismissModalviewcontrollerAnimated:YES];

7. Ahhoz, hogy az alkalmazst valdi iPhone-on teszteljk, nyomjuk meg a Command-R gombokat.

Megjegyzs Az E fggelk lerja, hogyan ksztsk el i Phone-unkat a tesztelshez.

379

16. fejezet: A beptett alkalmazsok elrse

8. Koppintsunk a Load Photo Library gombra, gy mr kpeket vagy videkat kszthetnk az iPhone kamerjval. Ha kpet ksztnk, az az alkalmazsunk Document mappjba kerl. Az elksztett viclet a kszlken tallhat mdialejtszval nzhetjk vissza.

Hogyan mkdik?
Ebben a gyakorlatban az Image Picker forrstpust mdostottuk a karnerhoz: imagePicker.sourceType ; UIImagePickercontrollersourceTypecamera; Arnikor kpet ksztnk a kamerval, a kp visszakerl az i mag e Pi ckercontro ll er: di d Fi ni shPi c ki ngMedi awi th Info: metdusba, s az ImageView elemerr jelenik meg. Ugyanakkor a kpet mr neknk kell elmentennk a telefonra. Ahhoz, hogy a kpet az alkalmazsunk Document mappjba mentsk, most a fi l e Path: metdust definiltuk: - (NSString *) filePath: (NSString *) fileName { NSArray *paths; NSSearchPathForDirectoriesinDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDir; [paths objectAtindex:O]; return [documentsDir stringByAppendingPathComponent:fileName];

A saveimage: metdus az ImageView elemen jelenti meg a kpet, majd a filePath: metdussal a MyPi ct u re. png-nek nevezett fjlba menti: - (void) saveimage{ //---get the date from the Imageview--NSData *imageData [NSData dataWithData:UIImagePNGRepresentation(imageview.image)];

//---write the date to file--[imageData writeToFile: [self filePath:@"MyPicture.png"'] atomically:YES];

A videofelvtelek a kszlkre kerlnek, s URL-knt nzhetk vissza. A visszajtszshoz az MPMoviePlayercontroller- a MediaP!ayer keretrendszerben elrhet- osztlyt hasznlhatj uk: //---vi deo picked--MPMoviePlayercontroller *player [player play]; [player release];

[[MPMoviePlayercontroller alloc] initWithcontentURL:mediaurl];

380

A Contacts alkalmazs elrse

A Contacts alkalmazs elrse


hasonlan a Contacts is az ltalnosan hasznlt iPhone s iPod Touch gyri alkalmazsainak az egyike Osd a 16.7. brt). A Contacts alkalmazs azoknak a nvjegyeinknek a listjt tartalmazza, amelyeket a kszlknkre elmentettnk
Az
elzekhez

Ciarence M1ke Edward We1 Meng Lee

. " . .
G
l
L

."

16.7. bra

A Photo Libraryhez hasonlan a Contacts alkalmazsban trolt nvjegyekhez is hozzfrhetnk programozottan, gy az alkalmazsunk tmaszkodhat a Contacts alkalmazsra, s a nvjegyadataink trolshoz nem kell sajt adatbzist ltrehoznunk. A kvetkez gyakorlati rszben azt nzzk meg, hogyan frhetnk hozz a Contacts alkalmazshoz, az A ddressBookUI keretrendszerben l v ABPeop l e Pi ckerNavi gat i oneontroller osztly segtsgveL Ehhez le kell tlteni az itt megadott programkdfjlokat.
A nvjegy rszleteinek megjelenitse
Az [AddressBook.ifp] kdfjl, a Wrox.com-ri letiJlthet.

l. Az Xcode segtsgvel hozzunk ltre View-based Application projektet, s nevezzk el AddressBook-nak

381

16. fejezet: A beptett alkalmazsok elrse


2. Jobb gombbal kattintsunk az Xcode Frameworks csoportjra, s vlasszuk az Add );> Existing Frameworks lehetsget.
Load Contacis

3. Vlasszuk a Frameworks/ AddressBook.


framewerk-t s a Frameworks/AddressBookur. framewor k-t. Ha megjelenik az a krds, hogy hozz akarjuk-e adni a projekthez, nyomjuk meg az Add (hozzads) gombot. 4. Ahhoz, hogy az Interface Builderben szerkesszk, kattintsunk dupln az AddressBookvi ewcontro ll er. xi b fj lra. 5. A View ablakot tltsk fel a Button elemmel (lsd a 16.8. brt) .

6. A

kverkez,

flkvrrel szedett uta16.8. bra

stsokat szrjuk be az AddressBookvi ewcontroller. h fjlba: #import <UIKit/ UIKit.h > #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h>

@i nterface AddressBookviewcontroller : urviewcontroller <ABPeoplePickerNavigationcontrolleroelegate> {

-(IBAction) btnclicked: (id) sender; @e nd 7. Visszatrve az Interface Builderbe, Control-kattintssal hzzuk a Button elemet a File's Owner elemre, s vlasszuk a btn cl i cked:-et

8. A

kvetkez,

flkvrrel szedett utastsokat szrj uk be az AddressBookvi ewcont-

ro ll e r . m fjlba: #import "AddressBookvi ewcontroll er. h" @i mplementation AddressBookviewcontroller -(IBAction) btnclicked: (id) sender{ ABPeoplePickerNavigationcontroller *picker = [[ABPeoplePickerNavigationcontroller alloc] init] ; picker . peoplePickerDelegate = self; //---display the People Picker---

382

A Contacts alkalmazs elrse [self presentModalviewcontroller:picker animated:YES]; [picker release];


}

- (void)peoplePickerNavigationcontrolleroidcancel: (ABPeoplePickerNavigationController *)peoplePicker { //---hide the People Picker--[self dismissModalviewcontrollerAnimated:YES];


}

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationcontroller *)peoplePicker shouldcontinueAfterselectingPerson:(ABRecordRef)person { //---get the First Name--NSString *str = (NSString *)ABRecordcopyvalue(person, kABPersonFirstNameProperty); str = [str stringByAppendingString:@"\n"]; //---get the Last Name--str = [str stringByAppendingstring:(NSString *)ABRecordcopyvalue( person, kABPersonLastNameProperty)]; str = [str stringByAppendingstring:@"\n"]; //---get the Emails--ABMultivalueRef emailinfo ABRecordCopyvalue(person, kABPersonEmailProperty); //---iterate through the emails--for (NSUinteger i=O; i< ABMultivalueGetcount(emailrnfo); i++) { str = [str stringByAppendingstring: (NSString *)ABMultivalueCopyvalueAtindex(emailrnfo, i)]; str = [str stringByAppendingstring:@"\n"];
}

//---display the details--UIAlertview *alert = [[UIAlertview alloc] initWithTitle:@"Selected Contact" message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; //---hide the People Picker--[self dismissModalviewcontrollerAnimated:YES]; return NO;
}

- (BOOL)peoplePickerNavigationcontroller: (ABPeoplePickerNavigationcontroller *)peoplePicker shouldcontinueAfterselectingPerson:(ABRecordRef)person property:(ABPropertyiD)property

383

16. fejezet: A beptett alkalmazsok elrse identifier:(ABMultivaluerdentifier)identifier { [self dismissModalviewcontrollerAnimated :YES]; return NO;

9. Ha az alkalmazst az iPhone Simulatorban szetetnnk tesztelni, akkor legalbb egy, a kvetkez adatokkal elltott kapcsolat legyen a Contacts alkalmazsban Osd a 16.9. brt): keresztnv, vezetknv, e-mail.

10. Nyomjuk meg a Command-R gombokat, hogy az alkalmazsunkat az iPhone Simulatoron teszteljk A Contacts alkalmazs megnyitshoz koppintsunk a Load Contacts gombra. Ha kivlasztunk egy nvjegyet, a rszletek figyelmeztetelemknt jelennek meg O sd a 16.1 O. brt).
16.9. bra

Hogyan

m.kdik?

Az elz szakaszhoz hasonlan, ahol a urrmagePi ckercontro ll er osztly segtsgvel tudtunk fott kivlasztani a Photo Librarybl, az ABPeoplePickerNavigationcontroller osztly segtsgvel ezttal nvjegyeket vlaszthatunk ki a Contacts alkalmazsbL Mieltt az ABPeoplePickerNavigationcontroller osztlyt hasznlnnk, az AddressBook s az Addresssookur keretrendszereket hozz kell adnunk a projektnkhz. Csakgy, mint a urrmagePickercontroller osztlynl, itt is meg kell felelnnk egy specilis protokollnak, a ABPeoplePickerNavigationControl lerDelegate-nek. Miutn a Contacts alkalmazsbl kivlasztortuk a nvjegyet, a kvetkez metdusokat hivhatjuk meg: peoplePickerNavigationcontroller :shouldcontinueAfterselectingPerson: peoplePickerNavigationController:shouldContinueAfterSelectingPerson :property: i denti fi er: peoplePickerNavigationcontrollerDidcancel:

384

A Contacts alkalmazs elrse

Weo -Meng Lee

. . .
J

' .
G
L
G

16.10. bra

A peoplePickerNavigationcontrolleroidcancel : metdus akkor lvdik meg, arnikor a


nvjegy kivlasztsakor rkoppintunk a Cancel (mgse) gombra. Ha egy kapcsolatra koppintunk r, akkor a peoplePickerNavigationcontroller:shouldcontinueAfterSelectingPerson : metdus lvdik meg. A kivlasztott nvjegy adatai az ABRecordRef tpus shoul dconti nueAfterse l ecti ngPerson: paramterbe vannak begyazva. Ebben a pldban a nvjegy klnfle tulajdonsgait bontottuk ki, s jelentettk meg az Al ertview osztly segtsgveL //--- get the First Name--NSString *str = (NSString *) ABRecordcopyValue ( person , kABPersonFirstNameProperty) ; str = [str stringByAppendingstring :@"\ n"]; //- --get the Last Name--str = [str stringByAppendingString: ( NSString *) ABRecordcopyvalue ( person, kABPersonLastNameProperty)]; str = [str stringByAppendingString: @"\ n"]; //---get the Emails--ABMultiValueRef emailinfo ABRecordcopyvalue(person, kABPersonEmailProperty) ;

385

16. fejezet: A beptett alkalmazsok elrse

//---iterate through the emails--for (NSUinteger i=O; i< ABMultivalueGetcount(emailinfo); i++) { str = [str stringByAppendingString: (NSString *)ABMultivalueCopyvalueAtindex(email info, i)]; str = [str stringByAppendingString:@"\n"];

//---display the details--UIAlertview *alert = [[UIAlertview alloc] initWithTitle:@"Selected contact" message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [al ert show]; [al ert release]; Ha kszen vagyunk, kapcsoljuk ki a People Pickert, s jelertsk meg a NO-t (amely semmit sem csinl): //---hide the People Picker--[self dismissModalviewcontrollerAnimated:YES]; return NO;

J\ peoplePickerNavigationcontroller:shouldcontinueAfterselectingPerson:property: i denti fi er: esemny akkor kvetkezik be, amikor rkoppintunk egy kapcsolatta, hogy a tulajdonsgait megnzhessk. Ez csak akkor kvetkezik be, amikor a peoplePickerNavigati oneont ro ll e r: shou l dconti nueA fterse l e c ti ngPerson: metdus YES-t ad vissza. Ha YES-t ad vissza, akkor a Contacts alkalmazs tovbbhalad, s megmutatja a kivlasztott nvjegy adatait. J\mikor egy tulajdonsgot kivlasztunk, a people PickerNaviga ti oncontroller:shouldcontinueAfterselectingPerson:property:identifier: esemny kvetkezik be. Ebben az esetben egy YES-t fogunk visszaadni, hogy a kivlasztott tulajdonsgra megvalsuljon a cselekvs, s bezrjuk a vlaszt elemet. Ha a szemlyt a vlaszt elemben szeretnnk megjelerteni, akkor NO-t kell visszaadnunk.

Nvjegy hozzadsa
J\rnellett, hogy a nvjegyeink mentett adatait megjelerthetjk, j nvjegyeket is elmenthetnk kzvetlenl a Contacts alkalrnazsba. Ezt a kvetkez kdrszletekkel tehetjk meg: -(void) addcontact{ ABAddressBookRef addressBook = ABAddressBookcreate(); ABRecordRef person= ABPersoncreate(); //---add the first name and last name--ABRecordsetvalue(person, kABPersonFirstNameProperty, @"Wei-Meng" , nil); ABRecordsetvalue(person, kABPersonLastNameProperty, @"Lee", nil); 386

A Contacts alkalmazs elrse //---add the address--ABMutableMultivalueRef address ABMultivaluecreateMutable(kABMultiDictionaryPropertyType); NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init]; [addressoictionary setobject:@"Some Street Name" forKey:(NSString *) kABPersonAddressstreetKey]; [addressDictionary setObject:@"New York" forKey:(NSString *) kABPersonAddresscityKey]; [addressDictionary setObject:@"NY" forKey:(NSString *) kABPersonAddressstateKey] ; [addressDictionary setobject:@"l2345" forKey:(NSString *) kABPersonAddressZIPKey] ; [addressoictionary setobject:@"United States" forKey:(NSString *) kABPersonAddresscountryKey] ; [addressoictionary setobject:@"us" forKey:(NSString *) kABPersonAddresscountrycodeKey]; ABMultivalueAddvalueAndLabel(address, addressoictionary, kABHomeLabel, NULL); ABRecordsetvalue(person, kABPersonAddressProperty, address, nil); //---add the address book for the contact and save the addressbook--ABAddressBookAddRecord(addressBook, person, nil); ABAddressBooksave(addressBook, nil); CFRelease(person);

A fenti metdus, az addcontact, j nvjegyet ad a Contacts alkalmazshoz. A kvetkez informcikkal tlti fel a kapcsolatot:

keresztnv, vezetknv, otthoni cm:

utca, vros, megye, irnytszm, orszg, orszg hvkdja.

A 16.11. bra bemutatja az j nvjegy rszleteit.


16.11. bra

387

16. fejezet: A beptett alkalmazsok elrse

Megjegyzs Ha tbbet szeretnnk a nvjegyek hozzadsnak klnbz metdusairl megtudni, akkor nzznk bele az Apple iPhone Reference Libraryjben lv ABAddressBookba. Ezt a ht tp:/ /developer. apple. com/ iphone/library/documentation/AddressBook/Reference/ABAddressBookRef _i PhoneOS/ ABAddressBookRef_i Ph on eos. pdfhelyrl tlthetjk le.

Nvjegy trtse
A nvjegy eltvoltshoz a
kvetkez
*)

kdrszletet hasznljuk: firstName andLastName:(NSString *) lastName {

-(void) removecontact: (NSString

ABAddressBookRef addressBook; ABAddressBookcreate(); CFArrayRef allcontacts; ABAddressBookCopyArrayofAllPeople(addressBook); CFindex contactscount; ABAddressBookGetPersoncount(addressBook); for (int i ; O; i < contactscount; ++) ABRecordRef ref; CFArrayGetValueAtindex(allcontacts, i); NSString *contactFirstName ; (NSString *) ABRecordcopyValue( ref, kABPersonFirstNameProperty); NSString *contactLastName ; (NSString *) ABRecordcopyvalue( ref, kABPersonLastNameProperty); if [firstName isEqualToString:contactFirstName] && [lastName isEqualToString:contactLastName]) ABAddressBookRemoveRecord(addressBook, ref , nil); ABAddressBooksave(addressBook, nil);
}

A remavecontact metdus kt paramtert, a firstName-et s a l astName-et veszi alapul, s ezek alapjn keresi meg a Contacts alkalmazsban az egyez kereszt- s vezetknevet Ha megtallja a nvjegyet, akkor trli a Contacts alkalmazsbL

Megjegyzs Ha tbbet szeretnnk a nvjegyek trlsnek klnbz metdusairl megtudni, akkor nzznk bele az Apple iPhone Reference Libraryjben lv ABAddressBookba. Ezt a http://developer.apple.com/iphone/library/documentation/AddressBook/Reference/ABAddressBookRef_iPhoneOS/ ABAddressBookReLi Phoneos. pdfhelyrl tlthetjk le.

388

A Contacts alkalmazs elrse

SSZEGZS
Ebb l a fej ezetbl megismerhettk, hogy mennyire egyszer a gyri alkalmazsokat sajt iPhone-alkalmazsainkba integrlni: SMS, Mail, Safari s trcsz megillvsa egy egyszer URL-karakterlnccaL Megnztk tovbb, hogyan frhetnk hozz a Contactshoz s a Pho to Libraryhez az iPhone SD K-ban tallhat osztlyok segtsgveL

ntH3i.li
1. Mik a Safari, a Mail, az SMS s a trcszalkalmazsok megillvshoz hasznlt URLkarakterlnco k? 2. Mi a neve annak az osztlynak, amelyet az Image Picker felhasznli felletnek megillvsra hasznlunk az iPhone-oknl? 3. Mi a neve annak az osztlynak, amelyet a People Picker felhasznli felletnek m egillvsra hasznlunk az iPhone-oknl?

A FEJEZET TUDNIVALI
Tma
E-mail kldse az alkalmazson
bellrl

Alapelvek
NSString *emailstring @ "mailto : ?to=USER@ EMAIL . COM&subj ect=SUBJECT&body= BODY OF EMAIL " ; [[UIApplication sharedApplication] openURL: [NSURL URLWithString:emailString]]; [ [UIApplication sharedApplication] openURL:[NSURL URLWithString: @ "http:// www.apple.com"]]; [[UIApplication sharedApplication] openURL:[NSURL URLWithstring:@"tel:1234567890"]]; [[UIApplication sharedApplication] openURL : [NSURL URLWi thStri ng : @"sms: 96924065"]]; Hasznlj uk a UIImagePi eke rcontro ll e r osztlyt, s gyzdj nk meg rla, hogy a View Controller megvalstja a UINavi gat i onContra ll erDe l e gate protokollt. Hasznljuk a ABPeopl e Pi ckerNavi gat i oneontroll er osztlyt, a AddressBookUI keretren dszerbL

A Safari meghvsa

A Phone alkalmazs meghvsa

Az SMS alkalmazs meghvsa

A Photo Library alkalmazs

elrse
A Contacts alkalmazs elrse

389

Hozzfrs a hardverhez
A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan rjk el az !Phone vagy az iPod Touch Hogyan
rzkelhe~k

gyorsulsmr

adatait?

az eszkz rzst?

Hogyan rhetnk el az !Phone s az iPod Touch Core Loeaciorr szolgltatsval fldrajzi adatokat? Hogyan jelertsnk meg trkpet az alkalmazsunkban?

Az

elz fejezetben lthattuk, hogyan frnk hozz az !Phone s az iPod Touch beptett alkalmazsaihoz klnbz eszkzk, URL-szttingek, valamint az !Phone SDK ltal knlt specializlt osztlyok segitsgvel. Ebben a fejezetben megismerhe~k, hogyan frhetnk hozz az eszkznk hardverhez, pldul a gyorsulsmrhz, s hogyan szerezhetnk helyzeti informcit GPS, mobiltorony s vezetk nlkli hotspot segitsgvel.

A gyorsulsmr hasznlata
Az iPhone s az iPod Touch egyik leginnovavabb funkcija a beptett gyorsulsmr, amely lehetv teszi, hogy az eszkz megllaptsa a tjolst, s tartalmt az j tjolshoz igaztsa. Ha pldul oldalra fordtjuk az eszkzt, a Safari webbngsz automatikusan fekv mdba kapcsol, gy nagyobb nzetet biztost. Ehhez hasonlan a fnykpezgp a gyorsulsmrvel ll~a be, hogy a kp ll vagy fekv mdban kszljn.

17. fejezet: Hozzfrs a hardverhez

Az iPhone s az iPod Touch gyorsulsmrje az eszkz szabadesshez kpesti gyorsulst mri. Az 1 rtk jelenti, hogy az eszkzre 1 g er hat (1 g a Fld gravitcis vonzsa, amely az eszkzt nyugv llapotban ri). A gyorsulsmr az eszkz gyorsulst hrom klnbz tengelyen mri: X, Y s Z. A 17.1 bra a gyorsulsmr ltal mrt klnbz tengelyeket mutatja.
+Y

-X

+X

+Z

-Z

-Y
17.1 bra

A 17.1 tblzat a hrom tengely

klnbz

rtkeit muta~a az eszkz

klnbz

pozciiban.

17.1 tblzat. Az X, Y s Z tengelJek kiilnboz rtkei

Pozci
Fggleges

x
ll helyzet

y
-1,0 0,0 0,0

z
0,0 0,0 0,0 0,0

0,0 1,0 -1,0 0,0

Bal oldali tjkp Jobb oldali tjkp Fejjellefel


Kijelzvel Kijelzvel

felfel lefel

fekv fekv

helyzetben

0,0 0,0

0,0 0,0

-1,0 1,0

helyzetben

Ha az eszkzt fgglegesen tartjuk, s gyorsan jobbra mozgatjuk, az X tengely rtke nullrl poziv rtkre vltozik. Ha gyorsan balra mozgatjuk, akkor az X tengely rtke nullrl negav rtkre vltozik. Ha az eszkzt gyorsan felfel mozgatjuk, az Y tengely rtke -1 ,O helyett nagyobb rtket vesz fel. Ha az eszkzt gyorsan lefel mozgatjuk, az Y tengely rtke -1 ,O-rl kisebb rtkre cskken.

392

A gyorsulsmr hasznlata

Ha az eszkz kijelzvel felfel fekszik az asztalon, s felemeljk, a Z tengely rtke -1,0-rl kisebb szmra cskken. Ha felfel mozgatjuk, a Z tengely rtke -1,0-rl nagyobb rtkre vltozik.

Ir Megjegyzs Az i Phone s az i Pod Touch


tket tud mrni, 0,018 g felbontssal.

gyorsulsmrje

+/-

2,3 g kztti r-

mr

gyakorlati rsz megmutatja, hogyan rhet el programozottan a gyorsulsltal adott adat. A gyo rsulsmr adataihoz hozzfrve rdekes alkalmazsok hozhatk ltre - ilyen pldul a vzszintez vagy egy mozgsrzkels jtk.
A gyorsulsmr adatainak az elrse

kvetkez

A programkd [Accelerometer.'(jp} a Wrox.com

oldalrltlthet le.

1. Hozzunk ltre egy j View-based

Application projektet az Xcode segtsgve!, s nevezzk el Ac ce l e remete r-nek. 2. Kattintsunk ktszer az Ac cel eromete rvi ew control l er . xib fjlra, hogy az Interface Builderrel szerkesszk. 3. Tltsk fel az elemablakot hat Label (cmke) elemmel (lsd a 17.2. brt) .

X-axis Y -axis Z-axis

Label Label Label

4. Adjuk hozz az Accel e rom etervi ewcont rol ler. h fjlhoz a kvetkez flkvrerr szedett utastsokat: #import <UlKit/UlKit. h> @inte rfa ce Accele romete rviewcont roller U lViewcontroller <UlAccelerometerDelegate> { lBOutlet UlLabel *labelx ; lBOutlet UlLabel *labelv; lBOutlet UlLabel *labelz;

17.2. bra

393

17. fejezet: Hozzfrs a hardverhez

@property (nonatomic, retain) Ullabel *labelx; @property (nonatomic , retain) Ullabel *labelv; @property (nonatomic, retain) Ullabel *labelz; @e nd 5. Visszatrve az Interface Builderbe, a Control billenty nyomva tartsval kattintsunk, s hzzuk a File's Owner elemet a hrom Label elem mindegyikhez, majd sorban vlasszuk a l abe l x, a label v s a label z elemeket.

6. Adjuk hozz az Accele romet erviewcontrol ler.m fj lhoz a


szedett utastsokat: po cont rol l er .h" #i m rt "Accelerometerview @i mpl ementati on Accelerom etervi ewcont rolle r @synthesize labelx, labelY, labelz;

kvetkez

flkvren

- (void)viewoidload { UlAccelerometer *ace= [UlAccelerometer sharedAccelerometer]; acc.delegate = self; acc.updatelnterval = l.Of/ 60.0f; [super viewoidload];
}

- (void)accelerometer:(UIAccelerometer *) ace didAccelerate:(UlAccelerati on *)acceleration { NSString *str = [[NSString alloc] initWithFormat:@"%g", acceleration . x] ; labelx.text = str; str = [[NSString alloc] ini twithFormat:@"%g", acceleration .y]; labelY.text = str; str = [[NSString alloc] initwithFormat:@"%g", acceleration.z] ; labelz.text = str; [str release];
}

- (void) deal l oc { [labelx release]; [labelY release]; [labelz release]; [super dea ll oc] ;

7.

yomjuk meg a Command-R gombokat, hogy az alkalmazst iPhone eszkzn teszteljle A 17.3. bra az alkalrnazson megjelemtett adatot m utatja arra az esetre, arnikor az iPhone egy iPhone-tartn pihen.

394

A gyorsulsmr hasznlata

Megjegyzs A gyorsulsmr adataihoz egy vals eszkzre van szksg, pldul egy i Phone-ra vagy egy i Pod Touchra.

l
ll

Hogyan

mkdik?

~SGP- ..

5:31PM

o ~

Az iPhone vagy az iPod Touch

gyorsulsmrj

X-axis Y-axis z-axis

-0.0545058 -0.999273 -0.25436

nek hasznlathoz implementljuk a UIAcce l erometeroelegate protokollt a delegltunkban (ahogy az elemvezrlnkben): @interface Accelerometerviewcontroller urviewcontroller <UIAccelerometerDelegate> { Ahogy a nzet betltdik, elszr a urAeeel erameter osztly egy egyszer pldnyt kapjuk a sharedAccelerometer metdussal. Ezutn megadjuk a pldny delegltjt, valarnint azt az intervallumot, amelyben a gyorsulsmr adatait megkapjuk - (void)viewoidLoad { UIAccelerometer *ace [UIAccelerometer sharedAccelerometer]; acc.delegate = self; acc.updateinterval = l.Of/60.0f; [super viewDidLoad];
}

17.3. bra

Az updateinterval tulajdonsg az intervallumot msodpercben hatrozza meg, a frisstsek kztt eltelt msodpercek szmval. Az elz esetben azt jeleztk, hogy a gyorsulsmr

msodpercenknt 60-szor frisstsen.

A UIAccelerometeroelegate protokoll adja meg azt az egyszer metdust, amelyet implementlnunk kell, hogy a gyorsulsmr adatait visszakapjuk: acce l erometer: di dAccel e rate:. Esetnkben a hrom tengely rtkeit nyerjk ki, s jelentjk meg a hrom Label elemen: - (void)accelerometer:(UIAccelerometer *) ace didAccelerate:(UIAcceleration *)acceleration { NSStri ng *st: r = [[NSSt:ri ng a ll oc] i ni twi th Forrnat: @"%g", ace e l eration. x] ; labelx.text = str; str = [[NSString alloc] initWithFormat:@"%g", acceleration.y]; labelY.text = str; str = [[NSString al loe] initWithFormat:@"%g", acceleration.z]; labelz.text = str; [str release];
}

395

17. fejezet: Hozzfrs a hardverhez

A rzs szlelse az i Phone 052 s a korbbi verzikban


Az iPhone OS 3.0 esetben rendelkezsnkre ll a Shake API (lsd albb), azaz az eszkz rzst szlel metduskszlet. De hogyan szleljk a rzst az iPhone OS 2.0 s a korbbi verzikban? A vlasz egyszer. Az accelerometer:didAccelerate: esemnyben megadhatjuk az ehhez szksges kdot, az albbiak szerint:
#import "Accelerometerviewcontroller.h" #define kAccelerationThreshold 2.2 // . .. // ... - (void)accelerometer:(UIAccelerometer *) ace didAccelerate:(UIAcceleration *) acceleration { if (fabsf(acceleration.x) > kAccelerationThreshold)
{

NSLog(@"Shake detected");
}

A fabsf() fggvny egy lebegpontos szm abszolt rtkt adja. Ha az X tengely rtke abszolt rtkben nagyobb, rnint 2,2, akkor ez azt jelenti, hogy a felhasznl rzza az eszkzt.

A Shake API hasznlata a rzs szlelshez az OS 3. O alatt


Az iPhone OS 3.0-s verzival az Apple bejelentette, hogy elrhet az j Shake API, amely szleli az eszkz rzst. Az j Shake API valjban hrom esemny formjban jelenik meg, amelyeket a kdban kezelhetnk
moti onBegan : moti onEnded: motioncancelled:

396

A Shake API hasznlata a rzs szlelshez az OS 3.0 alatt

Ez a hrom esemny a UIResponder osztlyban hatrozdik meg, ez pedig a UIApplicati on, a urvi ew s alosztlyainak (belertve a urwi ndow-t) fosztlya. A kvetkez gyakorlati rsz bemuta~a, hogyan szleljk az eszkz rzst a hrom esemnnyel.
A Shake API hasznlata

A programkd [Shake.zfp] a IIYrr.>x.com oldalrl tolthel le.

---

1.

Hozzunk ltre egy j nzetalap Application projektet az Xcode segtsgvel, s nevezzk el shake-nek.

2. Kattintsunk ktszer a shakevi ewcontro ll er. xi b fjlra, hogy az Interface Builderrel szerkesszk. 3. Tltsk fel az nzetablakot a kvetkez elemekkel Osd a 17.4. brt): TextField, DatePicker.

Sun Oct 26 l 8 l 59
VC l LJ

IJU

1A

Tue Oct 28 l 10 l 01 l PM

4. Szrjuk be a

kvetkez flkvrerr szedett utastsokat a shakevi ewcontro ll e r. h fjlba:

#import <UIKit/UIKit .h> @interface Shakeviewcontroller urviewcontroller { IBOutlet UITextField *textField; IBOutlet uroatePicker *datePicker;
17.4. bra

@property (nonatomic, retain) UITextField *textField; @property (nonatomic, retain) UIDatePicker *datePicker; -(IBAction) doneEditing: (id) sender; @end 5. Az Interface Builderben Control-kattintssal hzzuk r a File's Owner elemet a TextField elemre, majd vlasszuk a text Fi e l d-et. 6. Control-kattintssal hzzuk r a File's Owner elemet a DatePicker elemre, majd vlasszuk a datePi eke r-t.

397

17. fejezet: Hozzfrs a hardverhez

7. Kattintsunk jobb egrgombbal a TextField elemre, s a Did End on Exit esemnyt kapcsoljuk a File's Owner elemhez (lsd a 17.5. brt). Vlasszuk ki a doneEditing: elemet.

17.5. bra

8. Szrjuk be a fjlba:

kvetkez

flkvren szedett utastsokat a shakevi ewcontroller .m

#import "shakeviewcontroller.h" @implementation shakeviewcontroller @synthesize textField, datePicker; - (void) viewoidAppear:(BOOL)animated


{

[self.view becomeFirstResponder]; [super viewoidAppear:animated];


}

- (IBAction) doneEditing: (id) sender { 11---when keyboard is hidden, make the view the first responder ll or else the shake API will not work--[self.view becomeFirstResponder];
}

398

A Shake API hasznlata a rzs szlelshez az OS 3.0 alatt - (void)motionBegan:(UIEventsubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake ) { NSLog(@"motionBegan : ");
} }

- (void)motioncancelled:(UIEventsubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake ) { NSLog(@"motioncancelled: ");


}
}

- (void)motionEnded:(UIEventSubtype)motion withEvent : (UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake ) { NSLog(@"motionEnded:");


} }

- (void) dealloc { [textField release]; [datePicker release]; [super dealloc];


}

9. Kattintsunk jobb gombbal az Xcode Classes csoportjra, s vlasszuk az Add );> New File (hozzads );> j fjl) lehetsget. Vlasszuk ki a UIView alosztlysablont (lsd 17.6. brt).

Choose a te.mplate: for your ne.w file:


,---nolrt'l.aDeVe:wCe~.:iti:Ve'l'iCnl ~

subcb.ss

roller subdass

'--

.m

.m
urYiewC.ontroller subcb.ss

.m
Unit THt .SI!
d.i!SS

AppleScript C M\<1 C++

Dtscripdon An Objecttw-c dus which


wnh iln
o p uon<~ l

C.rbon
Coco.1

i$ .a subdus of UMrw, header file which lndudH l he <UIKit/

UIKJLh> header.

Interface: BuildH SOK


Purejan

Pure Python
Ruby

Sync SeMces

~eVIOIJSJ ~

17.6. bra

399

17. fejezet: Hozzfrs a hardverhez

10. Kattintsunk a Next

lehetsgre,

a fjl neve legyen shakevi ew. m.

11. Szrjuk be a kvetkez flkvren szedett utastsokat a shakevi ew. m fjlba:


#import .. Shakeview.h .. @implementation shakeview - (id)initWithF rame: (CGRect)frame { if (self ~ [super initWithFrame:frame]) ll Initialization code return self;
}

- (void)drawRect:(CGRect)rect ll Drawing code

- (void)dealloc { [super dealloc];

- (BOOL)canBecomeFirstResponder { return YES;


}

@end

12. Az Interface Builderben vlasszuk a nzetablakot, s nzzk meg az Identity Inspector ablakt. Az osztly neve legyen shakevi ew Osd a 17.7. brt). 13. Mentsk el a fjlt az Interface Builderben.

14. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljk. Nyissuk meg a Debugger Console ablakot az Xcode CommandShift-R gombjainak megnyomsvaL
15. Az iPhone Simulator alkalmazsval vlasszuk a Hardware );> Shake Gesture

(hardver );> rzsgesztus) lehetsget, hogy az eszkz rzst szimulljuk. Figyeljk meg a Debugger Console ablakban kirt informcit Osd a 17.8. brt).
16. rintsk meg a TextField elemet, ekkor megjelenik a billentyzet. Vlasszuk ismt a Hardware );> Shake Gesture lehetsget, hogy az eszkz rzst szimulljuk. Figyeljk meg a Debugger Console ablakban kirt rtkeket.
17. Zrjuk be a

a return billenty megrintsveL Szimulljuk ismt a rzs t, majd figyeljk meg az eredmnyt a D ebugger Console ablakban.

billentyzetet

400

A Shake API hasznlata a rzs szlelshez az OS 3.0 alatt

.... J Type:

luikk,ldenti

17.7. bra

_ Shake ... O@buggt'r Console

pD

''E.

(sealon nu-t.ed u lOOt-01-11 llt57:5l +0100.) 200t-Ol-ll 21 158:l6.t55 BUe(22ll9 1207) a&D41.1JUJ . .uoa be9U t.O ~kaVl-1 Oztl04d0> 200t-Ot- ll 21:51 s l6.t56 $11.alr.e(ZllU r Z07J -tloaa.gu : 2009-01-11 Zl l SI I l6 . t57 5ll.a.lte(Zl2Jt r 20l) aaD4.1q -tlo-. -.uSed t.0 <SUkaVi-; 0:z!J04d0> 200t-Ol-ll ll 15l ! l6 . t51 SlLalta(ZUlt : ZOl) -t.lOilDded :

~====~ -17.8. bra

401

17. fejezet: Hozzfrs a hardverhez

Hogyan

mkdik?

Tisztban kell lennnk azzal, hogy a hrom, a rzs szlelshez hasznlhat esemny kivlasztsa csak akkor trtnik meg, ha ltezik zet megjelensekor ler.m fjlban): - (void) viewoidAppear:(BOOL)animated [self.view becomeFirstResponder]; [super viewoidAppear:animated];
elszr els

reagl a nzetnkben. Ezrt a nels

be kell ezt llitanunk mint

reagl (a shakevi ewcontrol -

Alaprtelmezettknt azonban a nzet nem lehet az Responder metdust, hogy YES rtkkel trjen vissza: - (BOOL)canBecomeFirstResponder { return YES;

els

reagl, ezrt ltre kell hoznunk

egy urvi ew alosztlyt (shakevi ew. m), gy fellrhatjuk az alaprtelmezett canBecomeFi rst-

Ekkor a nzet
teendnk

els

reaglknt

mkdik.

Alaprtelmezs szerint az Interface Builder

sszekapcsolja a nzetet a urvi ew alaposztllyai (amellyel az esetek tbbsgben semmi nincs). Utastanunk kell az Interface Buildert, hogy az jonnan ltrehozott shakevi ew alosztlyt hasznlja. Ezutn a hrom esemnyt a Shakeviewcontroller.m fjlban kezeljk: - (void)motionBegan:(UIEventsubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake )
{

NSLog(@"motionsegan:");
}

- (void)motioncancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventSubtypeMotionshake )


{

NSLog(@"motioncancelled:");
}

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventsubtypeMotionshake ) NSLog(@"motionEnded:");


}

402

Mvelet vgrehajtsa az eszkz rzsa kzben Minden egyes esemnynl elszr megvizsgljuk, hogy a mozgs valban rzs-e; majd a Debugger Console-ban megadunk egy hibakeres kir utastst. A doneEdi ti ng: metdusban (amelynek kivltshoz a felhasznl a return billenty rintsvel eltnteti a billentyzetet) a nzetet els reaglv tesszk: -(IBAction) doneEditing: (id) sender { 11-- -when keyboard is hidden, make the view the first responder ll or else the shake API will not work--[self.view becomeFirstResponder];
}

Ha ezt nem tesszk meg, akkor a hrom mozgsrzkel esemny nem vltdik ki, hiszen szksg van valamire, ami betlti az els reagl szerept. A moti onBegan: esemny akkor hivdik meg, ha az opercis rendszer szleli, hogy az eszkzt rzni kezdtk. Ha vgl az OS gy rzkeli, hogy a mvelet nem rzs, akkor a moti oncance ll ed: esemny vltdik ki. Ha az OS gy rzkeli, hogy a mvelet rzs, akkor a moti onEnded: esemny vltdik ki.

Mvelet

vgrehajtsa az eszkz rzsa kzben

A mr ismert projekt mdostsval azt szeretnnk elrni, hogy az eszkz rzsakor a DatePicker elem a mai dtum rtkt kapja.
A DatePicker alaprtelmezett rtknek bellitsa rzskor

1. Adjuk hozz a shakeviewcontroller.m fjlhoz a utastsokat: - (void)ResetoatePicker { [datePicker setoate : [NSDate date]] ;
}

kvetkez

flkvren szedett

- (void)motionEnded : (UIEventsubtype)motion withEvent:(UIEvent *) event { if (event .subtype == UIEventsubtypeMotionshake ) { NSLog(@"'motionEnded:"'); [self ResetoatePicker];
}

403

17. fejezet: Hozzfrs a hardverhez

2. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljle A DatePicker elemet llitsuk valamilyen dtumra. Vlasszuk a Hardware );> Shake Gesture lehetsget, hogy az eszkz rzst szimulljuk. A DatePicker elemnl ekkor visszall az aktulis dtum (lsd a 17.9. brt).

Hogyan

mkdik?

A pldnkban elszr egy ResetDatePi cker metdust adtunk a kdhoz, amely bellitotta a DatePicker rtkt az aktulis dtumra: - (void)ResetDatePicker { [datePicker setDate:[NSDate date]];
}

Az eszkz rzsakor meghivjuk a ResetDatePi eke r metdust, amely a DatePicker elem rtkt az aktulis dtumra lli*:

17.9. bra

- (void)motionEnded:(UIEventsubtype)motion withEvent : (UIEvent *)eve nt { if (event.subtype == UIEventsubtypeMotionshake )


{

NSLog(@"motionEnded:"); [self ResetDatePicker];


}

Helyalap szolgltatsok
Manapsg a mobileszkzket gyakran elltjk GPS-vevveL A GPS-vev segtsgvel knnyen hozzfrhetnk helyzetnk adataihoz a Fld krl kering szmos mholdnak ksznheten. A GPS mkdshez azonban tiszta gboltra van szksg, gy nem mkdik fedett helyisgben. Az els genercis iPhone mg nem tartalmazott GPS-vevt. A GPS mellett pozcink bemrsnek egy msik hatkony mdja a mobiltomyok hromszgelse. Egy bekapcsolt mobiltelefon lland kapcsolatban van a krnyez bzisllomsokkal. Ha ismerjk a mobiltomyok azonostjt, lehetsgnk van meghatrozill a fizikai helyzetnket a mobiltomyok azonostjt s pontos fldrajzi helyzett tartalmaz klnbz adatbzisok segtsgveL A mobiltornyok hromszgelsnek elnye a GPS-

404

Helyalap szolgltatsok
vevvel

szemben az, hogy fedett helyisgben is mkdik mholdak nlkl. Pontossgban azonban alulmarad a GPS-vevvel szemben, ez attl fggen vltozik, hogy rnilyen terleten vagyunk. A mobiltornyok hromszgelse srn lakott terleteken mkdik legjobban, ahol a mobiltornyok egymshoz kzel helyezkednek el. A mobiltornyok hromszgelse azonban nem alkalmazhat iPod Touch eszkzzel, ugyanis ebben nem tallhat mobiltelefon-egysg. A harmadik mdszer a pozci meghatVIeW rozsra a wifi hromszgels. Mobiltornyok helyett az eszkz wifi hlzathoz csatlakozik, Latituda s adatbzisok helyett a szolgltatt ellenrzi, Longituda meghatrozva azt, hogy mely helyen nyjtja Accuracy az adott szolgltatst. A hrom bemutatott mdszer kzl a wifi hromszgels a legkevsb pontos. Az Apple ltrehozta az iPhone telefonhoz a Core Location keretrendszert, amely segt a fizikai helyzet meghatrozsban. A keretrendszer mindhrom emltett megkzeltst hasznlja, s a fejleszt szmra teljesen transzparens, hogy ppen melyiket. Egyszeren megadjuk, hogy milyen ponrossgra lesz szksgnk, s a Core Location kivlasz~a az ehhez szksges legjobb mdszert. A kvetkez gyakorlati rsz megmutatja, 17.10. bra hogyan valstsuk ezt meg a kdunkban.
Helyzeti koordintk lekrse
A programkd [GPS.ifpj a Wrox.com
oldalrrltiilthet le.

1. Hozzunk ltre egy j View-based Application projektet az Xcode segtsgve!, s

nevezzk el GPS-nek. 2. Kattintsunk ktszer a GPSViewcontroller.xib fjlra, hogy az Interface Builderrel szerkesszk. 3. Tltsk fel a nzetablakot a Label TextField
kvetkez

elemekkel Qsd a 17.10. brt):

405

17. fejezet: Hozzfrs a hardverhez

4. Kattintsunk jobb gombbal az Xcode Frameworks csoportpra, s vlasszuk az Add >- Ex.isting Frameworks (hozzads >- Ex.isting Frameworks) lehetsget. Vlasszuk ki a Framework/ CoreLocati on. framework elemet.
5. Szrjuk be a fjlba:
kvetkez

flkvrerr szedett utastsokat a GPSViewcontroller.h

#import <UIKit/UIKit . h> #import <CoreLocation/CoreLocation.h> @interface GPSViewcontroller : UIViewcontroller <CLLocationManageroelegate> { IBOutlet UITextField *latitudeTextField; IBOutlet UITextField *longitudeTextField; IBOutlet UITextField *accuracyrextField; CLLocationManager *lm;

@property (retain, nonatomic) UITextField *latitudeTextField; @property (retain, nonatomic) UITextField *longitudeTextField; @property (retain, nonatomic) UITextField *accuracyTextField; @ end

6. Visszatrve az Interface Builderbe, Control-kattintssal hzzuk a File's Owner


elemet a hrom TextField elem mindegyikhez, majd vlasszuk az accuracyTextFi e l d, a l a ti tudeTextFi e l d s a longi tudeText Fi e l d elemeket egyenknt.

7. Szrjuk be a

kvetkez

flkvrerr szedett utastst a GPSViewcont ro ll e r. mfjlba:

#import "GPSViewcontroller.h" @i mplementation GPSViewcontroller @synthesize latitudeTextField, longitudeTextField, accuracyTextField; - (void) vieWDidLoad { lm= [[CLLocationManager alloc] init]; if ([lm locationservicesEnabled]) { lm.delegate = self; lm.desiredAccuracy = kCLLocationAccuracysest; lm.distanceFilter = lOOO.Of; [lm startupdatingLocation];
} }

- (void) locationManager: (CLLocationManager * ) manager didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation{

406

Helyalap szolgltatsok

NSString *lat= [[NSString alloc] initWithFormat:@"%g", newLocation.coordinate.latitude]; latitudeTextField.text = lat; NSString *lng = [[NSString al loe] initWithFormat:@"%g", newLocation.coordinate.longitude]; longitudeTextField.text = lng; NSString *ace= [[NSString alloc] initwithFormat:@"%g", newLocation.horizontalAccuracy]; accuracyTextField.text = ace; [ace release]; [l at re l eas e]; [l ng re l eas e] ;
}

- (void) locationManager: (CLLocationManager *) manager didFailWithError: (NSError *) error { NSString *msg = [[NSString alloc] initwithstring:@"Error obtaining location "]; urAlertView *alert = [[UIAlertview alloc] initWithTitle:@"Error" message:msg delegate:nil cancelButtonTitle: @"Done" otherButtonTitles:nil]; [alert show]; [msg re l eas e] ; [alert release];
}

- (void) dealloc{ [lm release]; [latitudeTextField release]; [longitudeTextField release]; [accuracyTextField release]; [super dealloc];

8. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatorban teszteljk. A 17.11 bra a szimultort muta~a a kapott helyzet fldrajzi szlessgnek s hosszsgnak megjelentsekor. Egyttal az eredmny pontossga is lthat.

Megjegyzs Alkalmazsunkat tesztelhetjk az iPhone Simulatorban. m a szimultor rszre az eszkz mindig rgztett pozcit kld. Nem nehz megtippelni, hogy melyik pozcirl van sz.

J
407

17. fejezet: Hozzfrs a hardverhez

Hogyan mkdik?
A CLLocati onManage r osztly hasznlathoz el szr implementljuk a CLLocati onManageroe l e gate protokollt a View Controller osztlyba:
@interface GPSViewController : urviewcontroller <CLLocationManageroelegate> { Ahogy a nzet
betltdik, elszr

a CLLocati onMa-

nager osztly egy pldnyt hozzuk ltre. - (void) viewDidLoad { lm = [[CLLocationManager al loe] init]; if ([lm locationServicesEnabled]) { lm.delegate = self; lm.desiredAccuracy = kCLLocationAccuracysest; lm.distanceFilter = lOOO.Of; [lm startUpdatingLocation];
}

17.11. bra
Mieltt

az objektumot felhasznlnnk,

ellenrizzk,

hogy a felhasznl engedlyezte-e


hasznlha~uk

kszlkn a Location Services opcit. Ha igen, akkor megadjuk a kvnt pontossgat a des i redAccuracy tulajdonsggaL A adshoz: kCLLocationAccuracyBest kCLLocationAccuracyNearestTenMeters kCLLocationAccuracyHundredMeters kCLLocationAccuracyKilometer kCLLocationAccuracyThreeKilometers
kvetkez

llandkat

a pontossg meg-

Br megadhatjuk az ltalunk kvnt legnagyobb pontossgot, ez azonban nem garantlt. Emellett a nagyobb pontossggal krt helyzetmeghatrozs eszkz akkumultort is igencsak ignybe veszi.
jelents idbe

telik, s az

A di stanceFi l ter tulajdonsggal megadhatjuk azt a tvolsgot, amelyet az eszkznek meg kell tennie a frisstshez. Ennek mter a mrtkegysge, s az utols pozcihoz viszony~uk. Ha minden elmozdulsrl rtestst szeretnnk kapni, akkor hasznljuk a kCLDi stanceFi l terNone llandt. Vgl pedig elindtjuk a Loeari on Managert a startupda ti ngLocati on metdussal.

408

Helyalap szolgltatsok A helyzeti informci megszerzshez kt esemnyt kell kezelnnk: locationManager:didupdateToLocation:fromLocation: locationManager:didFailWithError:
elrhetv

Amikor

vlik egy j helyzeti rtk, a l o ca ti onManager: di dupdateToLocati on:

fromLocati on: esemny vltdik ki. A Location Manager nem tudja meghatrozni a helyzeti rtket, ezrt megl:vja a locati onManager: di d Fai lwithError: esemnyt. A helyzeti rtk megszerzse utn a CLLocati on objektummal tudjuk megj eleniteni annak szlessgi s hosszsgi rtkr, valamint pontossgt: - (void) locationManager: (CLLocationManager *) manager didupdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation{ NSString *lat= [[NSString alloc] initWithFormat:@"%g", newLocation.coordinate.latitude]; latitudeTextField.text =lat; NSString *lng = [[NSString alloc] initWithFormat:@"%g", newLocation.coordinate.longitude]; longitudeTextField.text = lng; NSString *ace = [[NSString alloc] initWithFormat:@"%g", newLocation.horizontalAccuracy]; accuracyTextField.text = ace; [ace release]; [l at re l eas e] ; [l ng re l eas e] ;

A CLLocation objektum horizontalAccuracy tulajdonsga adja meg a ponrossgi sugarat mterben.

Trkpek megjelenitse
Adott pozci helyzeti rtknek lekrst clszeru a trkpes megjelenitssei kiegszte-

ni. Az idelis az lenne, ha felhasznlnnk a helyzeti rtket, s megjelentennk egy trkpen. Szerencsre az iPhone SDK 3.0 esetn elrhet a Map Kit API, amely megjelenti a Google-trkpet az alkalmazsunkban . A kvetkez gyakorlati rsz bemutatja, hogyan valstsuk ezt meg a kdban.

409

17. fejezet : Hozzfrs a hardverhez

Helyzeti informci megjelenitse Map Kit hasznlatval 1. Az

rszben ltrehozott projekt segtsgvel a GPSVi ew control ler .xi b fjlban ad junk hozz az nzetablak-

elz

hoz egy Button elemet (lsd a 17. 12. brt).

2. Kattintsunk jobb gombbal az Xcode Frameworks csoportjra, s adjuk hozz a mr ltez MapK framewor k keit. retrendszert.

View Map

3. Szrjuk be a

kvetkez flkvren contro l szedett utastsokat a GPSVi ew l er . h fj lba:

it.h> #impo rt <UIKi t / UI K #i m port <CoreLocati on/ CoreLocation . h> #i mport <Map Ki t /MapKi t . h> @interface GPSViewcontroller 17.12. bra urviewcontroller <CLLocationManagerDelegate> { IBOutlet UITextField *accuracyTextField; IBOutlet UITextField *latitudeTextField; IBOutlet UITextField *longitudeTextField; CLLocationManager *lm; MKMapView *mapview;

@ property ( retain , nonatomic) UITe xtFi eld *accuracyTextField; @ property ( retain , nonatomic) UITextField *latitudeTextField; @ property ( retain, nonatomic) UITextField *longitudeTextField ; -(IBAction) btnvieWMap : (id) sender; @e nd

4. Visszatrve az Interface Builderbe, Control-kattintssal hzzuk a Button elemet a File's Owner elemre, s vlasszu k a btnvi eWMap : -et.

5. Adjuk hozz a GPSVi ewcont ro ll e r. m fjlhoz a


tsokat: -(IBAction) btnviewMap : (i d) sender { [self.view addSubview : mapView] ;

kvetkez

flkvren szedett utas-

410

Helyalap szolgltatsok

- (void) viewDidLoad { lm= [[CLLocationManager alloc] init]; lm.delegate = self; lm.desiredAccuracy = kCLLocationAccuracyBest; lm . distanceFilter = lOOO . Of; [lm startUpdatingLocation]; mapview = [[MKMapview alloc] initwithFrame:self.view.bounds]; mapview.mapType = MKMapTypeHybrid;
}

- (void) locationManager: (CLLocationManager *) manager didupdateToLocation: (CLLocation * ) newLocation fromLocation: (CLLocation *) oldLocation{ NSString *lat = [[NSString a ll oc] initwithFormat:@"% g", newLocation.coordinate.latitude]; latitudeTextField.text =lat; NSString *lng = [[NSString alloc] initWithFormat:@"% g", newLocation.coordinate.longitude]; longitudeTextField.text = lng; NSString *ace = [[NSString a ll oc] initWithFormat:@"% g", newLocation.horizontalAccuracy]; accuracyTextField . text = ace; [ace release]; [l at re l eas e] ; [l ng re l eas e] ; MKCoordinatespan span; span.latitudeDelta=.OOS; span.longitudeoelta=.OOS; MKCoordinateRegion region; region.center = newLocation.coordinate; region.span=span; [mapview setRegion:region animated:TRUE];
}

- (void) dealloc{ [mapview release]; [lm release]; [latitudeTextField release]; [longitudeTextField release]; [accuracyTextField release]; [super dealloc];
}

411

17. fejezet: Hozzfrs a hardverhez 6. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljk A View Map gomb rintsekor egy trkpet kapunk, amely a Location Manager ltal megadort helyzetet mutatja (lsd a 17.13. brt).

Megjegyzs Ha alkalmazsunkat valdi eszkzn teszteljk, akkor lthatjuk, hogy helyzetvltoztatsunknak megfelelen a trkp dinamikusan frissl. Bizonyosodjunk meg arrl, hogy a distanceFilter tulajdonsg rtkt egy kisebb szmra vltoztattuk, gy ugyanis a tvolsgban bekvetkez kisebb vltozsokat is nyomon tudjuk kvetni.

Hogyan mkdik?
Ahhoz, hogy a Map Kit hasznlhat legyen az alkalmazsunkban,
elszr

a Map Ki t. framework keltrehozzuk a

retrendszert kell hozzadnunk a projektnkhz. Ahogy a nzet


megjelentend mhold): betltdrt,

MKMapvi ew osztly egy pldnyt, s bellitjuk a trkp tpust (hibrid - trkp s

- (void) viewDidLoad { lm= [[CLLocationManager alloc] init]; lm.delegate = self; lm.desiredAccuracy = kCLLocationAccuracyBest; lm . distanceFilter = lOOO . Of; [lm startUpdatingLocation]; mapview = [[MKMapView alloc] initWithFrame:self.view.bounds]; mapview.mapType = MKMapTypeHybrid;
}

A View Map gomb megrintsvel hozzadjuk a mapview objektumot az aktulis nzethez: -(IBAction) btnViewMap: (id) sender { [self.view addsubview:mapview];
}

17.13. bra

Amikor a helyzeti informci frissl, rnagytunk az adott h elyzetpontra a mapview objektum setReg i on: metdusval:

412

Helyalap szolgltatsok - (void) locationManager: (CLLocationManager *) manager didupdateToLocation: (CLLocation *) newLocation fromlocation: (CLLocation *) oldLocation{ // .. . // .. . MKCoordinatespan span; span.latitudeoelta;.QQS; span.longitudeoelta;.QQS; MKCoordinateRegion region; region.center ; newLocation.coordinate; region.span;span; [mapview setRegion:region animated:TRUE];

Megjegyzs Tovbbi informcit a MKMapvi ew osztllyai kapcsolatban az Apple dokumentcijban tallhatunk: ht tp: l /devel ope r. apple. com/i phone/l i brary/navigation/Frameworks/CocoaTouch/MapKit/index.html .

SSZEFOGLALS
Ez a fejezet bemutatta, hogyan manipullhatk eszkznk klnbz tpus hardverei: a a Shake API s a Core Loeaciont hasznl helyalap szolgltatsok. Ezek kombincijval nagyszer alkalmazsokat hozhatunk ltre.

gyorsulsmr,

1. Nevezzk meg azt a protokollt, amelyet a delegltunknak meg kell valstania, hogy lehetvtegye a gyorsulsmr hasznlatt az iPhone s az iPod Touch eszkzn. 2. Nevezzk meg az iPhone SDK 3.0 Shake API hrom esemnyt. 3. A Core Location hrom klnbz mdszert hasznl az eszkz helyzetnek meghatrozsra. Fejtsk ki ezt a hrom, iPhone s iPod Touch esetn hasznlt mdszert.

413

17. fejezet : Hozzfrs a hardverhez

A FEJEZET TUDNIVALI
Tma
A gyorsulsmr adatainak elrse

Alapelvek
Biztosts uk, hogy a nzetvezrl megvalstsa a UI Acce l e rom eterDe l egat e protokollt, s hozzuk ltre a U IAcce l eromete r osztly egy pldnyt. A gyorsulsban bekvetkezett vltozsok fogadshoz implementljuk az ace e l e romete r : d i dAc ce l e rate metdust. Hasznlhatjuk a gyorsulsmr adatait vagy az iPhone OS 3.0 j Shake API fellett. A Shake API esetn a kvetkez esemnyeket kell kezelnnk: moti onBegan: , moti onEnded: s moti onCan ce ll ed: . Adjuk hozz projektnkhz a CoreLocanon keretrendszert. Biztostsuk, hogy a nzetvezrl megvalstsa a CLLocati onMan ag e roe l egat e protokollt, s hozzuk ltre a CLLocation Manage r osztly egy pldnyt. A helyzeti rtkben bekvetkezett vltozsok fogadshoz implementljuk a l ocati onManager: d i dupdateToLocati on : fromLocati on : metdust. Hasznljuk a
kvetkez

A rzs szlelse

Helyzeti informci lekrse

Helyzeti adat pontossgnak megadsa

llandk egyikt:

kCLLocationAccuracyBest kCLLocat i onAccuracyNearestTenMeters kCLLocati onAccuracyHundredMeters kCLLoc at i onAccuracyKilometer kCL Locati onAccuracyThreeKi lometers Adjuk hozz projektnkhz a MapKit keretrendszert. KMapVi ew osztly egy pldnyt, s a klnbz ruHozzuk ltre a M lajdonsgok segtsgvel adjuk meg a helyzeti rtket.

Trkpek megjelentse

414

..... _"

Rsz .
---

_,

__ .:

~~~

Fggelkek
A fggelk: A gyakorlatok megoldsai .................. 417 B fggelk: Az Xcode hasznlata .......................... 435 C fggelk: Az Interface Builder hasznlata ......... 451 D fggelk: Objective-C gyorstalpal .................... 465 E fggelk: T esztels konkrt iPhone-on vagyiPod Touchon ............................ 495

EL
A gyakorlatok megoldsai
Ez a fggelk a fejezetek vgn (az 1. fejezet kivtelvel) tallhat megoldsait tartalmazza.
ismtl

feladatok

A 2. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
A minimlisan szksges kpmret 57 x 57 pixel nagysg. Nem baj, ha nagyobb kpet terveznk, mert az iPhone automatikusan tmretezi. ltalban prbljunk nagyobb kpet tervezni, mert gy az alkalmazsunk megfelel lesz az jabb kszlkek szmra is, amelyekkel az Apple elll.

Vlasz a 2. krdsre
Implementlnunk kell a shoul dAutorotateTointerfaceori entation: eljrst s lekdolni az orientci biztostshoz szksges tovbbi utastsokat. Az sszes orientci biztostshoz csak meg kell adnunk a YES rtket az eljrsban, a kvetkezkppen: - (BOOL)shouldAutorotateTointerfaceorientation:(UIInterfaceorientation) interfaceorientation { ll Return YES for supported orientations return YES;
}

A fggelk: A gyakorlatok megoldsai

A 3. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
A . h fjlban:
11---declare an outlet--IBOutlet UITextField *nameTextFi eld; ll .. . 11---expose the outlet as a property--@property (nonatomic, retain) UITextField *nameTextField;

Az . m fjlban:
@implementation Basicurviewcontroller 11---generate the getters and setters for the property--@synthesize nameTextField;

Vlasz a 2. krdsre
A . h fjlban:
- (IBAction)btnClicked:(id)sender;

Az . m fjlban:
@implementation Basicurviewcontroller ll ... - (IBAction)btnClicked:(id)sender { 11---your code for the action here--}

A 4. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
Hogy egy elemet csatlakoz tassunk a
nzetvezrlhz, nzetvezrl

tegyk a

kvetkezt

a . xi b fjlban:

Hatrozzuk meg az osztlyt a

nevhez a File's Owner elemben.

Kapcsoljuk ssze a File's Owner elemet a nzettel.

418

Az 5. fejezet feladatainak a megoldsa

Vlasz a 2. krdsre
Hasznljunk alert nzetet, arnikor zenetet jelentnk meg a felhasznlnak. Ha a felhasznl tbbfle opci kzl vlaszthat, alkalmazzunk vlaszthat elemeket.

Vlasz a 3. krdsre
- (void)loadview { //- --create a urview object--UIView *view = [[urview alloc] initwithFrame:[UIScreen mainscreen].applicationFrame]; view.backgroundcolor = [UIColor lightGraycolor]; //---create a Button view--frame= CGRectMake(lO, 70, 300, 50); UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; button.frame = frame; [button setTitle:@"click Me, Please!" forstate:urcontrolstateNormal]; button.backgroundcolor = [UIColor clearcolor]; button.tag = 2000; [button addTarget:self action:@selector(buttonclicked:) forcontrolEvents:urcontrolEventTouchuprnside]; [view addsubview:button]; self.view =view;
}

Az 5. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
Elszr

foglalkozzunk a Did End on Ex i t esemnnyel (vagy implementljuk a text-

Fi e l dshoul dRetu rn: eljrst a nzetvezrlben) . Ezutn lvjuk meg a res i gnFi rstResponder objektum UITextField eljrst, hogy felmentsk az els reagl sttusz all.

419

A fggelk: A gyakorlatok megoldsai

Vlasz a 2. krdsre
Regisztrljunk kt rtestsre: UIKeyboardwi ll showNati fi ca ti on s UIKeyboardwi ll Hi deNati fi ca ti on.

Vlasz a 3. krdsre
11---gets the size of the keyboard--NSDictionary *userrnfo; [notification userrnfo]; NSValue *keyboardvalue; [userrnfo objectForKey:UIKeyboardBoundsuserinfoKey]; [keyboardvalue getvalue:&keyboardBounds];

A 6. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
-(BOOL)shouldAutorotateTointerfaceorientation: (UIInterfaceorientation)interfaceorientation { return (interfaceorientation interfaceorientation urrnterfaceorientationLandscapeLeft l l urrnterfaceorientationLandscapeRight);

Vlasz a 2. krdsre
A frame tulajdonsg meghatrozza a tglalapot, amelyet az elem elfoglal, tekintettel annak tartalmaz nzetre (arra az elemre, amely magban foglalja). A frame tulajdonsg rvn bellthatjuk az elem pozcijt s mrett. A frame tulajdonsg mellett hasznlhatjuk a center tulajdonsgot is, amely az elem kzppontjt adja meg, ugyancsak tekintettel annak tartalmaz nzetre. Amikor valarnilyen animcit hajtunk vgre, ltalban a center tulajdonsggal vltoztatjuk meg az elem pozcijt.

420

A 7. fejezet feladatainak a megoldsa

A 7. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
mysecondviewcontroller = [[MySecondviewcontroller alloc] initWithNibName:nil bundle:nil];

Vlasz a 2. krdsre
- (void)viewoidLoad { //---create a CGRect for the positioning--CGRect frame= CGRectMake(lO, 10, 300, 50); //---create a Label view--label = [[UILabel alloc] initwithFrame:frame]; label .textAlignment = UITextAlignmentCenter; label . font= [UIFont fontwithName:@"Verdana" size:20]; label .text= @"This is a label"; //---create a Button view--frame= CGRectMake(lO, 250, 300, 50); button = [[UIButton buttonwithType:UIButtonTypeRoundedRect] initWithFrame:frame]; [button setTitle:@"OK" forState : urcontrolstateNormal]; button.backgroundcolor = [UIColor clearcolor]; [self.view addsubview:label]; [self.view addsubview:button]; [super viewoidLoad];

Vlasz a 3. krdsre
//---add the action handler and set current class as target--[button addTarget:self action:@selector(buttonclicked:) forcontrolEvents:urcontrolEventTouchUpinside];

ll .. .
-(IBAction) buttonclicked: (id) sender{ /1---do something here---

421

A fggelk: A gyakorlatok megoldsai

A 8. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
Kdfjl [TabBarAndNav. :<jpj

1. Hozzunk ltre egy j Tab Bar Application projektet az Xcode segtsgve!, s ne-

vezzk el TabBarAndNav-nek. 2. Kattintsunk ktszer a Mainwi ndow. xi b fjlra, hogy az Interface Builderrel szerkesszk. 3. Vlasszuk ki a Tab Bar Controller elemet, s nzzk meg az Idencity Inspector ablakot (lsd az A.1. brt). llitsuk be a Second nzetvezrlt a N gat i on avi control l er elemre.

Clus

~..;,;;;;....,-.,_.;,;;;;..._ _ _ _ _ _ _ _ ___.
Name

View Controlle.r ./ ViewControlle-r

File'sOwner
First Responder

T._b a ..r And


Window

N~

App Delegate

+ , t ted U_

Int

O.

nu

Simulillted lnterfau: Elemenu


Status Bill r , Gr,ay :

Topbr

None

:~

lonoma.,

Tba.

--:=-ill

_ c_
n tie

+-~~--~.'!~~~~~ - ~ ~---------

J~

=----~~----

Nil NarM:

--::J
~ Autorenu V.ew To Fill Scrun

A.l. bra

4. Kattintsunk ktszer a Tab Bar Controller elemre (lsd az A.2. brt), majd kattintsunk a msodik Tab Bar ltem elemre, amely a kperny aljn tallhat. A Navigation Bar megjelenik a kperny tetejn.

422

A 8. fejezet feladatainak a megoldsa


MamWindow.xib

!ID
tnlo
N~me

'~

-.. ...... , ,.._...


Type l
UlApphuuon

File'sOWMr

First Responder

U& Responder

nb S:.r And Nilv App Oe\egate:


Window

Tilb lu Controller
Tilbbr
NaVigatlon Conuollu tSecond}

View

A.Z. bra

5. Kattintsunk jobb gombbal a Classes csoportra az Xcode-ban, s adjunk hozz oviesListvi ewcontegy j unablevi ew controller subclass elemet. evezzk el M roll er .m -nek. 6. Kattintsunk jobb gombbal a Resources csoportra, s adjunk hozz egy j View . xi b fjlt, majd nevezzk el Movi es Listview . xi b-nek. 7. Kattintsunk ktszer a Movi es l istview. xi p fjlra, s lltsunk a Class nevt Movi es Listviewcontroller . xib-re (lsd az A .3. brt) .
Moviesl.JstV1ew.xi b

() ,.., () Wo ... tn l1st V't.,. (llntr

,...

Cl;us

Movle:sUnV'tewControlle:r

;r
A<toon

TYP<

A.3. bra

423

A fggelk : A gyakorlatok megoldsai

8. Hzzunk t a Table View elemet a knyvtrbl a M es L istview . xi b abiakba ovi (lsd az A.4. brt). Trljk ki a View elemet ugyanebb l az ablakbl.

A.4. bra

9. Control-kattintssal hzzuk a File's Owner elemet a Table View-ra, majd vlaszszuk ki a view-t.

10. Control-kattintssal hzzuk a Table View-t a File's Owner elemre, majd vlaszszuk ki a dat asource-t.

11. Control-kattintssal hzzuk a Table View-t a File's Owner elemre, majd vlaszszuk ki a de l egate-et.
12.

Jo bb kattintssal erstsk meg a Table View kapcsolatait. Az A.5.


ges kapcsolatokat muta*.

bra a szks-

A.S. bra

13. A M indow. xi b ablakban bvts k ki a Tab Bar Controller elemet, s vlasszuk ainw ki annak msodik nzetvezrlj t. Az osztly neve legyen M es L i stvi ewcontovi roll e r (lsd az A .6. brt).

424

A 8. fejezet feladatainak a megoldsa

14. Kattintsunk ktszer a secondvi ew. xi b fjira az Xcode-ban, hogy az Interface Builderben szerkesszk. Vlasszuk a ki a File's Owner elemet, s az Idencity
Inspector ablakban vltoztassuk az osztlyt Movi eL istviewcont ro ll e r-re.
MainW ndOW.X!b

!Ill
V~ewMode

Info

""'m
FHe'sOwner

Typo
UIApphcation

First ~sponder

Ul Responder
~le:g.ue

Tab hr And Nav App


Window
To~b

Ta.bBarAndNavAppfRieg.Jte
Urwindow UtTabBitrController

B;u Controller

UIT01b8a.r
First ViewController(first)
Seluud
.,

N~iga.t1on

FirstVieWController

Controller {SKond)

UINa.vgatiOI'IController
!..l lao

Navig.J.tlon hr Movtu lis! View ContraHer Otert


T li b br ltem {Second)

f"'-.. .

~r Lomroller

"'11'

;_.

.
View

,.",.

Typo

m
-~

_,..........

~~"

A.6. bra

15. Mentsk el a projektet az Interface Builderben. 16. Visszatrve az Xcode-ba, szrjuk be a kvetkez flkvrerr szedett programkdot a MoviesListviewcontroller.m fjlba: #import "MoviesListviewcontroller.h" @implementation MoviesListviewcontroller NSMutableArray *listOfMovies; - (void)viewoi dLoad { //---initialize the array--listOfMovies = [[NSMutableArray alloc] init]; //---add items--[listofMovies addobject:@"Training oay"] ; [listOfMovies addobject:@"Remember the Titans"];

425

A fggelk: A gyakorlatok megoldsai

[listOfMovies addObject:@"John Q."]; [listOfMovies addobject:@"The Bone collector"]; [listofMovies addobject:@"Ricochet"]; [listofMovies addobject:@"The Siege"]; [listofMovies addobject:@"Malcolm x"]; [listofMovies addobject:@"Antwone Fisher"]; [listOfMovies addobject:@"courage under Fire"]; [listOfMovies addobject:@"He Got Game"]; [listOfMovies addObject:@"The Pelican Brief"]; [listOfMovies addobject:@"Glory"]; [listofMovies addobject:@"The Preacher's Wife"]; //---set the title--self.navigationitem.title = @"Movies"; [super viewoidLoad];

- (void)dealloc { [listOfMovies release]; [super dealloc];


}

ll customize the number of rows in the table view. - (NSinteger)tableview:(UITableview *) tableview numberofRowsinSection:(NSinteger)section { return [listOfMovies count];

ll customize the appearance of table view cells. - (UITableviewcell *)tableview:(UITableview *)tableview cellForRowAtindexPath:(NSindexPath *)indexPath {
stat i c NSStri ng *Ce ll Identifier = @"ce ll"; UITableviewcell *cell = [tableview dequeueReusablecellwithidentifier:cellrdentifier]; if (cell == nil) { cell [[[UITableviewcell alloc] initwithstyle:UITableviewcellstyleoefault reuserdentifier:cellrdentifi er] autorelease];
}

NSString *cellvalue = [listofMovies objectAtindex:indexPath.row]; cell.labelText. text= cellvalue; return cell;

426

A 9. fejezet feladatainak a megoldsa

17. Nyomjuk meg a Command-R gombokat, hogy az alkalmazst az iPhone Simulatoron teszteljk. A Second Tab Bar elemre kattintva meg kell jelennie a filmek listjnak (lsd az A. l. brt).

Remember the Tltans

First View
Optianaily move lhls view lnto a separate nlb fole and set lhe nlb name ln lhe Arst VI&W ControRer Attnilutes

John

a.

The Bone Colleetor Ricoehet The Siege Malcolm X Antwone Fisher

A. 7. bra

18. Ha a kivlasztott filmet kln nzetben szeretnnk megjelenteni, csak adjunk hozz egy msik . xi b fjlt s a nzetvezrl t. (Ezt a lps a 8. fejezetben vzoljuk, a Navigls msik elemre crn rszben.)

A 9. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
Az Interface Builderben az Info gomb kivlasztsval, valarnint az Attributes Inspector
ablakban a tulajdonsgainak megtekintsvel kikapcsolhatjuk a kiemeleffektet. Trljk a "Show Touch on Highlight" opci kivlasztst.

427

A fggelk: A gyakorlatok megoldsai

Vlasz a 2. krdsre
Ha egy karakterlncot szeretnnk a Fl i psi devi ewcontroll er -bl a Mai nvi ewcontroll erbe tvinni, ehhez a
kvetkez

flkvr utasts bemutatja, hogyan vihetnk t adatot

egyik elembl egy msikba egy tulajdonsg segtsgve!:


FlipsideViewController.h

#import "Addcount ryviewcontrol ler.h"; @protocol FlipsideviewcontrollerDelegate; @i nterface Flipsideviewcontroller : UIViewcontroller <Addcountryviewcontrolleroelegate> { id <FlipsideviewcontrollerDelegate> delegate; //---i nternal member--NSString *st r;
}

@property (nonatomic, assign) id <Flipsideviewcontrolleroelegate> delegate ; //---expose the member as a property--@property (nonatomic, retain) NSString *str; - (IBAction)done; - (IBAction)add; @end @protocol FlipsideviewcontrollerDelegate - (void)flipsideviewcontrolleroidFi nish : (Flipsi deviewcont roller *)controller; @end
FlipsideViewController.m

#import "Flipsideviewcontroller.h" @implementation Flipsideviewcontroller @synthesize delegate; //---generates the getter and setter for the property--@synthesize str; - (IBAction)done { //---set a value to the property--self.str @"Some text"; [self .delegate flipsideviewcontrolleroidFinish:self];
}

428

A 10. fejezet feladatainak a megoldsa

MainViewController.m

- (void)flipsideviewcontrolleroidFinish:(Flipsideviewcontroller *)controller { //---prints out the string obtained in the oebugger Console window--NSLog(controller.str); [self dismissModalviewcontrollerAnimated:YES];

A 1O. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
A kt protokoll a UITableviewoatasource s a unableviewoelegate. A unab levi ewoatasou r ce protokoll olyan esemnyeket tartalmaz, amelyek vltozatos elemekkellthatjk el a Table nzetet. A U !Tab levi ewoe l eg a te protokoll olyan esemnyeket tartalmaz, amelyek a sorok kivlasztsval foglalkoznak a Table nzetben.

Vlasz a 2. krdsre
Ahhoz, hogy hozzadjunk egy indexlistt a Table nzetnkhz, implementlnunk kell a secti onindexTi t l es ForTablevi ew: eljrst.

Vlasz a 3. krdsre
A hrom llits kijellsre hasznlt kp a

kvetkez:

UITableviewcellAccessoryoetailoisclosureButton UITableviewcellAccessoryCheckmark UITableviewcellAccessoryoisclosurerndicator

A UITabl evi ewce ll Accessoryoetai l oi sc l osureButton kp a felhasznli rintsekkel foglalkozik. Az esemny neve: tablevi ew: accessoryButtonTappedForRoWWi th IndexPath:.

429

A fgge lk: A gyakorlatok megoldsai

A 11. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
A felhasznli belltsok rtkeinek visszalltshoz az objectForKey: eljrst hasznlhatjuk. A felhasznli belltsok rtkeinek mentshez a se tob j e ct: forKey: eljrst alkalmazhatjuk.

Vlasz a 2. krdsre
Eltvolthatjuk az alkalmazst a kszlknkrl vagy a Simulatorrl is, tovbb eltvolthatjuk az ap pl i ca ti on_name. pl i st vgzds fjlt az alkalmazs knyvtrban a Simulatoron bell.

Vlasz a 3. krdsre
Az Add Child gombot hrom vzszintes vonal brzolja. Ez alrendelt (gyermek-) elemet ad hozz a jelenleg kivlasztott elemhez. Msrszt az Add Sibiing gombot egy plusz jel (+) brzolja. Ez ugyanolyan szinten ll (testvr-) elemet ad hozz a jelenleg kivlasztott elemhez.

A 12. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
A sql i teLexecO funkci valjban hrom funkci becsomagolsa: sql i te3_prepare(); sqlite3_step() s sqlite3_finalize(). Nem lekrdezsekkel kapcsolatos SQL-utastsokban (pldul tblzatok ltrehozsnl, sorok beszrsnl s tovbbi mveleteknl) mindig tancsosabb az sqlite3_exec() fggvnyt hasznlni.

430

A 13. fejezet feladatainak a megoldsa

Vlasz a 2. krdsre
Hogy hozzjussunk egy C-style karakterlnchoz az NSString objektumbl, hasznljuk az NSStri ng osztlynak UTF8Stri ng eljrst.

Vlasz a 3. krdsre
NSString *qsql = @"SELECT * FROM CONTACTS"; sqlite3_stmt *statement; if (sqlite3_prepare_v2( db, [qsql UTF8String], -1, &statement, nil) SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) { char *fieldl =(char*) sqlite3_column_text(statement, O); NSString *fieldlstr = [[NSString alloc] initWithUTF8String: fieldl]; char *field2 =(char*) sqlite3_column_text(statement, l); NSString *field2Str = alloc] initWithUTF8String: field2]; [[NSString NSStri ng *st r = [ [NSStri ng a ll oc] i ni twi th Forrnat: @"%@ - %@", fieldlstr, field2Str]; NSLog(str); [fieldlStr release]; [field2Str release]; [str release]; } //---deletes the compiled statement from memory--sqlite3_finalize(statement);

A 13. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
A hrom mappa a
az alkalmazssal
kvetkez:

Documents, Li b rar y s tm p. A Documents mappt a fejlesztk

sszefgg

adatok trolsra hasznljk. A Li brary alkalmazsspecifikus

belltsokat trol, pldul az NSUseroefaults osztly belltsait. A tmp mappa ideiglenes adatokat trol, amelyeket az iTunes nem ment el.

431

A fggelk: A gyakorlatok megoldsai

Vlasz a 2. krdsre
Az NSDi cti onary osztly sztrobjektumot hoz lte, amelynek elemei megvltoztathatatlanok; ehhez, miutn ltrehoztunk, tbb elemet nem tudunk hozzadni. Msrszrl a NSMutableDictionary osztly vltoztathat sztrobjektumot hoz lre, amely tovbbi elemekkel is bvthet.

Vlasz a 3. krdsre
A Documents knyvtr
elrhetsge

egy vals eszkzn:

/private/var/mobile/Applications/<application_id>/Documents/ A tmp knyvtr elrhetsge egy vals eszkzn: /private/var/mobile/Applications/<application_id>/tmp/

A 14. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
A ngy esemny a
kvetkez:

touchesBegan:withEvent: touchesEnded:withEvent: touchesMoved:withEvent: touchescancelled:withEvent:

Vlasz a 2. krdsre
Amikor tbbszrs koppantst vgznk, valjban egyetlen pontra koppintunk gyors egymsutnban. Ez hasonl a dupla kattintshoz a Mac OS X-ben. Amikor azonban tbbszrs
rintsrl

van sz,

klnbz

pontokat rintnk meg a

kpernyn

egyszerre.

432

A 15. fejezet feladatainak a megoldsa

Vlasz a 3. krdsre
Az Optiorr billenty lenyomsval sznlelni tudjuk a tbbszrs rintst az iP hone Simulatorban.

A 15. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
A hrom affmtranszformci az eltolts, a forgats s a nagyts-kicsinyts.

Vlasz a 2. krdsre
Az NSTi mer objektum idztjnek lelltsra az egyetlen md a hatlytalant eljrsSTimer objektumot. nak a meghvsa. Az i d zt folytatshoz ltre kell hoznunk egy j N

Vlasz a 3. krdsre
A urvi ew osztly be gi nAni ma ti on s s comm i t Ani ma t i ons eljrsval krbezrha~uk a vizulis vltozsokrt felels programkd blokkjait, hogy a vizulis megjelensben bekvetkez vltozsok animltak legyenek, s ne hirtelen menjenek vgbe.

A 16. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
A Safari m eghvshoz: @" http: //www .apple.com" A Mail elindtshoz: @" mailto:?to=weimenglee@ gmai l .com&subject=Hello&body=Content of email " Az SMS alkalmazs elrshez: @" sm :96924065 " s

433

A fggelk: A gyakorlatok megoldsai

A Phone alkalmazs elrshez:


@"tel :1234567890"

Vlasz a 2. krdsre
Az osztly neve: UIImagePickercontroller.

Vlasz a 3. krdsre
Az osztly neve: ABPeopl e Pi ckerNavi gationcontra ll er.

A 17. fejezet feladatainak a megoldsa


Vlasz az 1. krdsre
Ez a protokoll a UIAccelerometeroelegate.

Vlasz a 2. krdsre
A hrom esemny a
moti onBegan: moti onEnded: motioncancelled:
kvetkez:

Vlasz a 3. krdsre
Az els genercis iPhone-oknl a Core Location hromszgelst hasznl a mobiltornyok s a wifi segtsgve!, hogy meghatrozza a pozcijt. Az els genercis iPhone-oknak ugyanis nincs beptett GPS-vevje. A msodik s a harmadik genercis kszlkeknl a Core Location mindhrom klnbz mdszert hasznlja. Az iPod Touch csak a wifi hromszgelst hasznlja, hiszen nincs GPS-vevje, sem kapcsolata a mobiltornyokkal.

434

Az Xcode hasznlata
Az Xcode egy olyan integrlt fejleszti krnyezet (IDE), amelyet az Apple a Mac OS X s az iPhone-alkalmazsok fejlesztshez hasznl. Ez az alkalmazscsomag tartalmaz fordtprogramokat, dokumentcikat, Interface Buildert (interfszksztt) (ez utbbirl rszletesebben a C fggelkben olvashatunk). Az Xcode-dal iPhone-alkalmazsokat hozharunk ltre egy olyan knyelmes szvegszerkeszt segtsgve!, amely szmos k:lnbz eszkzt tartalmaz a hibajavtshoz. Ez a fggelk az Xcode fejleszti krnyezet megismershez nyjt segtsget. (A C fggelk az Interface Buildert trgyalja rszletesebben.)

Az Xcode etinditsa
Az Xcode legknnyebben gy indthat el, hogy az Xcode-ot begpeljk a Spotlight szvegdobozba, vagy az \ Devel ope r\ i Phone os <ve r si on_no> \Appl i ca ti ons\ mappban dupln kattintunk az Xcode ikonra.

Megjegyzs Mg knyelmesebb, ha az Xcode ikont a Dockra hzzuk, gy kzvetlen l a Dockrl indthatjuk.

Jelenleg az X code legfrissebb elrhet verzi ja a 3.1-es verzi.

B fggelk: Az Xcode hasznlat a

Tmogatott projekttipusok
Az Xcode az iPhone- s Mac OS X alkalmazsok ltrehozst tmoga~ a. j projekt ltrehozsakor (ezt a File men );> New Project [fjlmen );> j projekt] pontjnak kivlasztsval tehetjk meg), a ew Project prbeszdablak jelenik meg (lsd a B.! . brt).

Choost. a

tt.mpl~tt.

for you r new project

I PhOM:OS
N~~uonbued
Wor~dw.

ApphulfOn

~.WigoltJOn-btitd CO<"t:~u.

bued

Appl.U.t.Of'l

()p<nGL ES Apphc..Uiot'l

,..l. User Templ.ltts


MacFUS[ MacOS X

Appl.utton

WindOw--ba~

ApphatJon

ApphC&UOn

\\ .ndow-bued Cort:O..t.l
Appllc.&t.otl

Audro\JniU
Aut~tor

Actlan

Corr"Nr.d Unt Ut.lrty

Ducnptjon

Th~

Ov<>amoc ....".,. ,,.........,.


j.>Y&
l(e~l

~guton contrOII~- It

tempLatt PfO'ttdes a su.nmg po.l".t for an appl.IC.&tton th.at usts a pt"'V!de.s a user l"ttrfuc: c.onftgured Wtth n~giUlon

conttOlter to d1sl)by aln of i~ms

Exttnson

SWMf&rd Apc* Plug-ms SUb< l.Jtnty

""'"

B.l. bra

Kt f projektpust hozhatunk ltre: iPhone OS s Mac OS X. Az iPhone OS kategriban tallhat egy Application (alkalmazs) elem, amely mg tovbbi kt kategrira oszlik: navigcialap alkalmazsra s ablakalap alkalmazsra. Ha az Application elemre kattintunk, megjelenik az sszes ltrehozhat projektpus: navigcialap alkalmazs, navigcialap Core D ata alkalmazs, OpenGL ES alkalmazs, eszkzsv-alkalmazs, segdprogramok, nzetalap alkalmazs,

436

Az Xcode elindtsa

ablakalap alkalmazs, ablakalap Core Data alkalmazs.

Vlasszuk ki a ltrehozand projektpust, s kattintsunk a Choose gombra. Ezutn meg kell adnunk a projekt nevt. Egy projekt ltrehozsa utn az Xcode megjelenti a projektnket alkot sszes fjlt Osd a B. 2. brt).

i{
)-

l Simulator,. "'"-

3.0~

O.bug
_..

l' O l
ACilOti

o.trwew

luald II&CI Co

~"

".J U
t,.,_-.:,
Wo

O.- ,,,
. !J.."\

~
Co6t

Sutctl
O A

-- ...~

1 OUses
J

Other Sources
Ruourc~s rr~s

.,

., ..,
~

Producu

T~t~

ii" l:

~ <

~
~

-!b~

.:Jtnors ~WMI'Mft9S

.!!

..:

4. f+nd lnulu
L!l-......s
. sc..

.,
No Ed:to~

21

..

ll ::>

.. .

--
h&lfllts

lm~.uotlf'iloe.J

m
Q.

"'
V>

..

~ {

8.2. bra

Az Xcode ablak t rszre van osztva: Toolbar (eszkztr): megjelenti a gyakran hasznlt
mveletek

gombjait.

Groups and Files List (csoportok s fjlok listja): megjelenti a projektben hasznlt fjlokat. A fjlok mappkba s kategrikba vannak csoportostva az egyszerbb kezelhetsg rdekben. Status Bar (llapotsor): megjelenti a jelenlegi
mvelet jellen12it. lev

Detail View (rszletes nzet): megjelenti a mappkban s a csoportokban fjlokat, amelyeket kivlasztottunk a Groups and Files List rszben. Editor (Szerkeszt): megjelenti a lasztott fjllal.
megfelel szerkesztt

(editor) a jelenleg kiv-

437

B fggelk: Az Xcode hasznlata

..J b~Wu.tMI l~U


.. (.non ..,. W.rNftgS

.........

FrW'IWWOrU
, .. ;~llff~ftl

MytO&ttAppYonooCOI'Ilt'akt..ft
Mrt(I!Ser...,.~r..M

~~AH~Oorltr'Oht.xilb ~~lit9aM.nt7

~
K~

... ~,...*"

......... ,..

--

Fondan\lb

.. c .......

ll
ll ll
(~ ~ 'lfiltl~

LM .. 1/U.'tt,

11 c,opw"f'lot
~l

~-

zeot. u ntt:u

:IIIPOf1.

..,...,,t.._..._.t9C"':.A"' ...
.".._lllvWVI~roll "

ttl~dltl~ f\ltllu~l..-..

-,...t'-SII:Ir Wifiiii:Jw;
~la

v...c..troll;

U o-.rrtdt poartt t6t'

~tzot

co Ndt

( "'*"' ~IW: "~ti .Yl ..);

( ll'llloll ...........,..,taUtle);

('41ct)*lloe(
~ "1..c:GI'Itni A l .... );

8.3. bra

" -J IJcecut&blft
"
~

Tugru
!CM

. .........
&ron MCI'o\"Atl'llf111t Hndan...tu

(!)...,.,...,..
.. . ,..,.-!ki

.rrto,tSV"*'s
~onr<JH

l: "7:'.:'":::.~:'-,,-- .-.--11101! W- .

:-..
...
LO

-- ............

............. ...

Iundh:fi~naf!W

c- yourtGmNII'f Sti'ROOUCT..fro.AM( rfc:IOJ.ot~


WP<OOOCT_........,

11\foOiclJONtYwnoor!

.".,.

A,ppha~ttqllti'U I"-t.._.

Ma>IIMtllt:bue_.....

8.4. bra

438

Az Xcode elindtsa

Egy programkdfjl szerkesztshez kattintsunk egy fjl nevre, ezzel megnyitjuk a szerkesztt. A fjlpusnak megfelel szerkeszt indul el. Ha pldul . h vagy . m fjira kattintunk, a forrskdszerkeszt nylik meg (lsd a B.3. brt) . Ha . pl i st fjlra kattintunk, az XML Propetty List (XML-tulajdonsglista) szerkeszt nyilik meg (lsd a B.4. brt).

A Toolbar szemlyre szabsa


Az Xcode ablak tartalmazza azt az eszkztrat, amelyikben a gyorsabb elrs rdekben
elhelyezhetjk kedvenc elemeinket. Alaprtelmezettknt a juk az eszkztron:
kvetkez

elemeket tallhat-

Overview (ttekints): itt vlasztha~uk ki a clplatform belltsait, pldul az akv SDK-t (iPhone opercis rendszer s eszkz, valamint a szimultort), tovbb akv konfigurcikat (De bug vagy Release). Action (mvelet): meghatrozza azt a mel vgezhetnk. Build and Go: itt fordthatjuk s
mveletet,

amelyet egy kivlasztott elem-

telepthe~k

az alkalmazst.

Tasks (feladatok): megllt brmilyen fut

mveletet. jellemzit.

Info: megmutatja a kivlasztott elem rszletes Search (keress): san lthatk.


szri

azokat az elemeket, amelyek a Detail View rszben aktuli-

Hozzadhatunk elemeket az eszkztrhoz gy, hogy a jobb gombbal kattintunk r, s a Customize Toolbar (eszkztr testre szabsa) lehetsget vlasztjuk Ekkor megjelenik egy legrdl men, amely tartalmazza az sszes, az eszkztrhoz hozzadhat elemet (lsd a B.5. brt). Ha j elemet szeretnnk az eszkztrra helyezni, egyszeren megfogjuk s oda hzzuk.

Code Sense
A modern IDE egyik leggyakoribb jellemzje a programkd-kiegs:ifts, eszerint az IDE a kontextus alapjn automatikusan megprblja kiegszteni azt az utastst, amelyet gpeJnk. Az Xcode-ban ez a funkci a Code Sense. Amikor pldul az UIA karaktersorozatot begpeljk egy metdusban, pldul a viewoidLoad() metdusban, az Xcode automatikusan javasolja a UIA l ertview osztlyt (lst a B. 6. brt, a javasolt karakterek szrke sznek) . Ha elfogadjuk a javasolt szt, egyszeren nyomjuk meg a Tab vagy az Enter gombot.

439

B fggelk: Az Xcode hasznlata

DrAg you r favorite lt.e:ms lnto the tool bar..

"
"'

Tii(9

"'
e "'

Iul ld
~

""

Ouc.trau:

Ch~

Ali

8l.uldolndGo

..

""" """ l!Jiool ....... ""


."

.J EJw!

.... rd~Go

......
rind

a....
_v

T.a~b

Os~,

NIIl

..

"'

.uld W~t and Etrors

".

......
o:'

".

lrul(poonu

L....
SCM

8
IM

CbWSDI(

...
EJ

Rt factor

SNpshots

...,...".......

,. :J
litet,UI(hA$SlSt<Vlt
0..N<W

Ac:tM

T~l)el

Acttw Atd'ltnrrc

AatW ll.uld Conf'ituratlOf'l

..................

....
~
CuStOf"'IU

tnspeor

~p.~rator

nuablt: Space

o:--'1
S.Udl

~
ldotOf

""" - of?.
"........",

...:>
QurdctJ.odd

9'
AddAW1bvtc Add

Add 'Mity

J.t:~bOnVtp

....

"""""

.. . or d rag the default set lnto the tool bal'.

Show ,~d Tut ""'""D

....... Use smAJI size

B.S. bra

~/

~' ("'td)vl ewO l dl..oad

l .

l~t vtewOidl..oad to

{ Ul A (super vtewOidl..oad ) ;

8.6. bra

Az automatikus befejezsen kvl aktivizlhatjuk a Code Sense funkcit az Esc vagy az FS gomb megnyomsval is. A Code Sense listt jelent meg olyan szavakrl, amelyek illeszkednek a begpeltekhez (lsd a B.7. brt).

440

Az Xcode elindtsa

lt~ple

en vte.IO tci..OOd ta do adcltttonal setup after lOCiding


{

t~

vtev, typleaily fr011 a ntb.

(votd )vt~icLOOd

Ul j
~~~:liill:r-..:tlll:"t

UllnterfaceOrlentationlsLood$cape UllnterfaceOrlentot toolsPortrot t UllnterfoceOr lentot i onlandscapelef t


UllnterfoceOrtentottonlandscapeRt~t

UllnterfoceOrtentot ionPortrot t UllnterfaceOrlentat ionPortral tupstdeOown UIKeyboardAnlloatlonCurveUserlnfoKey Ul KeyboardAnt iiOt i crllurat 1 onUser l nt oKey UIKeyboardAppearance Ul KeyboardAppearanceA l ert Ul KeyboardAppearanceOef au l t UIKeyboardBal.ndsUserlnfoKey
t - Mt&Jse

l t onentot ton. ~tat ton)tntertoceOnentot too {

lit) ;

u1, nnBJ wco,

tMJiliiBS,

ece=ucc wa e n1 ose.

B.7. bra

Gpels kzben az Xcode automatikusan felismeri a programkdot, s beilleszti a megfelel paramterek helyrzjt. Ha pldul meglvjuk egy objektum metdusait, az Xcode beilleszti a klnbz paramterek helyrzi t. A B. 8. bra egy pldt mutat a UIA l ertview objektumra beillesztett helyrzkre, miutn begpeltk az i ni -t. A klnbz paramterek helyrzinek elfogadshoz nyomjuk le a Tab billentyt.

r/l hip~
'

'l

~tttona

wo

.u

looeftng the vt..-. ttptcolly fre. o ntb.


T
tl~!

- (votd)vl..Ou:t.- {
UIAI.rt'ltr *otert ([UIAiertYtew alloc] int [ "4 ,,... 1\MIC\cl..oad);

tPC>n .no Jo}t- f

11

."!1.

1<>;10 ...

: .J)delfQOle

B.8. bra

A paramterek rtkeinek megadshoz navigljunk a gombokkal az egyes paramterek kzt, vagy pedig kattintsunk az egyes helyrzkre, s rjuk fell ket.

Az alkalmazs futtatsa
Egy alkalmazs vgrehajtshoz elszr kivlasztjuk a hasznland aktv SDK-t, tovbb azt is, hogy valdi eszkzn vagy a beptett iPhone Simulatoron kvnjuk-e tesztelni az alkalmazst. Ehhez az Overview listbl vlasszuk ki a megfelel elemet Osd a B.9. brt) . Az alkalmazs futtatshoz nyom juk meg a Command-R gombokat, s az Xcode felpti s telepti az alkalmazst a kivlasztott eszkzre vagy a szimultorra.

441

B fggelk: Az Xcode hasznlata

ll_8bit_675.jpg

Device - iPhone OS 2.2 Device- iPhoneOS 2.2.1 Device - iPhone OS 3.0 (Project Setting) Simulator- iPhone OS 2.0 Simulator- iPhone OS 2.1 Simul ..tor- iPhone OS 2.2 Simulator- iPhone OS 2.2.1

~
t

rornoworlt

op

EIIm!ml!1111i1il!=t:Em(~'egue.h 1n.m. l
:t (_ l Debug

ftx.pch

Release
l

.erApp

l ~ MyKillerApp
llKttiUlKtt.l;l'

l '+ MyKillerApp - iPhone Simulator (3.0)

.nt aroc, char


WeteosePoot 1tYol Ul.\ppl

i386

---~---~~--..- re lease );
return retVo t ;

8.9. bra

Hibakeress az alkalmazsokban
A hibakeress lnyeges rsze a fejlesztsnek. Az Xcode tartalmaz hibakeres segdprogramokat, ezek nyomon kvetik s megvizsgljk a programkdot, mikzben vgrehajtjuk az alkalmazst. A kvetkez rszekben nhny olyan tippet s trkkt tallunk, amelyeket az iPhone-alkalmazsok fejlesztsnl hasznlhatunk.

Hiba
Arnikor megprblunk futtatni egy alkalmazst, az Xcode elszr megprblja fordtani a projektet, mieltt telepti az alkalmazst egy valdi eszkzre vagy a szimultorra. Brmilyen szintaktikai hibt szlel, azonnal kiemeli pirossal. A B.10. brn lthat, hogy az Xcode ezt hogyan teszi. A kvetkez programkd hibja a hinyz kapcsos zrjel a ([) a [[UIAlertview alloc] utastshoz.

442

Hibakeress az alkalmazsokban

..

'-'VKIIIerAppViewConuoller.m:36

- vlewDtdload

ll Implement vtewDidload to do oddittonol setup after loodtng the view, typteaily fw


- (votd )viewDidlood { U!AlertVtew *olert

= [UIAlertView

ol loe] initWithTitle :@"Hello World'"

o-. ....... :>:--'llllo


message :@"Hello, MY \iorld" de Legete :self concelButtonTt t le :@"OK" otherButton Ti t les :nt l ]; [o lert show ]; [ol ert release ]; [super viewDidlood ];
}

.
-. --..
--3 'L .

tt
8.10. bra

-~-

fO!:tJ

MyKillerAppViewController.m: MyKillerApp- Build Results

,. e Building tugct '"MyKIIIt:rApp'" of projut p,tyKtllerApp wlth conftgun~~tlon Debug -

Iullel Iullel-Go

Ts~s

(l t:rt04

Compoling /Users/welmenglee/O.sktop/Object!Y<-C look/SOurce Code/IAyKt'lerA:>p/O.. su/1 Otrrot__upected ;or:be~orto: :.-. , ......

..- ..

.. MyKlllerAl)pVIewControfter.m 37 : 11J -v....o.d load '/'Tii>"l- vie-.Dlci:Oad to ilo oddlUonor.etup after ladinQ tt

- (votd)vt..Oidlood {

UlAiertVIew *<llert (UIAlertVIew alloc) 1ni tV t th Ti t le ::Jtte ll o

"enr. ......... y ..... ,...."..

.essoge:8"11et to, IlY Wortd de legato :self

concelButtonT t le :4"(J:" ot.her8uttonT1tles :nt l );

(a tert show] ; (alert release]; (ouper vi..01dlood];

Butld foiled (l error)

8.11. bra

443

B fggelk: Az Xcode hasznlata

UIAlertview *alert ; [UIAlertview alloc] initwithTitle:@"Hello world!" message:@"Hello, my world" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

Ha egynl tbb hiba van, akkor kattinthatunk az Error (hiba) ikonra is, amely egy listban muta* meg a hibkat (lsd a B.11. brt).

Figyelmeztetsek
A2 Objective-C nyelv megklnbzteti a kisbetket s a nagybetket, gy az egyik leggyakoribb hiba, amelyet a kezdk elkvetnek, az, hogy nhny metdusnvnl helytelenl hasznljk ezeket. zzk meg a kvetkez pldt:
- (void)viewDidLoad { UIAlertview *alert

[[UIAlertView alloc] initwithTitle:@"Hello world!" message:@"Hello, my world" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

[al ert show]; [al ert release]; [super viewoidload];

Szintaktikailag az utastsokkal nincsen problma. Az egyik paramterben azonban nincs a megfelel helyen nagybet. Az initwithTitle: helyesen initwithTitle:. Amikor lefordtjuk a programot, az Xcode nem hibaknt jelli meg a pldban szerepl programkdot; ehelyett srga sznnel figyelmeztet jelzst ad (lsd a B.12. brt).
ll hol
""'t
1 \

VOl

to dO OOdttt'IIOI

tup oft.er toac:hf'IQ tM vtew, typtcolly fre. o f'ltb.

- ( votd)Yt..OI<Lood { tltAiertYtew olert [[U IAte-rtYt

al loe ]

tnttvithlttte: til to Vorld~ - . - :G"Hello, World" deleoate:.lt


c:or>ce IM!.<>nTI t 1 : e othereutt.onTtttes:nt l ];
W'VrwtV- no '-l'~t~l wtlhl1tk~l.~ata:aJKtllvnonT1tS.:Otbc:~IOrtTltJu.' ,...lhod found ~~.., ~t a ~th.ng n"t.I-Jod sog:nAtu.._w. be u~n"ed to tr..10"" cr al'ld ac.U:I't ~o~~~TC~J

[al ert show ); [o tert reteose);


[ u r v tew0t4.ood];

8.12. bra

444

Hibakeress az alkalmazsokban

Amikor figyelmeztet zenetet ltunk az Xcode-ban, ellenrizzk le, hogy a metdusnv helyesen van-e rva, belertve a kisbetk s a nagybetk megklnbztetst is. E llenkez esetben futsidej hibt kaphatunk. A B.13. bra a futsidej kivtel zenetet mutatja be, amelyet az Xcode akkor jelenit meg, amikor egy futsidej kivtel hiba trtnik.

UJ.~IertYu~w

*olert ((UIAlert'ltet.t al toc]


tnttvlthhtle: ~ " ~-Yoot
~~e~aoge:ll'ha:

to,

to wortal \Jiurtd

deleQOte:

~ett

concelButtonTi tle: ~wcr. otherSUttonTt t les:nt l ];


'lumlng. no
'-i.,lt.wll hnovn.euag-._deJeg&te..'t'&neellvttonTitle:ot~ult!lonTidti:'

('hu~ ~rtnout

.a

l'l'lolllC""ng

me.1hod found f'l'lr."od 1'9"&:ure will t.. USI.IIf"l!d 10 rr."'"" ',.d &rod .ccept 'u gvunuJ

[al ert .ro.) ; [o tert relea$e] i

l
}

["""'r vt....Otdl.ood ];

8.13. bra

Amikor futsidej kivtel kvetkezik be, a hiba javtshoz nyissuk meg a Debugger Console ablakot a Shift-Command-R lenyomsval. A Debugger Console ablak megmutatja az sszes hibajavtsi informcit, amelyet az Xcode kir hibakeress kzben. Ez az ablak rendszerint tartalmaz olyan utalst, amellyel pontosan meghatrozha~uk, mi okozza a problmt. A B.14. bra megmutatja a Debugger Console ablak tartalmt a kivtel bekvetkeztekor. A lells oknak kidertshez menjnk az ablak aljra, s keressk meg a flkvr bets rszt. Figyeljk meg az okot. Nyilvnval, hogy a problmt a UIA l ertview objektum okozta.
rSimulator- 3.0 l Debug
Ove"Vtf!W

( Session started at 2009-0 7- 10 16:34 :05 +0800. J 2009-07-10 16:34. : 07 . 526 MyUllorApp(8009:207J -(UIAlcrtview initwithTitle :moaaage:dologate: cucel8uttonTitle : otbo.rautt.oaT1tloa s J : Wlroc:og11.b oc! ee loetor aeat to Laatance Oxl9075t0 200.9-07-10 16 : 34t07 .527 MyKi.llerApp[8009:207 ] ... Toraicatia.g app duo to uacaught exception ' NSia.vali.dArgume.atlbceptioc , reaaon : ' -[OIAlertviev initwithTitlenziOeage : 4elegato : c&AColSuttOA~itle : otberauttonTitloaJ J : wtrecognisod. eeloctor aent to Laatane. Oxl9075t0 ' 2009-07-10 16 : 34 : 07 . 528 HyJ:lllerApp [ 8009 : 207 ) Stac)t : ( 807800427, 2510631165, 808176203, 801751910, 807604514, GOB Program loaded - -- -- ---- - - ----------"~cceeded

8.14. bra

445

B fggelk: Az Xcode hasznlata

Trspontok bellftsa
A trspontok bellitsa a programkdban egyszer megolds az alkalmazs hibakeressre. A trspontok lehetv teszik, hogy a programkdot sorrl sorra hajtsuk vgre, s megvizsgljuk a vltozk rtkt, hogy megfelelen mkdnek-e. Az Xcode-ban trspontokat a Code editor (programkd-szerkeszt) bal oszlopra kattintva hozhatunk ltre (lsd a B.15. brt).

- (votd)wl lll!ototeTolnterfoceOr lentotton: (UllnterfoceOrientot ton) to InterfaceOrientot ion cllrotlon: (NSTt .. lntervol) cllrotton { UllnterfoceOnentotton destOnentotton tolnterfoceOrlentotlon; ti (destOnentotion UllnterloceOrientottonPortro t t) {
btn .frc.e CGRectJ1ake(20 ,20,2S0,37) ;

} else
{

btn .fr- CGRectllake(18e , Z43,200 , 37) ;

8.15. bra

Megjegyzs A trspontra kattintva trtnik a ki-be kapcsols. A sttkkkel megjelentett trspontok bekapcsolt llapotban vannak, a vilgoskkek kikapcsoltban.

Miutn bellitottunk trspontokat az alkalmazsban, meg kell nyomnunk a Commandy gombokat, hogy elindtsuk a hibakeresst, s meglljunk a trspontoknl, amikor elrjk ket.

l Megjegyzs Ha az alkalmazst a Command-R billentykombincival indtjuk


~ ~kor a futs nem ll meg a trspontoknL

Amikor az alkalmazs elri a bellitott trspontot, az Xcode az aktulisan fut programsorhoz egy piros nyilat tesz (lst a B.16. brt). Ezen a ponton tbb dolgot tehetnk: Step Into (Shift-Command-I) - belphetnk az utastsokba egy fggvnyben / metdusban. Step Over (Shift-Command-0) - vgrehajthatjuk az sszes utastst egy fggvnyben/metdusban, s tovbbmehetnk a kvetkez utastsra.

446

Hibakeress az alkalmazsokban
- (vold}vll lRotateTolnterfoceOnentatlon: (Uli nter r oceon en tat l on) ta lnterfoceOr lentat l on <l.lratlon: (HSTt110 Intervol ) duratlan {

} else {

btn .frOIIO CGRectl1c*e(180 ,243 ,288 ,37);


}

8.16. bra

Step Out (Shift-Command-1)- befejezhetjk az sszes utasts vgrehajtst egy fggvnyben/metdusban, s tovbbmehetnk a fggvnyhvs utn kvetkez utastsra. Ha szetetnnk folytatn az alkalmazs vgrehajtst, nyomjuk meg az OptionCommand-P billentykombinci t.
Megvizsglha~uk

a vltozk s az objektumok rtkt is a Show Debugger gomb lenyomsval (lsd a B. 17. brt). Ha az egrmutatt objektumok s vltozk fl visszk, ltha~uk az rtkeiket.

TlotNdl

!= ;;;::::l'ml._.flu_
S

;ROOW . u~~>Oitf..."Onlc:eorie."Ubb

U
l

Olt l 90S620
_aow$

0Jtl l t90& 14

-.}l;**'
y'""'

i.!.

*;:zZf""'9~

.. ''

i"i9<ol!l\ullonCcnlt:rpCIIIHoo!llldlca!JOf'... __ ofl,j<lctw~
\J ~ ..... ~

6 -( ll&oloc ucn) bttCii c:Qd:

OtiiOt~

7~~1

....1""'-i...t>tl
:

o'l

.,.

um_"._fM9_lniP O,CS704cab01

""""'

~_".....tiOY

SI' <HHffi.1 ,Mta>t

~...teee..co l llb:'1i'e4ctl'9i~S)'MI'lUr_tl'QP>

e>:~c.ol81l>noo

nt

t) ~ .r.Wtoat~lotl:ll."laOI'~

d.,..KIOII

L.>ne 17

8S...:cndt4

8.17. bra

447

B fggelk: Az Xcode hasznlata

Az NSLog hasznlata
A trspo ntok hasznlatn kvl alkalmazhatjuk hibakeressre az NSLog() metdust is, ezzel hibakeres zeneteket kldnk a D ebugger Co nsole ablakba. A k vetkez NSLog () utasts zenetet kld a D ebugger Console ab lakba, arnikor az alkalmazs m egvltoztatja az orientcit: - (void) willRotateTointerfaceorientati on: (UIInterfaceorientation) tointerfaceOrientation duration: (NSTimeinterval) duration { NSLog (@"I n the will R otateToint erfaceori entati on : event handle r"); UIInterfaceorientation destorientation = tolnterfaceorientation; if (destorientation == UIInterfaceorientationPortrait)
{

btn . frame else


{

CGRectMake(20,20,280,37);

btn.frame
}

CGRectMake(180,243,280,37);

A B. 18. bra a kimenetet mutatja a Debugger Co nsole ablakban (nyomjuk meg a Command-Shift-R gombokat a megjelentshez) .
_ ScreenRotations - Debugger Console

unable unable unable unable u."\able

to to to to to u.~able to unablc to unable to u.~able to u:1ablc to

load c.-and Ox80000022 load COIIIIWL~d Ox80000022 load COIIIIWU\d Ox80000022 load c.-and 0><80000022 load c...a.~d Ox80000022 u.'>k.~own load cc.mand Ox80000022 unk.nown load coama.nd Ox80000022 unknown load COGIDO.lld Ox80000022 unknow:> load cOIIIIWU\d Ox80000022 unk.."'O\to":l load ccmoa.nd Ox80000022 2009- 07 - 10 12 : 17: J t . 259 Scroonllot:atiou [ 68 H : 207 J In tho willttotatoToi atorf aeOOrlont.ation : cvOAt handlo r u.'\ltnown u.'>k."\own unknoo.-n u.'\ltnow:>
gU!> (h:t

read read read read read read read read read read

unlc..~own

GDB Stopped at bre kpolnt l

count

l)

'

wiii RotateTotnter.

8.18. bra

448

Hibakeress az alkalmazsokban

Dokumentcik
A fejleszts folyamn gyakran le kell ellenrizni a klnbz metdusokat, osztlyokat s objektumokat, amelyeket az iPhone SDK-ban hasznlunk. Ehhez nzzk meg a dokumentcit. Az Xcode ezt gyorsan lehetv teszi, megnzhetjk osztlyok, tulajdonsgok s metdusok definciit az Option gomb hasznlatvaL Egy elem sgdokumentcijnak megtekintshez egyszeren nyomjuk meg az Option billentyt. A kurzor ekkor clkeresztre vlt. Kattintsunk dupln az ellenrizend elemre, s megjelenik a Developer Documentation (fejleszti dokumentci) ablak (lsd a B. 19. brt).

lnhtrtu from
Conform~ to

UVI-tJJI.nJ)Ondff~

HSCodl .... (UIVIh~


IOb,.C:I

lNSObJeaJ

f r&mewor\.

IS.."!t<'I'IIUbnty/f~liU'I(Jtfr~

Ankbllity

ltVJ.oUIM <it lf'I'Kint 05 2-0 MMIIIttt

Oodvod "'
)l;(cde

U hMbe

,_QtQ

~t~

w .., pta coct.

""""" T"*
l.llll'lt" ... ll

Apol(,,~

UICllt.lio9
UIU.C.cht

r-.o.toon elff<lfl<t

",_._OS J I> btrv TOIIIO UMtbWnu

---lkackl....uiS.a "'9 hiottl

W.T1p

IMot<tV-oau~

~a.ukftf-.

JOWid 1--...n

8.19. bra

Research Assistant (kutatsi segd)


Egy nagyon hasznos eszkz a dokumentciban a Research Assistant (Help ~ Show Research Assistant [sg ~ kutatsi segd megjelertse]). A Research Assistant egy olyan ablak, amely kontextusfgg sgt jelert meg, amikor a programkdunkon dolgozunk az Xcode-ban. Amikor a kurzort egy bizonyos kulcsszra/ utastsra visszk, a Research Assistant megjderti a kvetkez informcit a jelenlegi kulcsszrl/utastsrl (lsd a B.20. brt): Deciaration (deklarci), Abstract (lers),

449

B fggel k: Az Xcode hasznlata

Availability

(elrhetsg),

Related API (kapcsold API), Related D ocuments (kapcsold dokumentumok), Sample Code (programkdminta).

(...,ltl)ilclpi1CDliD"bllllll'ln11K.<U'dii... :(VI'"'Itt:Ot..ll> ' )clippliCGl1.,( o.-n """" t cuncauatl<lh ~~~~p mrc~>


t~~~,..":

1illllll'ltrol . l .. ]; (l1'1ZN..,.,..,,"""""n1bLe};

w.

-{*11)1111011{
(~fOI1'1LM

Clffrofu

~t

T.O..V_....,ot Ttwta..tftl1

(......,.rl-)1 (<,.r.:-lloc:J;

""--

""-C-I)au.IIH l)n

8.20. bra

SSZEFOGLALS
Ebben a fggelkben rvid ttekintst adtunk arrl, hogyan hasznlha~uk az Xcode-ot iPhone-alkalmazsok fejlesztshez. Megnztk, hogyan hasznlha~uk a Debugger Console ablakot az Xcode ltalltrehozott kimenetek megtekintshez az alkalmazs futsa kzben, tovbb hogyan llitsunk be trspontokat az alkalmazsban, hogy lpsenknt tudjuk futtatill a prograrnkdot.

450

Az Interface Builder hasznlata


Az Interface Builder az iPhone SDK egyik alkalmazsa, olyan vizulis
tervezeszkz,

amellyel sszellitha~uk iPhone-alkalmazsaink felhasznli fellett. Noha az Interface Builder nem felttlenl szksges az iPhone-alkalmazsok fejlesztshez, mgis fontos szerepet jtszik. Ebben a fggelkben az Interface Builder nhny fontos szolgltatst mutatjuk be.

Az xib ablak
Az Interface Builder inditsnak legkzvetlenebb mdja, ha dupln kattintunk az Xcode-projektben lv . xi b fjlokon. View-based Application (nzetalap alkalmazs) projekt ltrehozsakor pldul kt . xi b fjl tallhat az X Code Resources (erforrsok) mappjban. Az Interface Builder inditshoz kattintsunk dupln az egyik fjl nevre. Az indits t kveten megjelen els ablak neve megegyezik az . xi b fjl nevvel Osd
a C 1. brt).

Az ablakban szmos elem tallhat, s attl dupln, tbbek kztt az albbiak lthatk: a fjl tulajdonosa,
els

fggen,

hogy melyik fjira kattintottunk

reagl,

View (nzet), Table View (tblzatnzet), Window (ablak) stb., nhny


elemvezrl

s deleglt.

C fggelk: Az Interface Builder hasznlata

C.l. bra

Az . xi b ablak tartalma alaprtelmezs szerint ikorundban jelenik meg. tvlthatunk azonban listarndba is, ekkor megnzhetjk nhny elem rszletesebb adatait. A C.2. b ra pldul azt mutatja, arnikor az elemeket listarndban nzzk meg, s a View elem megjeleniti a benne lv elemek hierarchijt.
HelloWorldVieWController.xb

N.tme:
Fle's<h\one.r

lYI>
HelloWorldViewController

Fin:t Responder

Ulitespondu UIVie.w
UIUbel
UITextField

......, View

L;r.be.l (Piuu enter your n.tmd


__, Round Styfe Te.xt Fitld

Rounded Rt lu non (OK}

Ul Button

.
C.2. bra

A nzet megtervezse
Az alkalmazs felhasznli felletnek megtervezshez kattintsunk dupln az . xi b ablak View (vagy Table View vagy egyb) elemre a megjelenitshez, s hogy elemeket a View abiakba hzhassunk. Ahhoz, hogy a View ablakot elemekkel tltsk fel, hzzuk az abiakba a Library (knyvtr) ablakban felsorolt objektumokat (a Library ablakot lsd albb). A C.J. brn az lthat, amint egy Label elemet hznak a View ablakba.

452

A nzet megtervezse

( objK" ! ....,.. :
View
l.Jbrary Coc::oa Touch Plug n

Label

Label u....... ,
lmplements a read-only text view_ A tolbel coan contaln Ml arbnruy vnount o( tut, but

Label

lMLlbel may shrink. wrap. or truncatt the

~~~~~~t~~"?-~~~t-~l~~~~!~~e..~.u~:ng

<t C.3. bra

O.

Az elem elhelyezsekor az ablakban rcsvonalak jelennek meg. A View ablakban arra is lehetsgnk van, hogy megvltoztassuk a nzet orientcijt, gy ltha~uk, hogyan nz ki az elem vzszintes tjolssal (lsd a C.4. brt).

Please enter your name

C.4. bra

453

C fggelk: Az Interface Builder hasznlata

AZ INTERFACE BUlLDER GYORSBILLENTY l


Ahogy egyre tbb elemet adunk a View ablakhoz, egyre nehezebb meghatrozni aktulis mretket s a tbbi elemhez viszonytott helyket. Nhny tlettel megknnythetjk a munkt: Ha msolatot szeretnnk kszteni az elemrl a View ablakban, az Option gomb lenyomsval kattintsunk az elemre, majd hzzuk el. Ha nincs kijellve elem, akkor, ha az egeret az Option gomb lenyomsval egy elem fl visszk, megjelennek az elem elrendezsi s mretinformcii (lsd a C.5. bra bal oldaln). Ha ki van jellve elem, akkor, ha az egeret az Option gomb lenyomsval az elem fl visszk, a mretinformcik jelennek meg. Ha ekkor az egeret egy msik elem fl visszk, akkor az elem s a kijellt elem kzti tvolsg jelenik meg (lsd a C.5. bra jobb oldaln).

Please enter

you~e

C.S. bra

Az lnspector ab lak
Az elemek klnfle attribtumainak s tulajdonsgainak testre szabsa az Interface Builder illspector ablakban lehetsges. Az Inspector ablak ngy rszbl ll:

454

Az. lnspector ablak

Attributes Inspector

(attribtum-ellenr), (kapcsolatellenr),

Connections Inspector Size Inspector

(rnretellenr), (identits -ellenr).

Idencity Inspector

Az Inspector ablak a Tools );> Library (eszkzk );> knyvtr) rnenpontot vlasztva hivhat meg. Az albbiakban rszletesen bernutatjuk az Inspector ablakokat.

Az Attributes lnspector ablaktbla


Az Interface Builder Attributes Inspector ablakban (lsd a C.6. brt) konfigurlhatjuk az elemek attribtumait. Az Attributes Inspector ablak tartalma dinamikus, s a View ablakban kivlasztott elemtl fggerr vltozik.

Stmulted lnterfue E.lements


s~un

la.r

, Grv
None

.. ,

Top Sar

lottom br . None

==-rrJ ==::!B

Mode

(~ToUI -

JTI
J

Alpha
h.ckground

o& '"-uiO

=--:JJ
Op.tque
~

Tag
Dn.~1ng

H1ddtn

......; Oe ar Context ltfore Dnw1ng


;,._"; Otp Subviews
Autorestze SubYiews

lnten.cton

User lnu~ncuon En~bttd

W Mufttple: Touch

C.G. bra

C. 7. bra

Az Attributes Inspector ablak a Tools );> Attributes Inspector (eszkzk );> attribtumellenr) rnenpontot vlasztva hivhat meg.

455

C fggelk: Az Interface Builder hasznlata

A Connections lnspector ablak


Az Interface Builder Connections Inspector ablakban (lsd a C. 7. brt) kapcsolhatjuk a kivezetseket s a mveleteket az elemvezrlkhz. A Connections Inspector ablak tartalma dinamikus, s a View ablakban kivlasztott elemtl fggen vltozik. A Connections Inspector ablak a Tools );> Connections Inspector (eszkzk );> kapcsolatellenr) menpontot vlasztva hvhat meg.

A Size lnspector ablak


Az Interface Builder Size Inspector ablakban (lsd a C.8. brt) konfigurlhatjuk az elemek mrett s pozcijt.

o y
W !20 H

o
60

C.8. bra

C.9. bra

A Size Inspector ablak a Tools );> Size Inspector (eszkzk );> mretellenr) menpontot vlasztva hvhat meg.

456

Library (knyvtr)

Az ldentity lnspector ablak


Az Interface Builder Idencity Inspector ablakban (lsd a C.9. brt) konfigurlha~uk az elemvezrl kivezetseit (outlet) s mveleteit (action). A mveleteket s a kivezetseket a plusz (+) gombra kattintva adha~uk hozz, a mnusz (-) gombra kattintva pedig eltvolthatjuk ket. A fggelk utols rszben rszletesen bemutatjuk, hogyan hozhatunk ltre kivezetseket s mveleteket az Interface Builderben. Az Idencity Inspector ablak a Tools )> Idencity Inspector (eszkzk )> identitsellenr) menpontot vlasztva hvhat meg.

Library (knyvtr)
A Library (fools )> Library [eszkzk )> knyvtr]) egy olyan elemkszletet tartalmaz, amelynek segtsgvel sszellthatjuk iPhone-alkalmazsaink felhasznli fellett. A C. tO. brn a Librarylthat rszleges elemkszletteL

N~viga.tion

Image Prcke

Obj ct

Provldes view mln;a.gement funcuonahty for

tooiNrs, ~v.g01bon b.vs. and ;a,pphat1on VJews . The UMPM:onuolltrciHs also

suP__~'J!...~~~~.'--~"~.. ~~~~~ng views

err./ Show Group Banners

'

o View lcon.s ll View lcons And Labels QY View lcons And Descnptlons

View Controllr

Ul'le NC:ontr"' ~r

~
ror

NewGroup New Smart Group

PrOVId tS Yitw- managtmtnt funCIJO~hty


vteoNS .

toolb.us. ~VJgt1 on bvs, ilnd apphcaton The UMewCont.roller eius ~so

~~~~ ~~~.".!~-~n~.. ~~~~ng vtfWS

Edit Rc:""'ove From

(:rou"J

C.lO. bra

C.ll. bra

457

C fggelk: Az Interface Builder hasznlata

A Library az elemek albbi megjelentshez kanfigurlhat (lsd mg a C.11. brt): ikonok, ikonok s cmkk (a C.10. brn lthat md), ikonok s lersok.

A C.12. brn a Library lthat ikonok s lersok mdban.

Kivezetsek s mveletek
A kivezetsek s a mveletek az iPhone-programozs alapvet mechanizmusai, amelyeken keresztl sszekapcsolhatjuk a programkdot a felhasznli fellet (UI) elemeivel. Kivezetsek hasznlatakor a programkd programozottan hivatkozhat a felhasznli fellet elemeire, amelyek a klnbz elemek ltal kivltott esemnyeket kezel esemnykezelkknt mkdnek.

View Controller - A controller tN;t suppons the fundamentil


vt~-m~nageme:nt

model in

N.avlg.ation Controller - A

controller thu tna~ges NVI~ i on through a hJetouc.hy


T~b

Noha a mveleteket s a kivezetseket programkd rsval is csatlakoztathatjuk, az Interface Builder leegyszersti ezt a folyamatot azzal, hogy engedlyezi a kivezetsek s a mveletek hzssal trtn csatlakoztatst.

l.u Controller - A controller


m~agts

tN t

a set of view

controUen ch.lt reprnent t.lb


Table View Conu- lier - A o controlter that managts a tab1e

vtew.

Kivezetsek s ltrehozsa

mveletek
Vtf:'ti'IS .

View ControUu l c trPremdes view- management fun<uonal1ty for toolbars. nav.g.ttlon bM$ , ilnd application

The UMPNC:ontrotle:r cl HJ abo

~~P:._D']_S ~~~~~-~~~s-~n~~~~ng Vl!W1

Mvelet ltrehozshoz kattintsunk az Idencity Inspector ablak Class Actions (mveletek osztly) C.12. bra rszn tallhat plusz (+) gombra (lsd a C.13. bra bal oldaln). Tegynk kettspontot (:) a mvelemv vgre. Ez a karakter lehetv teszi, hogy a mvelet i d tpus bemeneti paramtert hasznljon, pldul a kvetkezkppen:
-(IBAction) myAction:(id) sender;

458

Kivezetsek s mveletek

HthoWOt1dVRWConuoUer

A Type: J

C.13. bra

A C.13. brn mind a kivezets, mind pedig a mvelet a Helloworldviewcontroller.xib fejlc alatt jelenik meg, ugyanis a kivezets s a mvelet egyarnt az Interface Builderben van definilva. Kivezets ltrehozshoz (az elzhz hasonlan) kattintsunk az Idencity illspector ablak Class Outlets (osztly kivezetsei) rszn tallhat plusz (+) gombra. Mindig adjuk meg a meghatrozand kivezets tpust. Az elz pldbl kiindulva, ha a Icivezetst az UITextField elemhez szeretnnk kapcsolni, akkor a myoutletl tpust id helyett UITextFi el d-knt kell megadni. Miutn ltrehoztuk a Icivezetst s a mveletet az Interface Builderrel, defmilnunk kell azokat a . h-fjlban az albbiak szerint: #import <UIKit/UIKit.h> @interface Helloworldviewcontroller IBOutlet UITextField *myoutletl; urviewcontroller {

-(IBAction) myActionl:(id) sender; @end

Megjegyzs Az Xcode-ban s az Interface Builderben egyarnt mentennk


kell a fjlt a mdostsokat
kveten .

459

C fggelk: Az Interface Builder hasznlata

Visszatrve az Interface Builder Idencity Inspector ablakba ismt ltha~uk, hogy a kivezets s a mvelet egyarnt szerepel a Helloworldviewcontroller.h fejlc alatt (lsd a C./4. brt). Ha ismt a plusz (+) gombra kattintunk, akkor a kivezets vagy a mvelet a Helloworldviewcontroller.xib fejlc alatt szerepel mindaddig, amg nincs definilva a .h-fjlban.

Megjegyzs A . h fjlban definilt kivezetsek s mveletek nem trlhetk az ldentity lnspector ablakban a mnusz (-) gombra kattintva.

Lnyegesen egyszerbb, ha a kivezetseket s m veleteket elszr kzvetlenl az elemvezrl . h fjljban defmiljuk. gy nem szksges ezeket az Interface Builder Identity Inspector ablakban meghatroznunk Ha nem szeretnnk manulisan megadni a kivezetsek s a mveletek deklarcijt az elemvezrl osztlyban, akkor hozzuk ltre a kivezetseket s a mveleteket az Identity illspector ablakban, jelljk ki a File's Owner (fjltulajdonos) elemet, majd vlasszuk a File };> Write Class Files (fjl };> osztlyfjlok rsa) menpontot. Ekkor az Interface Builder ltrehozza az Idencity Inspector ablakban hozzadott kivezetsekhez s mveletekhez tartoz programkdot Ha ezt a bellirst hasznljuk, az Interface Builder elszr rkrdez, hogy le kvnjuk-e cserlr az elemvezrl fjlt (ha mr ltezik), vagy hozz szeremnk-e fzni az j adatokat. Ha lecserljk a meglv fjlt, akkor a fj lon vgzett C.14. bra valamennyi mdosts elvsz. Ha hozzfzzk az adatokat a meglv fjlhoz, akkor megadha~uk, hogy a programkd mely rszei kerljenek a fjlba. Ez a lehetsg biztonsgosabb. Az Interface Builder ltal generlt programkd esetn a kivezetseket nem hasznljuk tulajdonsgknt. A tulajdonsgok hasznlathoz manulisan kell megadnunk a programkdot (a @ prope rt y s a @ synthesi ze kulcsszavakat) a tulajdonsgok fogadinak s indtinak a generlshoz.

Megjegyzs A kivezetseket s a mveleteket ltalban mindig knnyebb manulisan definilni, mint az Interface Builder hasznlatvaL

460

Kivezetsek s mveletek

Kivezetsek s mveletek csatlakoztatsa


A kivezetsek s a
mveletek

elemekhez

trtn

csatlakoztatsnak kt mdszere van.

1. mdszer
Kivezetsek csatlakoztatshoz a Control billenty nyomva tartsval hzzuk a File's Owner elemet arra az elemre, amelyhez csatlakozni kvnunk Qsd a C.15. brt).

"'
Please enter you r name

C.lS. bra

Az egrgomb felengedsekor megjelenik egy lista, amel ybl kivlaszthatjuk a megfelel kivezetst. A kivezetsek definilsakor (akr az Idencity lnspector ablakban, akr programkd hasznlatakor) megadhatjuk, hogy a kivezets rnilyen tpus elemre vonatkozik. Az egrgomb felengedsekor az Interface Builder csak a megadott elemtpushoz tartoz kivezetseket jelenti meg. Ha pldul az myoutl etl elemet ursutton-knt definiltuk, majd a File's Owner elemet a Control billenty nyomva tartsval a View ablak Text field elemre hzzuk, akkor a myoutl etl nem szerepel a kivezetsek listjban. Mveletek csatlakoztatshoz a Control billenty nyomva tartsval hzzuk az elemet az . xi b ablakban lv File's Owner elemre Qsd a C.16. brt).

Please enter your name

OK

C.16. bra

461

C fggelk: Az Interface Builder hasznlata

Az egrgomb felengedsekor megjelenik egy lista, amelybl kivlaszthatjuk a megfelel mveletet. A kivezetsek s a mveletek csatlaHelloWorldVewController .b koztatst kveten hasznos lehet, ha a File's Owner elemre jobb gombbal kattintva megtekintjk az sszes kapcsolatot. A C.17. brn lthat, hogy a File's Owner elem a myout l etl kivezetsen keresztl a Text Field elemhez, a Button elem Touch up Inside esemnye pedig a myActi on l: mvelethez kapcsoldik. Felmerl a krds, hogy hogyan ismeri fel a Button elem azt, hogy a Touch up Insi de elemet (nem pedig ms eseC.17. bra mnyt) kell a myActi on l: mvelethez kapcsolni, amikor a Conttol billenty lenyomsval a Button elemet a File's Owner elemre hzzuk. A Tou ch up In si de esemnyt annyira gyakran hasznljuk, hogy ez az alaprtelmezett esemny, amikor az elemeket a Control billentyvel hzzuk. Elfordul hat azonban, hogy az alaprtelmezett esemny helyett egy msik esemnyt kvnunk csatlakoztatni. A msodik mdszer ezt mutatja be.

2. mdszer
A msik mdszer a kivezetsek csatlakoztatsra, ha jobb gombbal kattintunk a File's Owner elemen, majd a kivezerst kzvetlen1 az elemhez kapcsoljuk (lsd a C.18. brt).
HelloWorldVtewContoller lb

Please enter your name

OK

C.18. bra

Mveletek csatlakoztatshoz sszekapcsolhatjuk a relevns mveletet azokkal az elemekkel, amelyekhez kapcsoldni kvnunk (lsd a C.19. brt). Az egrgomb felengedsekor megjelenik egy esemnylista, amelybl kivlaszthatjuk a megfelel esemnyt.

462

Kivezetsek s mveletek
He'loWordVi@wController xob V' ew

Please enter you r name

Otd [n d On b rt
[dlllnf1 (h.lnQotd
Edtn~

Old Sc-Qn

Edtltr.Q Dtd End

Touct'l Cn<tl

Touch Do'lrn
Touch Down Reput

Touch Dr.:ag (ntrt TouchDrag btt Tou< h Dug !nstdt Touch Oro~g OuU1dt Touch Up lnitd~
Touch Up
'V.llu.Out~ae

Cho1n9td

C.19. bra

Ismt msik mdszer, ha jobb gombbal kattintunk a krdses elemre, majd a relevns esemnyeket a File's Owner esemnyhez kapcsoljuk (lsd a C.20. brt). Az egrgomb felengedsekor egy mveletlista jelenik meg. Adjuk meg, hogy melyik mvelethez szeretnnk kapcsoldni.
H~lloWorldVoewConoroller.xib

OD

Q.

Please enter your name

C.20. bra

463

C fggelk: Az Interface Builder hasznlata

SSZEFOGLALS
Ebben a fggelkben ttekintettk, hogy miknt hasznlhatjuk az Interface Buildert az iPhone-alkalmazsok felhasznli felletnek ltrehozshoz. A kivezetsekrl s a m veletekrl szl rszben ttekintettk, hogy milyen mdon tudjuk a kivezetseket s a mveleteket az alkalmazs elemeihez kapcsolni.

464

Objective-C gyorstalpal
A:z Objective-C olyan objektumorientlt programozsi nyelv, amelyet az Apple elssorban Mac OS X s iPhone-alkalmazsok programozsban hasznl. A standard ANSI C nyelv kiterjesztse, gy egyszeren elsajtha~uk, ha mr jrtasak vagyunk a C programozsi nyelvben. A fggelk anyaghoz rendelkeznnk kell C programozsi httrismeretekkeL Ez a fggelk a nyelv objektumorientlt tulajdonsgaira sszpontost. Ha Java- vagy .NETjrtassggal rendelkeznk, tbb alapfogalom ismers lehet, csak az Objective-C szintaxist kell megtanulmmk, s klnsen a memriakezelssel foglalkoz rszre kell figyelnnk. Az Objective-C forrskdfjlokat a kvetkez kt fjltpus tartalmazza:

.h . m-

fejlcfjlok, implementcis fjlok.

A fggelk tmakreinek ismertetsekor a kvetkezket felttelezzk: az Xcode segtsgvel nzeralap Application projektet ksztettnk, amelyhez s ome cl as s nven egy res osztlyt adtunk hozz.

Direktivk
Ha megvizsgljuk a somecl ass. h fjl tartalm t, lthat, hogy a fjl elejn egy #import utasts tallhat:
#import <Foundation/ Foundation.h>

@inte rface som eclass : NSObject { } @end

D fggelk: Objective-C gyorstalpal

Az #import utasts elr!feldofgoz (preprocessor) direktva nven ismert. A C s a C++ nyelvekben az #i ne l ude elfeldolgoz direktivval foglaljuk egy fjl tartalmt az aktulis forrskd ba. Objective-C nyelven az #i mport utastst ugyanerre a clra hasznljuk, de ebben az esetben a fordt biztos~a azt, hogy az alkalmazs azonnal tartalmazza a fjlt. Ha az egyik keretrendszerbl egy fejlcfjlt szeremnk importlni, a fejlcfjl nevt cscsos zrjelek (<>) kztt kell meghatroznunk az #import utastsban. Fejlcfjl importlshoz a projektnkbl az " (idzjel) karaktert kell hasznlnunk, ahogy a someclass. mfjl esetben: #import "someclass.h" @implementation someclass @end

Osztlyok
Az Objective-C nyelv hasznlatakor sok idt tltnk az osztlyok az s objektumok kezelsvel. Ezrt fontos megismerni azt, hogy az Objective-C nyelvben hogyan kell az osztlyokat deklarlni s definilni.

@interface
Osztly deklarcijhoz az @ interface fordtdirektvt kell hasznlnunk a kppen: @interface someclass NSObject {
kvetke z

Ezt a fejlcfjlban (. h) kell megtenn nk, az osztlydeklarci nem tartalmaz megvalstst. Az elz programkd deklarlja a someclass nev osztlyt, ez az osztly pedig az NSObject nev alaposztlytl rkl.

Megjegyzs A programkd-deklarcit rendszerint . h fjlban helyezzk el, deszksg szerint .m fjlban is trolhatjuk. Ez rendszerint kisebb projektekben fordul el .

466

Osztlyok

Megjegyzs Az NSObject a legtbb Objective-C osztly gykrosztlya . Az osztly alap interfszt definilja, s tartalmazza azokat a kzs metdusokat, amelyeket minden osztly rklhet. Az Nsobject biztostja a standard memriakezelsi s -inicializlsi keretrendszert, amelyet az Objective-C nyelvben a legtbb osztly alkalmaz, valamint a reflexit s a tpusmveleteket is.

Egy tipikus nzetvezrl (view controller) osztlyban az osztly a urviewcontrolle r osztlytl rkl, mint pldul a kvetkez pldban: @interface Helloworldviewcontroller : urviewcontroller {
}

@implementation
A fej lcfjlban deklarlt osztly megvalstshoz az @ l ement at i on fordtdirektiv t imp kell hasznlnunk a kvetkezkppen: #impo r t "Someclass . h" @ mplementation someclass i @ end Ezt egy klnll fjlban kell megtennnk, nem a fejlcfjlban. Objective-C esetn az osztlyunkat . m fj lban definiljuk. Az osztlydefinci az @ fordtdirektiv val fejeend zdik be.

Megjegyzs Mivel a deklarcit .m fjlban is elhelyezhetjk, az .m fjlunkban

mind az @interface, mind pedig az @ mpl ementation direktvt megtallj uk. i

~ J

@class
Ha az osztlyunk egy msik fj lban definilt osztlyra hivatkozik, akkor ennek a fjlfejlcfjljt importlunk kell, mieltt az osztlyt hasznlhatnnk Nzzk meg a kvetkez pldt, amelyben kt osztlyt definiltunk: a Someclass s az Anat herel as s osztlyt. Ha az Anath e rcl as s pldnyt hasznljuk a somecl ass osztlybl, importlnunk kell az Anathercl ass. h fj lt, ahogy a kvetkez kdrszletben:

467

D fggelk: Objective-C gyorstalpal

/1---someclass-h--#import <Foundation/Foundation-h> #import "Anotherclass_h" @interface someclass : NSObject //---an object from Anotherclass--Anotherclass *anotherclass;

@end 1/---Anotherclass.h--#import <Foundation/Foundation.h> #import "someclass.h" @interface Anatherclass


}

NSObject {

@end

m ha az Anatherel ass osztlyban a someclass pldnyt szeretnnk ltrehozni, akkor nem importlha~uk a someclass. h fjlt az Anatherel ass osztlyban a kvetkezkppen:
/1---someclass.h--#import <Foundation/Foundation .h> #import "Anotherclass.h" @interface someclass : NSObject { Anatherclass *anotherclass;

@end /1---Anotherclass.h--#import <Fo undation /Foundation .h> #import "someclass.h" //---cannot simply import here--@interface Anatherclass : NSObject { someclass *someclass; //---using an instance of someclass---

@end Ez krkrs belefoglalshoz vezet. Ennek megelzsre az Objective-C a @c l ass fordtdirekvt hasznlja elrevetett deklarciknt, amely rtesti a fordtt arrl, hogy a meghatrozott osztly rvnyes. Rendszerint a @cl ass fordtdirekvt hasznljuk a fejlcfjlban, s a megvalsrsi fjlban az @import fordtdirektva alkalmazsval adunk t bvebb informcikat a fordtnak a hasznland osztly tartalmval kapcsolatban.

A @class fordtdirekvval a program a

kvetkezkppen

nz ki:

468

Osztlyok /1---Someclass.h--#import <Foundation/Foundation.h> @class Anotherclass; //---forward declaration--@interface Someclass : NSObject { Anatherclass *anotherclass;
}

@end /1--- Anotherclass.h --#import <Foundation/Foundation.h> @class someclass; //---forward declaration--@i nterface Anatherclass : NSObject { someclass *someclass;
}

@ end

Megjegyzs Az deklarci lehetsges hasznlatnak msik emltsre mlt oka, hogy cskkenti a fordtsi idt, mivel a fordtnak nem kell bejrnia olyan sok belefoglalt fejlcfjlt s azok belefoglalt fjljait.

elrevetett

~
ll

Osztly pldnyostsa
Egy osztly pldnynak ltrehozshoz rendszerint az a ll oc kulcssz jektum szmra, majd visszaadjuk az osztlytpus vltozjnak: someclass *someclass
=

(bvebb

inform-

cikat a Memory Management rszben tallunk) segtsgvel foglalunk memrit az ob-

[Someclass al l oc];

Az Objective-C nyelvben egy objektum deklarcijakor az objektum nevben prefixumknt a


* karaktert kell hasznlnunk. Ha primitv tpus (pldul fl oat, i nt, CGRect, NSintege r s gy tovbb) vltozt deklarlunk, a* karakter hasznlata nem szksges. Nhny plda: CGRect frame; i nt number; NSString *str //---CGRect is a structure--/l---i nt is a primitive type--/1---NSSt ring is a class

A visszatrsi osztlytpus meghatrozsa mellett az i d tpust is alkalmazhatjuk a kvetkezkppen:

469

D fggelk: Objective-C gyorstalpal

id someclass; [Someclass alloc]; id st r; Az i d tipus azt jelenti, hogy a vltoz brmilyen objektumtipusra hivatkozhat, ezrt a program a * karaktert impliciten alkalm azza.

Mezk
A mezk az objektumok adattagjai. A kvetkez kd pldul bemuta~a, hogy a somecl ass hrom mezvel rendelkezik: az anatherel ass, a rate s a name mezkkel: #import <Foundation/Foundation.h> @class Anotherclass; @interface someclass : NSObject { Anatherclas s *anot herclass; fl oat rate; NSStri ng *name;
}

@end

Hozzfrsi jogosultsgok
Alaprtelmezs szerint minden mez hozzfrsi jogosultsga @protected. m a hozzfrsi jogosultsg lehet @pub l i c vagy @p ri vat e is. A kvetkez lista a klnbz hozzfrsi jogosultsgokat muta~a be: @private- csak azon osztly szmra lthat, amely deklarlta, @publ i c- minden osztly szmra lthat, @protected - csak azon osztly szmra lthat, amely deklarlta, valamint az osztlyok szmra.

rkl

Ha az elz rszben bemutatott plda felhasznlsval egy msik osztlyban, pldul az Anatherel ass osztlyban, megprblunk hozzfrni a someclass mezihez, nem ltjuk a
mezket:

someclass *someclass; [Someclass alloc]; someclass->rate; 5; //---rate is declared protected--someclass->name ; @"Wei-Meng Lee"; //---name is declared protected---

470

Osztlyok

Megjegyzs Az osztlyban a
hasznljuk.

mezk kzvetlen hozzfrshez a - > opertort

Ha szeretnnk a rate s a name mezket az osztlyon kvllthatv tenni, mdostsuk a some cl ass. h fjlt, s adjuk hozz a @publ i c fordtdirektiv t:
#import <Foundation/Foundation.h> @class Anot herclass; @interface someclass : NSObject { Anatherclass *anotherclass; @ publ ic float rate; @ publ ic NSString *name;
}

@end

kvetkez

kt utasts mr rvnyes:
//---rate is declared protected--1/---name is declared protected---

someclass->rate = 5; someclass->name = @"Wei-Meng Lee";

Jllehet kzvetlenl hozzfrhetnk a mezkhz, ha gy tesznk, az objektumorientlt programozs egysgbezrsi szablynak tervezsi elvei ellen vtnk. Jobb mdszer, ha tulajdonsgok formjban egysgbe zrjuk a kiemelend kt mezt. (Tovbbi rszletek a fggelk Tulajdonsgok cm rszben tallhatk.)

Metdusok
A metdusok vagy ms nven tagfggvnyek olyan fggvnyek, amelyeket egy osztlyban definilunk. Az Objective-C a metdusok kt tpust tmoga~a: a pldnymetdusokat s az osztlymetdusokat. A pldnymetdusokat kizrlag az osztly egy pldnynak a hasznlatval hvhatjuk. A pldnymetdusok prefixurna amnuszjel (-) karakter. Az osztlymetdusokat meghvha~uk kzvetlenl az osztly nevnek a segtsgve!, s mkdskhz nem szksges az osztly egy pldnya. Az osztlymetdusok prefixurna a pluszjel(+) karakter.

471

D fggelk: Objective-C gyorstalpal

Megjegyzs Nhny programozsi nyelvben, pldul a C# s a Java nyelvben az osztlymetdusok statikus metdusknt ismertek.

A kvetkez programkdpldban a someclass osztlyt hrom pldnymetdussal s egy osztlymetdussal deklarljuk


#import <Foundation/Fou ndation .h> @class Anotherclass; @i nterface someclass : NSObject Anatherclass *anotherclass; float rate; NSString *name;
}

//---instance methods---(void) dosomething; -(void) dosomething:(NSString *) str; -(void) dosomething:(NSString *) str withAnotherPara:(float) value ; //---class method--+(void) alsooosomething; @e nd

kvetkez

kd bemutatja a fejlcfjlban deklarlt metdusok implementcijt:

#import "someclass.h" @implementation someclass -(void) dosemething { //--- implementation here --}

-(void) dosomething:(NSString *) str { //---implementation here---(void) doSomething:(NSString *) str wit hAnotherPara: (float) value { //---impleme ntation here- -+(void) alsooosomething //---implementation here ---

@end

472

Osztlyok

A hrom pldnymetdus meglvshoz elszr ltre kell hoznunk az osztly egy pldnyt, majd az elksztett pldny segtsgvel hvhatjuk a metdusokat:
someclass *someclass = [Someclass al loe]; [someclass dosomething]; [someclass dosomething :@" some text"] ; [someclass dosomething: @ "some text" withAnotherPara:9.0f];

Az osztlymetdusokat az osztly nevnek hasznlatval kzvetlenl hvhatjuk


[Someclass alsooosomething];

ltalban akkor hozunk ltre pldnymetdusokat, amikor olyan mveleteket kell vgrehajtanunk, amelyek az osztly meghatrozott pldnyhoz (vagyis az objektumhoz) kapcsoldnak. Ttelezzk fel pldul, hogy defmiltunk egy osztlyt, amely egy alkalmazott informciit kpviseli. Kiemelhernk egy pldnymetdust, amely lehetv teszi, hogy kiszmoljuk az alkalmazott tlrabrt. Ebben az esetben pldnymetdust hasznlunk, mert a szmtshoz a meghatrozott alkalmazott objektumra vonatkoz, specifikus adataira van szksg. Msrszrl az osztlymetdusokat rendszerint segdmetdusok definilsra hasznljuk. Elkszthetjk pldul a Getove rt imeRate: osztlymetdust, amely a tlrk radjt adja vissza. Mivel minden alkalmazott ugyanazt a djat kapja a tlri utn (ttelezzk fel, hogy cgnknl ez a helyzet), nincs szksg pldnymetdusok ltrehozsra, gy egyetlen osztlymetdus elegend. A kvetkez rsz bemutatja, hogyan lehet vltoz szm paramterrel metdusokat hvni.

zenetklds (metdusok hivsa)


Az Objective-C nyelvben metdus hvshoz a
[object method];
kvetkez

szintaxist alkalmazzuk:

Az Objective-C nyelvben tulajdonkppen nem hvjuk a metdusokat, hanem zenetet kldnk egy objektumnak. Az objektumnak tadott zenetet az alkalmazs futsidben oldja fel, ezt a nyelv nem a fordtsi id sorn hajtja vgre. Ezrt a fordt nem akadlyozza meg, hogy futtassuk a programot, mg akkor sem, ha vletlenl helytelenl rtuk le a metdus nevt. m megprbl figyelmeztetni arra, hogy a clobjektum nem felttlenl vlaszol az zenetnkre, ugyanis a clobjektum egyszeren figyelmen kvl hagyja az zenetet. A D. t. bra a fordt figyelmeztetst mutatja be. Lthat, hogy a UIA l ertview inicializlsnak egyik paramtert hibsan rtuk (a cancelButtonsTitle : helyett a cancelButtonTitle : lenne a megfelel).

473

D fggelk: Objective-C gyorstalpal

Megjegyzs A knnyebb rthetsg kedvrt a "metdus hvsa" fogalmat hasznljuk, s ezzel hivatkazunk az Objective-C zenetkldsi mechanizmusra.

-( !8Act1on) but tonC!icl<ed: ( 1d) -

r{

UIAi ertYtev *ol ert [[UIA. Iertv tew at loe ] tnitWt thht le:I!"Actlon tnvotecW' aessoge: e~eutton cltckedl"

de tejjOte: ett
CO'lCe l&Jt tons Ti t l e : @.. tw ot.ller1luttonl\tlu: nl l) ;l

""*'t.a9H

wunM'II; IlO

' - butWilhTitlot:Mus~lepte:QfKellut'tCM.sTide::~v.co.Tttk.s'

Wlthout .1 ~ruorchng

f'ftlll'thod s.gMtUt

"l be usumed lo

..._lhod fauftd
~nU .)

r~t11'1Cf'

Md ecpt _ . u

D. l. bra

Az

elz

rsz pldjban a dosomethi ng metdus nem rendelkezik paramterrel:

-(void) dosomething { //---implementation here---

Ezrt a metdust a

kvetkezkppen

hvhatjuk:

[someclass dosomething];

Ha egy metdusnak egy vagy tbb bemenere van, a metdust a hvhatj uk:
[object method:inputl]; [object method:inputl andsecondinput:input2];

kvetkez

szintaxissal

//--- one input- -/1---two inputs---

Az Objective-C nyelvvel kapcsolatban rdekessget jelent az, hogy hogyan hvunk egy
tbb paramterrel
rendelkez

metdust. A korbbi plda felhasznlsval:

-(void) dosomething:(NSString *) str withAnotherPara:(float) value { //---implementation here---

Az

metdus neve dosomethi ng :wi thAnotherPara: . A metdusok nevt meg kell jegyeznnk, s meg kell klnbztetnnk azokat, amelyek rendelkeznek paramterekkel, azoktl, amelyek nem. A dosomethi ng pldul paramterrel nem rendelkez metdus, rrg a do somethi ng: egy paramterrel, a dosomethi ng: withAnotherPara: pedig kt paramterrel rendelkezik. A rnetdus nevben a kettspon tok jelenlte vagy hinya jelzi, hogy a program melyik metdust hvja meg futsidben. Ennek akkor van jelentsge, ha metdusneveket argumentumknt adunk t, klnsen a @se l ector (a rszleteket lsd albb) jells hasznlatakor, arnikor delegltnak vagy rtestsi esemnynek adjuk t ket.

elz

474

Osztlyok

Mint azt a
NSString *str

kvetkez
=

plda mutatja, a metdushvsok begyazhatk:

[[NSString alloc] initWithString:@"Hello world"];

A pldban elszr az NSStri ng osztly a ll oc osztlymetdust hvjuk, majd az all oc metdustl visszarkez eredmny initwithstring: metdust, amely id tpus. Ez generikus C tpus, amelyet az Objective-C tetszleges objektum szmra hasznl. Hrom szintnl mlyebb begyazs rendszerint nem tancsos, mert hromnl tbb szint alkalmazsval a programkd nehezen olvashat.

Tulajdonsgok
A tulajdonsgok (property) lehetv teszik, hogy az osztlyunk mezit (tagvltozit) kzztegyk, s gy szablyozhatjuk az rtkek belltst, illetve lekrdezst. A korbbi pldban (lsd a Hozzfrsi jogosultsgok cm rszben) lttuk, hogy a -> opertorral kzvetlenl hozzfrnk egy osztly mezihez. m ez nem eszmnyi megolds, idelis esetben a mezinket tulajdonsgok formjban kellene kiemelnnk. Az Objective-C 2.0-s verzija eltt a programozknak a kvetkezkppen kellett deklarlniuk a metdusokat, hogy a mezket a tbbi osztly szmra hozzfrhetv tegyk:
#import <Foundation/Foundation . h> @class Anotherclass; @i nterface someclass : NSObject { Anatherclass *anotherclass; float rate; NSString *name;
}

//---expose the rate field--- (fl oa t) rate; -(void) setRate:(float) value; //---expose the name field---(NSString *) name; -(void) setName:(NSString *) value; @end

//---get the value of rate--/1---set the value of rate

//---get the value of name--1/---set the value of name---

Ezek a metdusok getter (lekrdez) s setter (befft) nven ismertek (nha accessor s mutator nven is emltik ket). Megvalsts uk a kvetkezkppen trtnik:

475

D fggelk : Objective-C gyorstalpal

#import "Someclass.h " @implementation someclass -(float) rate { return rate;


}

-(void) setRate:(float) value { rate = value;

-(NSString *) name { return name;


}

-(void) setName:(NSString *) value { [value retain]; [name release]; name = value;


}

@e nd A tulajdonsgok rtkeinek belltshoz a set kulcssz prefixummal elltott metdusait kell meglvni: Someclass *sc= [[someclass alloc] init]; [sc setRate:S.Of]; [sc setName:@"Wei - Meng Lee"]; Illetve hasznlhatjuk az Objective-C 2.0-s jdonsgt, a pontjellst: someclass *sc = [[someclass al l oc] init]; sc. rate = 5; sc.name = @"Wei-Meng Lee"; A tulajdonsgok rtkeinek beolvasshoz vagy kzvetlenl a metdusokat kelllvnunk, vagy az Objective-C 2.0-s verzijban a
pon~ellst

alkalmazhatjuk:

NSLog([sc name]); //--- call the method--NSLog(sc.name); //--- dot notation Ha szeretnnk egy tulajdonsgot rsvdett tenni, csak el kell tvoltanunk a set kulcssz prefixummal elltott metdust. A setName: metdusban klnbz utastsok hasznljk a retain s a release kulcsszavakat. Ezek a kulcsszavak az Objective-C memriakezelshez kapcsoldnak (a kulcsszavakrl
bvebben

lsd albb).

476

Osztlyok

Az Objective-C 2.0-s verzijban a mezk tulajdonsgknt val kiemelshez nem kell getter s setter metdusokat definilni. Ezt a @property s a @synthesi ze forclitdirektvkkal is elvgezhetjk. Ugyanebben a pldban a kvetkezkppen emelhetjk ki tulajdonsgknt a rate s a name mezket a @property direktva hasznlatval:
#import <Foundation/Foundation.h> @class Anotherclass; @interface someclass : NSObject { Anatherclass *anotherclass; float rate; NSString *name;
}

@property float rate; @property (retain, nonatomic) NSString *name; @end

Az els @property utasts tulajdonsgknt definilja a rate mezt. A msodik utasts szintn tulajdonsgknt definilja a name mezt, de meghatrozza a tulajdonsg viselkedst is. Ebben az esetben a viselkedst retai n s nonatomic tulajdonsgok szablyozzk (ezeket lsd a fejezet ksbbi, memriakezelssel kapcsolatos rszben). A non atomi c azt jelenti, hogy a tulajdonsghoz nem lehet szlbiztos mdon hozzfrni. Ez teljesen rendben van, ha nem tbbszl alkalmazsokat ksztnk. Rendszerint a retai n s a nonatomi c lehetsgek kombincijt hasznljuk a tulajdonsgok deklarcija sorn. A megvalsrsi fjlban ahelyett, hogy getter s setter metdusokat definilnnk, egyszeren a @synthesi ze kulcsszval r vesszk a fordt t, hogy au tomatikusan ksztse el a getter s setter metdusokat:
#import "someclass.h" @implementation someclass @synthesize rate, name; @end

Egyetlen @synt hesi ze kulcsszval tbb tulajdonsgot kombinlhatunk m nll utastsokra is elklnthe~k ket:
@synthesize rate; @synt hesize name;

477

D fggelk: Objective-C gyorstalpal

Ekkor a megszokott mdon

hasznlha~uk

a tulajdonsgainkat:

//---setting using setRate--[sc setRate:S.Of]; [sc setName:@"wei-Meng Lee"]; //---setting using dot notation--sc.rate =5; sc.name = @"Wei-Meng Lee"; /1---getting--NSLog([sc name] ); //---using the name method NSLog(sc.name); //---dot notation

Ha szeretnnk egy tulajdonsgot rsvdett tenni, a readonly kulcsszt kell hasznlnunk. A kvetkez utasts rsvdett teszi a name tulajdonsgot:
@property (readonly) NSString *name;

lnicializtorok
Amikor egy osztly pldnyt elksz~k, rendszerint ugyanakkor inicializljuk is. Pldul az elz pldban (az Osztlyok pldnyostsa crn rszben) az albbi utasts szerepelt:
someclass *sc
=

[[someclass alloc] init];

Az all oc kulcssz lefoglalja az objektum szmra a memrit, s amikor a program viszszaadja az objektumot, az alkalmazs ennek inicializlshoz az objektumorr meghvja az init metdust. A someclass osztlyban nem definiltunk init nev metdust. Honnan szrmazik ez esetben az init metdus? Valjban az NSObject osztly definilja, amely az Objective-C nyelvben a legtbb osztly alaposztlya. Az i ni t metdus inicializtorknt ismert. Ha tovbbi inicializtorokat szeretnnk ltrehozni, olyan metdusokat kszthetnk, amelyek az i ni t szval kezddnek. (Az i ni t sz hasznlata inkbb mintnak szmt, nem kbe vsett szably.)
#import <Fou ndation/Foundation.h> @class Anotherclass; @interface someclass : NSObject { Anatherclass *anotherclass ; float rate ; NSString *name;

478

Osztlyok -(void) -(void) - (void) +(void) dosomething; dosomething:(NSString *) str; dosomething:(NSString *) str withAnotherPara :(float ) value; alsooosomething;

- (id)initWithName:(NSString *) n; - (id)initWithName:(NSString *) n andRate:(float) r; @property float rate; @ property ( retain, nonatomic) NSString *name; @ end

Az

elz

wi th Name: andRate:. A

plda kt tovbbi inicializtort tartalmaz: ezek az i ni twi th Name: s az i ni tk ve tkezkppen biztostha~uk a kt inicializtor megvalstsait:

#import "someclass . h" @implementation someclass @synthesize rate , name; - (id)initwithName:(NSString *) n { return [self initwithName:n andRate:O.Of];
}

- (id)initwithName:(NSString *) n andRate:(float) r { if (self = [super init]) { self.name = n; self.rate = r;


}

return self;
}

-(void) dosomething { } -(void) dosomething:(NSString * ) str { } -(void) dosomething:(NSString *) str withAnotherPara:(float) value { } +(void) alsooosomething { } @ end

479

D fggelk: Objective-C gyorstalpal

Az initwithName:andRate: inicializtor megvalstsban elszr a super (alap)osztly i ni t inicializtort hvjuk, hogy az alaposztlynak megfelel inicializlsrl gondoskodjunk, erre az aktulis osztly inicializlsa eltt van szksg:
- (id)initWithName : (NSString *) n andRate:(float) r if (self ; [super init]) // .. . // .. . return self;

Az inicializtorok definilsnak a szablya rendkvl egyszer. Ha az osztlyt megfelel en inicializl tuk, a self hivatkozsr (teht az i d tpus t) kell visszaadnia. Ha az inicializls sikertelen, a visszaadott rtk ni l. Az i ni twi th Name: inicializtor megvalstsakor az i ni twi th Name: andRate: inicializtort hvja:
- (id)initWithName :(NSString *) n return [self initWithName:n andRate:O.Of];

ltalban, ha tbb olyan inicializtorral rendelkeznk, amelyek mindegyike klnbz paramterekkel dolgozik, rdemes ket lncolnunk gy, hogy biztostsuk egyetlen inicializtort hvjanak, amely vgrehajtja a szuperosztly i ni t inicializtornak a hvst. Az Objective-C nyelvben az az inicializtor, amely elvgzi a szuperosztly i ni t inicializtornak a hvst, a kijellt (designated) inicializtor.

Megjegyzs ltalnos szably, hogy az a kijellt inicializtor, amely a legtbb paramterrel rendelkezik.

Ha szeretnnk az inicializtorokat hasznlni, most mr a pldnyostskor is hvha~uk ket


Someclass *scl someclass *sc2 [[someclass al loe] initWithName:@"wei-Meng Lee" andRate:35]; [[Someclass alloc] initWithName:@"wei-Meng Lee"];

480

M emriakezels

Memriakezels
Az Objective-C programozsban (klnsen az iPhone esetben) a memriakezelst minden iPhone-fejlesztnek ismernie kell. Ms npszer nyelvekhez hasonlan az Objective-C trnoga~a a szemtgyjtst, amely segt eltvoltani a hasznlaton kvli objektumokat, arnikor azok kikerlnek a program hatkrbl, s gy jrahasznosthat memrit szabadt fel. Mivel azonban a szemtgyjts megvalstsa hatalmas tbbletkltsget jelent, az iPhone nem tmogatja. Ezrt a fejlesztre hrul a feladat, hogy manulisan lefoglalja az objektumok szmra a memrit, majd felszabadtsa, ha mr nincs r szksg. Ebben a rszben a memriakezels klnbz szempontjait vizsgljuk meg az iPhone-on.

Referenciaszmlls
Az objektumok szmra lefoglalt s felszabadtott memria kezelshez segtsgknt az iPhone OS a rr:ftrr:nciaszmlls rendszervel kveti nyomon az objektumokat annak meghatrozshoz, hogy mg mindig szksg van-e rjuk, vagy mr megszabadulhatunk tlk. A referenciaszmlls gyakorlatilag minden objektum szmra egy szmllt hasznl, s az objektumok ltrehozsakor a szmll rtke 1-gyel nvekszik. Ha a program az objektumot elengedi, a szmll rtke 1-gyel cskken. Amikor a szmll rtke elri a O-t, az objektumhoz tartoz memriaterletet az opercis rendszer visszakveteli magnak. Az Objective-C nyelvben a memriakezelshez nhny fontos kulcssz tartozik.

a lloc
Az a ll oc kulcssz foglalja le a memrit az ltalunk ksztett objektum szmra. A knyv szinte valamennyi pldjban lthattuk ezt a kulcsszt. Pldul: NSStri ng *str
=

[[NSStri ng al loe] initWithstring:@"Hello"];

Ebben a pldban egy N tri ng objektumot ksztnk, s egy alaprtelmezett sztringgel SS pldnyos~uk. Amikor az objektum elkszlt, az objektum referenciaszmllja 1. Mivel mi ksztettk, a mi felelssgnk, hogy felszabadtsuk a lefoglalt memrit, ha mr nincs szksgnk az objektumra.

Megjegyzs Az objektumok elengedsvel kapcsolatban tovbbi rszleteket

a re l ease-rl szl rszben tallunk.

481

D fggelk: Objective-C gyorstalpal

Hogyan tudjuk megllaptani, hogy egy objektumnak van-e tulajdonosa, s ki az? meg a kvetkez pldt: NSString *str ; [[NSString alloc] initWithString:@"Hello"]; NSString *str2 ; str;

zzk

Itt az all oc kulcsszt hasznljuk az st r esetn, teht az st r a rnink. Ezrt neknk kell az objektumot elengednnk, amikor mr nincsen r szksgnk. Az str2 azonban egyszeren egy str objektumra mutat, teht az str2 nem hozznk tartozik, ez azt jelenti, hogy nem neknk kell az st r 2 objektumot elengedni, arnikor mr nem hasznljuk.

new
Azonkvl, hogy az alloc kulcsszval foglalunk memrit egy objektum szmra, a new kulcsszt is hasznlhatjuk a kvetkezkppen: NSString *str; [NSString new]; A new kulcssz funkcionlis szempontbl
egyenrtk

az albbi utastssal:

NSString *str ; [[NSString al l oc] init]; Az a ll oc kulcsszhoz hasonlan a new kulcssz hasznlatakor az objektum a mi tulajdonunkba kerl, ezrt a mi feladatunk elengedni, ha mr nincs r szksg.

retain
A retai n kulcssz az objektum referenciaszmlljnak az rtkt 1-gyel nveli. Vizsgljuk meg az elz pldt: NSString *str ; [[NSString alloc] initWithstring :@" Hello "]; NSString *str2 ; str; Az str2 objektumot nem birtokoljuk, mert az objektumon nem hasznljuk az alloc kulcsszt. Ha az st r objektumot elenged jk, az str2 rvnytelenn vlik.

Megjegyzs Hogyan kell az st r 2 objektumot elengedni? A program automatikusan elengedi. Tovbbi informcikat a Knyelmifggvnyeks az autorelease" cm rszben tallunk.

Haszeretnnk biztostani, hogy az str2 akkor is a rendelkezsnkre lljon, ha az str objektumot elenged jk, a retai n kulcsszt kell alkalmaznunk

482

Memriakezels NSStr i ng *st r = [ [NSStri n g a ll oc] i ni twi t hStr i n g: @ ll o" ] ; "He NSString *str2 = str; [str2 retai n]; [str release];

Az elz esetben az str referenciaszmlljnak rtke mr 2. H a elengedjk az str objektumot, az str2 rvnyes marad. Amikor mr nincsen szksgnk az str2 objektumra, manulisan kell elengednnk

Megjegyzs ltalnos szably, hogy {az alloc vagy a retain kulcssz alkalmazsval) egy objektum tulajdonosaiknt a mi feladatunk az elengedse.

release
Amikor vgeztnk egy objektummal, a re l eas e kulcssz hasznlatval manulisan el kell engednnk:
NSString *str
=

[[NSString al loe] ini tWithString: @ "Hello"];

// ... do what you want with the object . . . [str release];

Amikor egy objektumon a release kulcsszt alkalmazzuk, az objektum referenciaszmlljnak rtke 1-gyel cskken. Ha a szmll rtke elri a O-t, az objektumhoz tartoz memriaterletet a program elengedi. A re l eas e kulcsszval kapcsolatban rendkivl fontos szem pont, hogy nem engedhetnk el olyan objektumot, amely nem a rni tulajdonunk. Nzzk meg pldul az elz rsz pldjt:
NSString *str = [[NSString alloc] initWithString:@"Hello"]; NSString *str2 = str; [str release]; [str2 release]; //---this is not OK as you do not own str2---

Ha megprbljuk elengedni az str2 objektumot, futsidej hibt kapunk, ugyanis nem engedhetnk el olyan objektumot, amelyet nem rni birtokolunk. Ha a re ta i n kulcssz alkalmazsval megszerezzk az objektum tulajdonjogt, hasznlnunk kell a re l eas e kulcsszt:
NSString *str = [[NSString alloc] initWithstring :@" Hello"]; NSString *str2 = str; [st r 2 re ta i n] ; [st r rel eas e]; [str2 release]; //---this is now OK as you now own str2---

483

D fggelk: Objective-C gyorstalpal

A tulajdonsgokat ismertet rszben definiltuk a setName: metdust, ahol bellitottuk a name mez rtkt: -(void) setName:(NSString [value retain]; [name release]; name = value;
}
Elszr

*)

value {

megtartottuk a value objektumot, majd elengedtk a name objektumot, s vgl a name objektumhoz rendeltk a va l ue objektumot. Krds, rnirt kell ezt tennnk ahelyett, hogy a kvetkezket hasznlnnk -(void) setName:(NSString name = value;
*)

value {

Ha szemtgyjtst hasznlnnk, az elz utasts rvnyes lenne. Mivel azonban az iPhone OS nem tmoga~a a szemtgyjtst, ezrt az elz utasts hatsra az eredeti objektum, amelyre a name objektum hivatkozik, elveszne, s ez memriaszivrgshoz vezetne. A szivrgs megelzshez elszr meg kell tartanunk a va l ue objektumot, s jeleznnk kell, hogy igny tartunk a tulajdonjogra; majd el kell engednnk az eredeti objektumot, amelyre a name hivatkozik. Vgl a va l ue objektumot a name objektumhoz rendeljk: [value retain]; [name re l ease] ; name = value;

A REFERENCIASZMLLS MEGVILGTSA ANALGfVAL


A referenciaszmllssal mkd memriakezels vizsglatakor rdemes a val letbl szrmaz analgia segtsgvel a megfelel megvilgtsba helyezni a tmakrt. Kpzeljnk el a knyvtrban egy szobt, amelyet tanulsi clokra lefoglalhatunk Kezdetben a szoba res, ezrt a lmpk nem vilgtanak. Arnikor lefoglaljuk a szobt, a knyvtros nveli egy szmll rtkt, amely jelzi, hogy a szobt hny ember hasznlja. Ez az annak az analgija, arnikor az alloc kulcsszvalltrehozunk egy objektumot. Amikor elhagyjuk a szobt, a knyvtros cskkenti a szmllt, s ha ennek az rtke O lesz, akkor ez annyit jelent, hogy a szobt nem hasznlja senki, s a lmpkat le lehet kapcsolni. Ez ahhoz hasonlatos, amikor a re l ease kulcsszval elengednk egy objektumot. Elfordulnak alkalmak, arnikor lefoglaljuk a szobt, s csak egymagunk ldglnk benne (teht a szmll rtke 1), egszen addig, amg egy bartunk meg nem jelenik. Lehet, hogy csak bennnket ltogat meg, ezrt nem jelentkezik be a knyvtrosnl, gy a szmll rtke nem nvekszik. Mivel csak ltogatba jtt, s nem foglalta le a szobt, ezrt nincs joga eldnteni, hogy a lmpk vilgtsanak-e, vagy le kell kapcsoini ket. Ez

484

Memriakezels

annak az analgija, amikor egy objektumot az all oc kulcssz alkalmazsa nlkl rendelnk egy msik vltozhoz. Ha ekkor elhagyjuk a szobt (elengedjk), a knyvtros lekapcsolja a villanyt, s a bartunknak is tvoznia kell. Gondoljunk vgig egy msik helyzetet, amelyben a szobt hasznljuk, majd valaki ms szintn lefoglalja s megosztja velnk. Ekkor a szmll rtke 2. Ha elhagyjuk a szobt, a szmll rtke 1-re cskken, de a lmpk tovbbra is vilgitanak, mert a msik szemly a szobban marad. Ez hasonlt ahhoz a helyzethez, amikor ltrehozunk egy objektumot, s msik vltozhoz rendeljk, amely a retain kulcsszt alkalmazza. Ebben a helyzetben az objektumot a program csak akkor engedi el, ha mindkt objektum elengedi.

Knyelmi fggvnyek s az autorelease


Eddig arrl volt sz, hogy minden objektum, amelyet az alloc vagy a new kulcsszval ksztnk, a mi birtokunkba kerl. Vizsgljuk meg a kvetkez esetet:
NSString *str
=

[NSString stringWithFormat:@"%d", 4];

Ebben az utastsban az str objektum nincs a birtokunkban, ugyanis az objektumot az egyik kbryelmi fiiggv'!J (convenience method) alkalmazsval hozzuk ltre. Ezek statikus metdusok, amelyekkel kzvetlenl alloklhatunk s inicializlhatunk objektumokat. Az elz esetben ltrehozunk egy objektumot, de az nincs a tulajdonunkban, ezrt kzzel nem tudjuk elengedni. Valjban az ezzel a metdussal elksztett objektumok au/orelease, vagyis nmagukat automatikusan felszabadt objektumok. Minden autore/ease objektum ideiglenes, amelyet egy erre a clra kialaktott gyjthely, az autore/ease pool trol. Amikor az aktulis metdus kilp, minden objektumot, amelyet a metdus magban foglalt, a program elenged. Az autorelease objektumok olyankor hasznosak, ha csupn nhny tmeneti vltozt szeretnnk hasznlni, s nem szeretnnk a sajt dolgunkat foglalsokkal s felszabadtsokkal nehezteni. Az alapvet klnbsg az a ll oc (vagy a new) kulcssz segitsgvel elkszlt objektumok s a knyelmi fggvnyekkelltrehozott objektumok kztt a tulajdonjog:
NSString *strl = [[NSString al loe] initWithFormat:@"%d", 4]; [strl release]; //---this is ok because you own strl--NSString *str2 = [NSString stringwithFormat:@"%d", 4]; [str2 release]; //---this is not ok because you don't own str2--//---str2 will be removed automatically when t he autorelease pool i s activated---

Ha a knyelmi fggvny alkalmazsakor szeretnnk egy objektum tulajdonjogt megszerezni, a re ta i n kulcsszt hasznlhatj uk:
NSString *str2
=

[[NSString stringWithFormat:@"%d", 4] retain];

485

D fggelk: Objective-C gyorstalpal

Az objektum elengedshez az autore l eas e vagy a re l eas e kulcsszt alkalmazha~uk. A release kulcssz azonnal cskkenti a referenciaszmll rtkt 1-gyel, s a program azonnal felszabad* az objektum ltal foglalt memrit, amikor az referenciaszmll rtke elri a O-t. Ezzel ellenttben az autorelease kulcssz azt gri, hogy 1-gyel cskkenti a referenciaszmll rtkt, m nem azonnal, hanem valamikor ksbb. A kvetkez programkd ezt mutatja be:
NSString *str = [[NSString stringWithFormat:@"%d", 4] retain]; [str autorelease]; //you don't own it anymore; still available NSlog(str); //still accessihle for now

Megjegyzs Miutn automatikusan elengedtnk egy objektumot, tbbet mr nem kell elenged nnk.

Az
NSString *str2 = [NSString stringWithFormat:@"%d", 4];

utasts hatsa ugyanaz, mint a kvetkez utasts:


NSString *str2 =@"4";

Noha az autoreiease objektumok ltszlag megknnytik a dolgunkat a hasznlaton kvli objektumok automatikus elengedsvel, az objektumok alkalmazsakor nagyon krltekinten kell eljrnunk. Nzzk meg a kvetkez pldt:
for (int i=O; i<=99999; i++){ NSString *str = [NSString stringWithFormat:@"%d", i]; l l .. . ll .. .
}

A ciklus minden egyes ismtlshez NSString objektumot ksztnk. Mivel a program addig nem engedi el az objektumokat, amg a fggvny ki nem lp, elfordulhat, hogy elfogy a memria, mieltt az autorelease pool mkdsbe lphetne, s elengedhetn az objektumokat. A dilemma megoldsnak egyik mdja az autorelease pool hasznlata (lsd a kvetkez rszben).

486

Memriakezels

REFERENCIASZMLLS: AZ ANALGIA FOLYTATDIK


A knyvtri szoba analgijt folytatva kpzeljk el, hogy mt ppen kijelentkeznk a foglalssal a knyvtrosnl, amikor esznkbe jut, hogy a szobban hagytuk a knyveinket. Kzljk a knyvtrossal, hogy mt nincs szksgnk a szobta, s a foglals t lemond juk, de mivel a knyveinket a szobban felejtettk, megkrjk, hogy mg ne kapcsolja le a lmpkat, hogy visszamehessnk. Egy ksbbi idpontban a knyvtros tetszs szerint lekapcsolhatja a lmpkat. Mindez az autorelease objektumok viselkedst pldzza.

Autorelease Pool
Minden autorefease objektum ideiglenes objektum, amelyet az autorefease poof trol. Amikor az aktulis metdus kilp, minden objektumot, amelyet a metdus magban foglalt, a program elenged. m nha vezrelni szeretnnk az autorelease pool kirtst ahelyett, hogy arra vrnnk, hogy az opercis rendszer meghvja. Ennek rdekben a kvetkez kppen kszthetjk el az N SAutore l easePoo l osztly egy pldnyt: for (int i;Q; i<;99999; i++){ SAutorel easePool *pool ; [[NSAutorel easePool all oc] ini t ]; N NSString *strl; [NSString stringWithFormat:@"%d", i]; NSString *str2; [NSString stri ngWithFormat:@"%d", i]; NSString *str3; [NSString stringWithFormat:@"%d", i]; ll . . . ll . . . [poo l re l ease] ;

Ebben a pldban a ciklus minden egyes ismtlshez NSAutoreleasePool objektum kszl, s a ciklusban ltrehozott sszes autorefease objektum - strl, st r2, s str3 -ebbe kerl. Az egyes ismtlsek vgn a program elengeeli az NSAutore l easePoo l objektumot, gy a kd az objektumban foglalt objektumokat automatikusan elengedi. Ez biztostja, hogy egyszerre legfeljebb hrom autore/case objektum lehet egy idben a memriban.

dealloc
Megnz tk, hogy az a ll oc vagy a new kulcssz alkalmazsval az ltalunk ksztett objektumok a birtokunkba kerlnek. Azt is megvizsglruk, hogy a release vagy az autorel eas e kulcsszval hogyan engedhetjk el a birtokunkban lev objektumokat. Mikor a legalkalmasabb az id az objektumok elengedsre? Bevlt gyakorlat, hogy az objektumokat azonnal el kell engedni, mihelyst mr nincs szksg rjuk. Ha teht egy metdusban ltrehoztunk egy objektumot, az objektumot el kell engednnk, mieltt kilpnnk a metdusbl. A tulajdonsgok esetn a @property fordtdirekvt a re t ai n kulcsszval egytt hasznlhatj uk: @property (retain, no natomic) NSStri ng *name;

487

D fggelk: Objective-C gyorstalpal

Mivel a tulajdonsg rtkeit a program megrzi, fontos, hogy felszabadtsuk az objektumot, mieltt kilpnnk az alkalmazsbL Erre alkalmas hely egy osztly (pldul a nzetvezrl) de all oc metdusa lehet: -(void) dealloc { [self.name release]; [super dealloc];

//---release the name property---

Egy osztly dealloc metdusa akkor indul el, ha az objektumnak referenciaszmllja elri a O-t. Nzzk meg a kvetkez pldt: someclass *scl = [[Someclass al l oc] initwithName:@"Wei-Meng Lee" andRate:35]; l l . .. do somethi ng here ... [scl release]; //--- reference count goes to O; dealloc will be called--Az elz plda bemutatja, hogy amikor (a re l eas e utasts hivsa sorn) az sc l referenciaszmllja O-ra cskken, a program az osztlyban deftnilt de a ll oc metdust hivja. Ha az osztlyban nem definiljuk ezt a metdust, az alkalmazs az alaposztlyban rendelkezsre ll megvalsrst hivja.

Memriakezelsi tippek
Az iPhone-programozsban a memriakezelsre szmos eszkz ll a rendelkezsnkre, amelyekkel a memriaszivrgsokat ellenrizhetjk. A kvetkezkben megvizsglunk nhny egyszer lehetsget az alkalmazsunk mkdst rint memriaszivrgsok szlelshez. Elszr a nzetvezrlben gondoskodjunk a di dRecei veMemoryWarni ng metdus megvalstsrl: - (void)didReceiveMemorywarning { //---insert code here to free unused objects--[super didReceiveMemorywarning];
}

A program akkor hivja meg a di dRecei veMemorywarni ng metdust, amikor iP h one eszkznkn elfogy a memria. Ebben a metdusban kell programkdot elhelyezni, hogy felszabadtsuk azokat az erforrsokat/ objektumokat, amelyekre mr nincs szksgnk. Tovbb az app l i ca ti onDi dRecei veMemoryWarni ng: metdust is az alkalmazsdelegltunkban kell kezelnnk: - (void)applicationDidReceiveMemorywarning:(UIApplication *) application //---insert code here to free unused objects--[[Imagecache sharedimagecache] removeAllimagesinMemory];

488

Protokollok Ebben a metdusban le kell llitanunk a memriaintenzv mveleteket, pldul az audios videolejtszst. A memriban gyorsttrazort kpeket is el kell tvoltanunk.

Protokollok
Az Objective-C nyelvben a protokoff egy olyan programozsi interfszt deklarl, amelyet brmely osztly megvalsthat. A protokoll egy metduskszletet deklarl, s brmely, a protokollt hasznl osztly megvalstha~a a protokoll egy vagy tbb deklarlt metdust. A protokollt definil osztly vrhatan meghvja a protokollt megvalst osztlyban annak implementlt metdusait. A protokollok mkdst legknnyebben a UIAlertview osztly vizsglatval rthetjk meg. A UIA l ertview osztlyt rendkvl egyszeren hasznlhatj uk, ha ltrehozzuk egy pldnyt, s meghvjuk a show metdust: UIAlertview *alert

= [[UIAlertView alloc]
initWithTitle:@"Hello" message:@"This is an alert view" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

[al ert show];

Az elbbi programkd figyelemfelhv zenetet jelenti meg egy gombbal: "OK". Az OK gomb rintse automatikusan elutastja a figyelmeztetst. Ha tovbbi gombokat szeretnnk megjelenteni, az otherButtanTi t l es: paramter rtkt a kvetkezkppen llitha~uk be:
UIAlertview *alert [[UIAlertView alloc] initWithTitle :@"Hello " message:@"This is an alert view" delegate:self cancelButtonTitle: @"OK" otherButtonTitles:@"Option 1", @"Option 2", nil];

A figyelmeztetsi nzet ekkor hrom gombot jelent meg: az OK, az Option 1 s az Option 2 gombokat. De honnan lehet tudni, hogy a felhasznl melyik gombot rintette meg? Ezt azoknak a megfelel metdus(ok)nak a kezelsvel hatrozhatjuk meg, amelyeket a figyelmeztetsi nzet meghv, amikor a felhasznl megrinti a gombokat. Ezt a metduskszletet az UIAlertviewoelegate protokoll definilja. A protokoll a kvetkez metdusokat definilja:

489

D fggelk: Objective-C gyorstalpal alertView:clickedButtonAtindex: willPresentAlertView: didPresentAlertview: alertview:willoismissWithButtonindex: alertview:didoismisswithButtonindex: alertviewcancel:

Ha a UIAlertviewoelegate protokollban szeretnnk valamelyik metdust megvalstani, gondoskodnunk kell rla, hogy az osztlyunkat, ebben az esetben a View Controllert a protokollhoz illesszk. Egy osztlyt cscsos zrjelek (<>) segtsgvel a pen illeszthetnk egy protokollhoz: @interface usingviewsviewcontroller : urviewcontroller <UIAlertviewoelegate> { //---this class conforms to the UIAlertviewoelegate ll protocol--ll ...
}

kvetkezkp

l kellokat

Megjegyzs Ha egynl tbb deleglthoz szeretnnk illeszteni, akkor a protovesszvel kell elvlasztanunk, pldul: <UIAlertviewoelegate,

:l UITableviewoatasource>.

Miutn az osztlyt protokollhoz illesztettk, megvalsthatjuk benne a metdust. - (void)alertview: (UIAl ertview *)alertview clickedButtonAtindex:(NSinteger)buttonindex { NSLog([NSString stringWithFormat:@"%d", buttonindex]);

Deleglt
Az Objective-C nyelvben a deleglt pusztn egy olyan objektum, amelyet egy msik objektumhoz rendelnk azrt, hogy az esemnyeket kezelje. Tanulmnyozzuk a korbbi UIA l ertview pldt: UrAlertview *alert [[UIAlertview alloc] initWithTitle:@"Hello" message:@"This is an alert view"

490

Protokollok delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

A urA l ertvie w osztly inicializtora tartalmazza a de l egate paramtert. Ha a paramtert self rtkre lli~uk, akkor az aktulis objektum felels az urA l ertview osztly ezen pldnya ltal elindtott sszes esemny kezelsrt. Ha nem kell a pldny ltal indtott esemnyeket kezelnnk, a paramtert egyszeren ni l rtkre llthatjuk:
urAlertview *alert
=

[[UrAlertview alloc] initWithTitle:@"Hello" message:@"This is an alert view" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

Ha a figyelmeztet ablakban tbb gomb tallhat, s szeretnnk tudni, hogy a felhasznl melyik gombot rintette meg, kezelnnk kell a urAlertviewoelegate protokollban definilt metdusokat. Vagy ugyanabban az osztlyban valstjuk meg, mint amelyik a UIA l ertview osztlyt pldnyostotta (lsd az elz rszben), vagy az albbiak szerint j osztlyt hozunk ltre a metdus megvalstshoz:
/1---someclass.m--@implementation Someclass - (void)alertView:(UrAlertView *)alertview clickedButtonAtrndex:(Nsrnteger)buttonrndex { NSLog( [NSStri ng st ri ngwi thFormat: @"%d", buttonrndex]);
}

@end

Hogy a figyelmeztetsi nzet biztosan tudja, merre kell a metdust keresnie, hozzuk ltre a some cl ass egy pldnyt, s llitsuk be delegltkn t:
someclass *myDelegate urAlertview *alert
= =

[[Someclass alloc] init];

[[UrAlertview alloc] initwithTitle:@"Hello" message:@"This is an alert view" delegate:myoelegate cancelButtonTitle:@"OK" otherButtonTitles:@"Option 1", @"Option 2", nil];

[al ert show];

491

D fggelk: Objective-C gyorstalpal

Szelektorok
Az Objective-C nyelvben a szelektor (felector) nem ms, rnint egy olyan nv, amellyel kivlasztunk egy futtatand metdust egy objektum szmra. Segtsgvel egy fggvnyt azonosthatunk. A szelektor alkalmazst a knyv nhny fejezetben megfigyelhettk. Pldul:
//---create a Button view--CGRect frame= CGRectMake(lO, 50, 300, 50); UIButton *button = [UIButton buttonwithType:UIButtonTypeRoundedRect]; button.frame = frame; [button setTitle:@"click Me, Please!" forstate:urcontrolstateNormal]; button.backgroundcolor = [UIColor clearcolor]; [button addTarget:self action:@sel ector(buttonclicked:) forcontrolEvents:urcontrolEventTouchUpinside];

Az

elz

programkd egy UI Button objektum dinamikus megvalstst muta~a. A gomb

megrintsvel kivltott esemny kezelshez (pldul a Tou ch up In si de esemny esetn) a UI Button osztly addTarget: act i on: forcont ro l Events: metdust kell hivnunk: [button addTarget:self action:@selector(buttonClicked:) forcontrolEvents:urcontrolEventTouchUpinside]; Az act i on: paramter egy SEL (szelektor) pus argumentummal dolgozik. Az elz programkdban tadjuk a definilt metdus nevt - buttoncl i c ked: -, amelyet az osztlyban definilunk: -(IBAction) buttonclicked: (id) sender{

// ...

Msik lehetsg az, hogy SEL pus objektumot hozunk ltre, majd az NSSelectorFromStri ng fggvny segtsgvel pldnyos~uk (a fggvny bemen paramtere egy sztring, amely a metdus nevt tartalmazza): NSString *nameOfMethod = @"buttonclicked : "; SEL methodName = NSSelectorFromstri ng(nameofMethod);

Az addTarget: act i on: forcont ro l Events: metdus hivsa ekkor a


[button addTa rget : s el f action: m hodName et forcontrolEvents:urcontrolEventTo uchu pr nside];

kvetkezkppen

nz ki:

Megjegyzs Mivel az Objective-C a C kiterjesztse, gyakran tapasztalhatjuk,


hogy az Objective-C alkalmazsunkat C fggvnyek tarktjk. A C fggvnyek zrjelek O segtsgvel adjk t a paramtereknek az argumentumokat.

492

Kategrik

Ir

Megjegyzs A szelektor elnevezsekor hatrozzuk meg a metdus teljes nevt. Ha pldul a metdusnv egy vagy tbb paramtert tartalmaz, a kvetkezkppen kell( :) kettspontot hozzadnunk a szelektorban:

NSString *nameOfMethod ; @"someMethod:withParal:andPara2:";

Kategrik
Az Objective-C nyelvben a kategria lehetv teszi, hogy mr ltez osztlyhoz metdusokat adjuk anlkl, hogy alosztlyokat kellene ksztennk. A kategria segtsgvel fellbrlhatjuk egy ltez osztly megvalsrst

Megjegyzs Nhny nyelvben (pldul a C# esetn) a kategria fggvnykiterjesztsknt (extension) ismert.

A plda kedvrt kpzeljk el, hogy azt szeretnnk ellenrizni, hogy egy sztting rvnyes e-mail cimet tartalmaz-e, vagy sem. Az NSStri ng osztlyhoz i sEma i l metdust adhatunk, s gy az i sEma i l metdust brmely N tri ng pldnyon meghvhatjuk az albbiak szerint: SS
NSString *email ; @"weimenglee@gmai l.com" ; if ([email isEmail])
{

// ...
}

Ehhez
nunk:

egyszeren

egy j osztlyfjlt kell ksztennk s az albbi programkddal ellt-

/1---utils.h--#import <Foundation/Foundation.h> //---NSString is the class you are extending--@interface NSString (stringutils) //---the method you are adding to the NSString class--- (BOOL) isEmail; @end

493

D fggelk: Objective-C gyorstalpal A kd alapveterr ugyangy nz ki, mintha j osztlyt deklarlnnk azzal a kivtellel, hogy ez nem rkl egyetlen ms osztlytl sem. A stringuti ls az a nv, amely azonostja a hozzadand kategrit. Tetszs szerint brmilyen nevet hasznlhatunk. Kvetkez lpsknt meg kell valstanunk azokat a metdus(oka)t, amely(ek)et szeretnnk hozzadni: /1---utils.m--#import "Utils.h" @implementation NSString (stringutils) - (BOOL) isEmail
{

NSString *emailRegEx = @"(?:[a-z0-9!#S%\\&'*+/=?\\A_.{I}--]+(7:\\.[a-z0-9!#S%\\&'*+/=?\\A_"{I}" @"--]+)*l\" (?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" @"x7f]l\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" @"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?1\\[(?:(?:25[0-5" @"] 12 [0-4] [0-9] l [01]?[0-9] [0-9] ?)\\.){3}(7: 25 [0-5] 12[0-4] [0-9] l [01]?[0-" @"9][0-9]?l[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" @"-\\x5a\\x53-\\x7f] l\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; NSPredicate *regExPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegEx]; return [regExPredicate evaluateWithobject:self];

@end

Megjegyzs Az e-mail cm rvnyessgt regulris kifejezssel ellenrz kd a kvetkez webhelyrl szrmazik: ht tp: l l cocoawi th l ov e. com/2009/06/verifying-that-string-is-email-address.html.

Az e-mail cm rvnyessgt az jonnan elksztett metdus segtsgvel NSString *email = @"weimenglee@gmail .com"; if ([email isEmail]) NSLog(@"'valid email"'); else NSLog(@"Invalid email"');

tesztelhe~k:

SSZEFOGLALS
Ebben a fggelkben ttekintettk az Objective-C nyelvet. Noha a fggelk nem biztostja a nyelv tfog lerst, mgis elegend informcit nyjthat ahhoz, hogy elkezdhessk az iPhone-programozst.

494

G~~~--~-~4~

Tesztels konkrt iPhone-on vagyiPod Touchen


oha az iPhone Simulator nagyon hasznos alkalmazsaink letesztelsre anlkl, hogy szksgnk lenne egy tnyleges eszkzre, m egy vals eszkznl semmi sem lehet jobb a tesztelshez. Ez klnsen igaz akkor, ha alkalmazsainkat be szeretnnk mutatni a szles nyilvnossgnak - biztosan kell tudnunk, hogy megfelelerr mkdik konkrt eszkzkn is. Ezenkvl, ha az alkalmazsunk az iPhone/ iPod Touch hadverelemeihez (pldul a gyorsulsmrhz vagy a GPS-hez) szereme hozzfrni, akkor csak igazi eszkzt hasznlhatunk, az iPhone Simulator erre nem elegend. Ez a fggelk bemuta*, hopran teszteljk konkrt eszkzn az alkalmazsainkat, legyen az iPhone vagyiPod Touch.

Regisztrls az iPhone programra

fejleszti

Ahhoz, hogy konkrt eszkzn teszteljnk, elszr regisztrlnunk kell az iPhone fejleszti programra (Developer Program) a h t tp:/ /devel ope r. ap pl e . com/i phone/program/. webhelyen. Kt program ll a rendelkezsnkre: a norml (Standard) s a vllalati (Enterprise). A Standard program, amelynek kltsge 99 dollr, elegend a legtbb olyan fejlesz tnek, aki az AppStore-ban szeretn kiadni az alkalmazsait. A http: l /deve l oper. ap pl e. com/i phone/programlapp l y. htm l webhelyen tbbet is megtudhatunk a Standard s az Enterprise programok kzti klnbsgrl. Ha csak tesztelni szeretnnk alkalmazsunkat egy konkrt iPhone-on vagy iPod Touchon, regisztrljunk a Standard programra.

E fggelk: Tesztels konkrt iPhone-on vagy iPod Touchon

Az Xcode etinditsa
Ahhoz, hogy hasznlhassuk az eszkznket, be kell szereznnk egy iPhone fejleszti tanstvnyt (iPhone Development Certificate) az iPhone fejleszti program portljrL Elszr dertsk ki azt a 40 karakteres azonostt, amely egyedileg azonostja az iPhone-unkat vagy iPod Touchunkat. Ehhez kssk ssze az eszkzt a Macnkkel, s indtsuk el az Xcode-ot. Az Organizer alkalmazs elindtshoz vlasszuk a Window );> Organizer (ablak );> Organizer) menpontot. Az E.1. brn lthat a sajt iPhone-om azonostjt megjelent Organizer alkalmazs. rjuk fel az azonostt, s mentsk el biztos helyre. Ksbb mg szksgnk lesz r.

Summary

i Phone

......,
~p;a.dty

7.07 GB

Sert&l Number. ,...

l tdentlfiu: .
sortwi-rt Version z

Prov1sioning

Applications
Anlm1tion

0 .:.

E. l. bra

496

Tanstvny-alrsi krelem ltrehozsa

Tansitvny-alirsi krelem ltrehozsa


Ahhoz, hogy fejleszti tanstvnyt krjnk az Apple-tl, ltre kell hoznunk egy tanstvny-alrsi krelmet. Ezt az App l i ca ti ons/uti l i ti es/ mappban lev Keychaill Access alkalmazssal tehetjk meg Qsd az E.2. brt) .

~
Acti'llty Vomtor
tCh at

a.o:sk
51Wtl1> PLAUP,

formauon

~DVD fil Image prure


: , .Photo J rSync

ll'!

Alrttort Utth ty AUdO Mlrn Setup

VfYirt

gouuop
~--~tlgiH

.: ,Tunes

~Appi'(.it.l!(r!J
Drcc!,.".~,.l.i

'3

'l' SEAftC.H fOlt

......
(l

Web IWorlc '09


MICfCISOft Offitt 2004

~ Kt''f'(".it.'f'!AcaU

.:;; Tod.;t.y
.:) YHtt:rd,l)'
0 ~>UlWHk

~AJ~n
lii.A.I MoviH

. "'"""'
Stldu~

OpenOfflce.OI'g

Photo Boott1
\lersofl -0-2

O!JicknmePlliyer

!il A:l Oocument'l

Svste:m Prl!ferences

1 TtxtEd:t nme Mach; nt

"---------=-"'lJ1rtoes

E.2. bra

A Keychaill Access alkalmazsban vlasszuk a Keychaill Access ~ Certificate Assistant ment, majd a Request a Certificate From a Certificate Authori ty (tanstvny krse egy tanstvnykibocsttl) menpontot (lsd az E.3. brt) .
File About Keychain Access Edit

Preferences .
Keychain First Aid Cert1ftcate Assistant Kerberos Ticket Viewer
Services

X,
\:XA \:OXK Open ..
Create a Certificate ...

XH \:XH XQ

Hide Keychain Access Hide Others Qu it Keychain Access

Create a Cert1flcate Authority . Create a Certftcate For Someone Else as a Certiflcate Authonty ... Request a Certiflcate From a Certiftcate Authonty .. ~ - ~ - - Set the default Certlftcate Authority... Evaluate "Apple Worldwide Developer Relations Certiflcation Authority" ...

'

E.3. bra

497

E fggelk: Tesztels konkrt iPhone-on vagy iPad Tauchon

A Certificate Assistant ablakban (lsd az E.4. brt) adjuk meg az e-mail cmnket, vlasszuk a Saved to Disk (lemezre mentve) rdigombot, majd jelljk be a Let Me Specify Key Pair Information (n adom meg a kulcspradatokat) jellngyzetet. Kattintsunk a Continue (folytats) gombra.
Certficate Assistant

Certificate Information
Enter informat ion for the certifi cate vou are requesting . Cllck Cont inue to request a cert1ficate from the CA.

CA Email Address
Req uest Js.

Emillied to the CA ~\led to d sk

Let me specify key pair Informatio n

E.4. bra

Vlasszuk a 2048 bites kulcsmretet s az RSA algoritmust (lsd az E.5. brt). Kattintsunk a Continue gombra.
Certficate Assistant

Key Pair Information


Specify the key size and algori thm used to create your key
pa ir.

The key pa1r ls made up of your pn vate and publi c keys . The prvate key is t he .secret part of the key pa1r and shou ld be kep t secret. The publi c key is made publicly available as part of the d tgital certifkate
Key Stze
Algonthm

204 8 bits

JTI

_RSA -'------:::JTJ -'C.J :

{ Learn More

Continue

E.S. bra

498

Bejelentkezs az iPhone

fejleszti

program portljra

A program arra kr, hogy mentsk el a krelmet egy fjlba. Hasznljuk a felajnlott alaprtelmezett nevet, s kattintsunk a Save (ments) gombra (lsd az E.6. brt).
Certiftcate Ass1stattt
Save As:
Wh ere: _ Ot!Sk[op

_:j
( Cancel) ~

...___....,

.~:U

E.6. bra

Bejelentkezs az iPhone program portljra

fejleszti

A tanstvny-alrsi krelem ltrehozsa utn be kell jelentkeznnk az Apple iPhone fejleszti kzpontjba (lsd az E.l. brt). Kattintsunk az iPhone Developer Program Portal hivatkozsra az oldal jobb oldaln. Az oldal elrshez 99 dollrt kell fizemnk .

.;~

iPhone Devetoper Progn.m

l~~flrOf'JJ'II'OfU'

Developing for iPhone OS 2.2.1


~GtkDdiJOl.,

;fvt~H (Ont.C Ot~

......

""- ~ 7,l00t
""'*~lb

Suopon CdW'

.......,,..,., ..... ",-.nfor


~~IOftlfor~ -"IPod~-

......_.Deu'-.""

-.......
._...T_\1chos

..-.. a..cc~......n-..

T.--.
lJ ~,~~'~U

""'1,l009 Oct 10. 1001 . . 7.ZGOt

Gott&~l"'btMoCMI....

of....,.

yOu(Miflottwl'fotr. . IIOtUI.,.
CCW~tCt-... ~.,...

~~IW.u.n.Mcnt

~lopme.nt

Resources

Futured Content

w
c.m.. SIMIM
DIK~t

..._..~t-........,__.

c.w.
~li"fltcMWfU.IIfw""-

..... ~.c....

E.7. bra

499

E fggelk: Tesztels konkrt iPhone-on vagy iPod Touchon

Figyelmeztets Regisztrljunk idben, mert a jvhagysi folyamat eltart


egy darabig- pr rtl akr napokig is.

A portlon kattintsunk a Launeh Assistant (segd elindtsa) gombra (lsd az E. 8. brt), amely elvezet az iPhone felksztstl a fejleszti tanstvny ltrehozsig.

Progriom Portil

...
Welcome to the iPhone Developer Program Portal
The IPhont Dwf:loper PrQ9r1m Pottili tS ~~tgne d tO Uke you thn>uSih the nKess;uy s tt ps to t ts t ~r app{ tc.ttiOos on Ptione 11nd 'Pod touch a.nd prepue

....
CerttfiaCH

_
.......
lOs

them for d.unb"'bOn

.u.
Cet you r appliCAtion on an ll"hone .,.,lth 1he Development ".ovtslonll'\iil Assistant

"""'~ ... ...

~.

..... ,..,.,.,..Ad-II.VQUUO
~l""r.t

111' the~"'""""

Ofto"'9

to crta! rel II'I1.QIII .....__.,. ""oftlit MloCS "...,..,..

~C..,I>att-~tobulditiiiCI.",ul~~e

" ........ ""rot~ M' '"" tou(h,

1 .~ Aun.1.1.r11
Announcemenu
"'- 14 2001
Get tM: App Store rNdy for your ~PP

~=

~=UO!ft;PndUu

. ..
Ah~O.wtorQ

"""'

E.8. bra

Megjelenik az dvzlkperny. Ekkor kattintsunk a Continue gombra. A segd megkr egy alkalmazsazonost (App ID) ltrehozsra (lsd az E.9. brt). Az alkalmazsazonost az iPhone-unkon lv alkalmazs(ok) egyedi azonostsra szolgl karaktersor. Adjunk neki egy olyan nevet, amely lerja ezt az azonostt (ezt az Apple generlja). Kattintsunk a Continue gombra. A kvetkez kpernyn egy lerst kell adnunk az iPhone-unkrl/iPod Touchunkrl. Be kell rnunk az eszkzazonostt (lsd az E.10. brt) . Kattintsunk a Continue gombra. Ekkor elkldhetjk a tanstvny-alrsi krelmet az Apple-nek (lsd az E.11. brt). A kpernyn lthat utastsok az eddig vgrehajtott lpsek. Kattintsunk a Continue gombra.

500

Bejelentkezs az iPhone fejleszti program portljra


~ ~veio~e~r Pr~;~T;~;-~g As~[;~~~~

"'""" .-~-- --~- ""'-'"':i:r

-~

"?...,, ---<~ -~

. _.,_ .. .-r-o:~-~-:

'ff

Setup

Create an App ID
An App ID ls a untque ktenufier thilit !Phone OS uses ta gr<~nt your ,;apphco~.tion ;acuu. to a portton of the Keyd\<lln and ls one:~ ofyoor Orevel opme:nt and Dis tn bution PrOVlsKlm fWl Profi les.

Enter a common name or description of your App ID uslng alpha.numeric characters. The description you specify will be used throughout the Program

Portal to ldentlfy this App 10.

App ID Description:

n2DeveloEI_

You cannot u se SPt chillncters sue h u .. &. . ln your descnpllon

Go&ack

E.9. bra
~~O~~~ - ~~~~~~n9 """ ;~I~;;; A

-. ~- ..-

-'N_,_

- .~--

-~~~~--,. .... _-~=-~"'--

~----~-;;..,

Setup

Assign Development Device


Nvnt ind enttr tht Un1 Q41t! Otvtce 10 (UOIO) of your Mvelopmtnt \Phone or \Pod touch.

'Thf: UOtO ls

ill

40 chatKttr Stfing th.at ls t1<td to

;a

s.ngJ-e deVtCe, Simhar to~ iVIAI nu"'bcr.

Enter a common name or desc.rlptlon for your Apple Device uslng alphanumerfc characters. The description you specify will be used throughout the Program Ponal to lden t lfy this device.

Oevfc.e Description

MYl P.tt9t,~

You unt\01

lnt: s.pec:i~l

th.araaen. s~o~<h u .. &. , '" 't()l.tr df!S<rtl)t;on

Device ID

1. .... -~-"'-

-.._. ~~j!:.t--.:)t+ir:.z't"C::_;..~<t.-~~-

Localing a Unique Device ID

To loc.t.~e your UDIO, connect your device to your M.lc and OPfl"' Xcoclt. r..a... tg~te to tiM dtop dOwn nwnw at'ld ~le "Org~MltU~ The 40 cbJiracter ~trinog tn ~ ldenbfe-r field tS .,our <kvlce."s UOtO Copy a.nd p.ne ths nnng uno the r,eld abovt.

--w:"dow

E.lO. bra

501

E fggelk: Tesztels konkrt i Phone -on vagy i Pod Tauchon

Setup

Generate a Certificate Signing Req uest


To requen
.u1

IPhone Development Centfkate, you Rr~t need to g~eratt il Certtfic.ate

Signlng Request ICSRJ utthz1ng the Keyd1.a.n Access application ln Mac OS X l eopard.

"J

Launeh Keychain Access


ln the Apphcat.ons fold er on your Mac, open the lJtJI1t1es folder and launeh KeychaJ n
AcC:6S.

With<n the K eychou n Access drop down menu, select K ey<ha1n Access > Certificate Asslstar,t > Request a Cert1ficate from a Cemficate Authorty
ln the Cemficate InformatiOn wtndow, enter the fo\low1ng Information:
ln the User Email Address tieid, enter your emat addrus ln the Common Name field, crt:ate a n.liTit: for your pmr.ue key (eg. John Doe Oev Key)

ln the Requ est is group, seoect the 3aved to disk- option

CllCiC Continue Wlthn Keychatn Access to comp:ete the CSR genera.Lng process

Cancel

Co Back

E. lL bra

A megjelen kpernyn kattintsunk a Choose File (fjl kivlasztsa) gombra a korbban ltrehozorr tanstvny-alrsi krelem fjljnak a kivlasztshoz. A fjl kivlasztsa utn kattintsunk a Continue gombra. Adjunk meg lerst a felkszt profilunk (Provisioning Profile) szmra (lsd az E.12. brt). Ltrejn egy felkszt profil, amelyet ksbb letlthetnk, s telepthetnk az eszkznkre. Kattintsunk a Generate (elkszts) gombra. Elkszlt a felkszt profil (lsd az E.13. brt). Kattintsunk a Continue gombra. A ltrehozott profilt a Download Now (letlts azonnal) gomb ra kattintva tlthetjk le a szmtgpnkre (lsd az E.14. brt). Ezutn kattintsunk a Continue gombra. A letlttt felkszt profilt (amely alaprtelmezs szerint a D owrtloads mappba kerl) hzzuk be az Xcode-ba (amely a Dockan tallbat). A profilt ezzel teleptjk az iPhoneunkra vagy az iPad Touchunkra. Kattintsunk a Continue gombra (lsd az E.15. brt).

502

Bejelentkezs az i Phone fejleszti program portljra


O'"o;~toPm~; "~~cM7~1~~~i;~-..w: -;>or-'"' :-~;, ~~- '"!~'.~~~'"t"-~~-~

Setup

Name your Provision ing Profile


A rtoo.lbiorung ProfT~ s a COIIttift of your Agp 10, Apple deVIce UOIO, aM ~'*'ont [)to.totJopment Ct>nofoatt d'M.t .news ~to W1SQJI yout appbc.M1on on your ~e.

Enter il common Mme or description for you r Pro11isfonlng ProOle uslng al p ha..numerlc chuacters.. The description you specify will be used throughout the Program Pon.a.J to ldentlty this Provlslonlng Pronl~

Profile Dtscrlpllon: [umZDeveJopProfllt,


You c.t'lnot
IOn
U )or;

Cb.M.ctt.r' s.uc:h U . . &. , in VOU'

App tD

Lurn1Dew:lop

Otvkt

MyiPhone

Cfflfute Niln'lt

Wel- Mf:ng Lee

r- c~c..
E.12. bra
~....- '..-~lOningAsst$~ .......-.--~~.._~c;-~~ " -

- .

Configur

Generate you r Provisioning Profile

,.ov
Prot'e Mme
App ID

Lu.m2DtWiopProfile
Lurn2~w:lop

Dtvtc.:t

Myil'hOf'le

G
G

CM.!fate NolrM

Wel-Me.ng U:e

YCH.Ir Provislonmg Proflit hu bet:n

gent:ra~.

E.13. bra

503

E fggelk: Tesztels konkrt iPhone-on vagy iPad Tauchon

Downl~d

& tnsQJI

Download & Install Your Provisioning Profile

Step 1: Down load

1/J

Lurn2DevelopProfllc
..

Oownlo6d Now

Step 2:

lnst~ll

ConnKt your devie~ to yo:Jr ~c olnd dr~g th~ downloaded Provi.s.a"""~ Pro~Uoe lnto the 'Orgmzer' 'Window W~th n Xcode . Th-s Wi ll

;,.utomuluJiy tnstall the .mob'leprovlson filem


lht proper folder

E.14. bra

Download & Install

Download & Install Your Provisioning Profile

Step 3: Verify Provls lon ing Profile lnstallatlon


Your Provislerung Profi!e file should appur in the of Xcode's Organizer Window.
Provislon . ng~

sectton wuh.n the Summarytab

~ -

----

Cancel

...

_...__.

__

E. lS. bra

504

Bejelentkezs az iPhone fejleszti program portljra

gy ellenrizhetjk a pro@ megfelel teleptst, hogy az Organizer alkalmazsban megnzzk a Provisioning rszt (lsd az E.16. brt).

Organiur

Summary

iPhone
Name:
Ca~dty.

7.07 GB

Provisloning

[ J+ifif$J,f55Ridfl

Appllc.tt ions

At1 1 ~tion

..

ItA Bl.lc.lt ~.Jek - - -,mbfrQ

' .. ..

+ o- m

E. lG. bra

Az iPhone fejleszti program portljrl most mr letlthetjk s telepthetjk a fejleszti tanstvnyt az eszkznkre. Kattintsunk a D ownload Now gombra (lsd az E.17. brt) a tanstvny letltshez a szrntgpnkre. Kattintsunk a Continue gombra. A D ownloads mappban kattintsunk dupln a letlttt dev el ope r _i dentity . cer fjlra, hogy teleptsk a jelszkezelbe. Amikor a rendszer kri (lsd az E.18. brt), kattintsunk az OK gombra. Az iPhone fejleszti program portljn idkzben megjelenik, hogyan ellenrizhet jk azt, hogy a tanstvny megfelelen lett-e teleptve a Keychain Access alkalmazsba (lsd az E.19. brt) . Kattintsunk a Continue gombra.

505

E fggelk: Tesztels konkrt iPhone-on vagy i Pad Tauchon

Download & Install

Download & Install Your Development Certificate

Step 1: Download
Ocrwnlo.ad your IPhonr
(.cer) file to your Mac.
Oevelopm~t

CtrtJ fcate

! If you hi~ already downloaded and in stalied your Deve lopment Crrofin.te sk1p Step 2 and contmut to Ste p 3.

Step 2: Install
On your Mac, double-dick the downiNCJed .cer

fl le to launeh Keydla1 Ace eu and Install your n certificate..

0 -----.. - -....

----

E.17. bra

Add Cortifiates
Do you want to add the cert tficare(s) from the file

"developer_identity.cer" to a keychain?

Keychain. :-.:log i:n_ _ _ _ __::..:JJ =~ :: :


( View Certitkates

E. lS. bra

A Keychain Access alkalmazsban vlasszuk a l ogin elemet, s keressk meg az i Phone oeve l ope r: you r name elnevezs tanstvnyt (lsd az E. 20. brt). Ha megtall juk, akkor helyesen teleptettk.

506

Bejelentkezs az iPhone
Dl!~topmf!nl

fejleszti

program portljra

Provlslorwng Assistant
Downl oad & lnstil ll

Download & Install Your Development Certificate

Step 3: Veri fy you r pri vate and public keys ln Keychai n Access
Venfy the lPhone Oe~loper povue and pub''' kt!ys an pa~re:d tagether in the Ke'f(h.J.n Access apph~tton to ensore yo;Jr Certtflcate ts property configured on yoor ~ac

-Cancel

Team Lr:ader

Klnd .pub' ic key

Team t.uder

private key

~-

Kr,th.Ain Acceu on 'f'OUr

M~

E.19. bra
OQO
0 to todc the logo lteyd\Ain n

Keych ain Access

o.
!Phone Develope r. Wel- Meng lee:
lssued by Apple Wortdw.de DNe ooe:r ~I.J.llons Certlfcatlon Authonty ExDres Saturday, April 24, 2010 2 20 00 ~ GMT -+ 08 00
TI

System

[ j System Roots

s cen.i'K.lte s v~d
Date: MocM'ied

Eli:Ptres

Ke~n

Internet pauword
C.:Ut!90fV

Mar 20, 2009 9

log tn

Alllt!"S

A.r9ort network pass


appliution p.usword

W.:u lS. 2009 4


MM 10, 2009 7 Mar 10.2009 8

loon
login

;. !..

Passwords Certlflcates
"
Keys

we .menglee

public key .M.lc password

log tn
logm log1n log tn login

[J Wy Cemfleates

1'

Secure Notes

we'menglee we. .menglee: ~ we .menglee J wemenglee we .menglee: we'menglee

pnv;,u key
pubnc key

pnvate key pnv.ne key


puble key

login
login

u .....

E.20. bra

Mr nem vagyunk messze attl, hogy telepthessk az alkalmazsunkat az eszkznkre. Kattintsunk a Continue gombra (lsd az E.21 . brt).

507

E f ggelk: Tesztels konkrt i Phone-on vagy iPod Touchon


.....

#~

..

--~ ;:-~-:---::..:-

~~

Oevelopm!nt ProvtsJonlng Asslsu.nt

v"C..-n ':"'...~~

.... ~-"':'

~:

:;;,z. .... ~-~v .... ~-:.::-~- ...--..fl-

Build & Go

Install your iPhone appl ication w ith Xcode

Step 1. Launeh Xcode and open you r project

Step 2. Select a destlnation


ln the
Pro~ct

Window, select
Oeb u g~

~vice ~

IPha ne os from

the L>evtce

drop down menu in the upper-

lefl~dcomer

Step 3. Bulld & Go


Oick '"lu ild
deVIce
~Go~

to insu../1 the .J.ppllatton on your

If you h~e mu\llp!e PrcrvtSIOn>ng Ptofiles . ....,ew the tPhone De:wlopet Program User Guide fOf' nnruatons on sele(ttng PY"ov1Ston.ng Proftl<t!s ...,,1httl Xcode

E.21. bra

A prbeszdablak eltntetshez kattintsunk a Done gombra. Az Xcode-ban keressk meg az Active SDK elemet. Ha mg nincs az eszkztron, akkor a View ~ Customize Toolbar (nzet ~ eszkztr testre szabsa) menpont segtsgvel adjuk hozz. Ezutn az Active SDK alatt vlasszuk annak az eszkznek az opercisrendszer-verziszmt, amelyet a szmitgpnkhz csatlakoztattunk A sajt iPhone-omon mg a rgebbi iPhone OS 2.0 fut, ezrt az i Phone Device (2 . O) lehets get vlasztottam (lsd az E.22. brt).
~ AnimatJOnVewController.
De bug

iPhone Device (2.0)


Aaw SOK A
Arumatlon .~p

11>

Clanes

b:
E.22. bra

~ Anlmatlon_Prefhqx:h " : An1matio nApp Oele:oate.h

An1matlonAppDe1~ate.m

l!!] AntmationVIe'NCont roller.h

Az alkalmazs futtatshoz nyomjuk meg a Command-R gombokat. A program engedlyt kr arra, hogy hozzfrjen a jelsztrotba elmentett tanstvnyhoz. Az alrs folytatshoz kattintsunk az Allow (engedlyezs), vagy az Always Allow (engedlyezs mindig) gombra Qsd az E. 23. brt).

508

Bejelentkezs az iPhone
( voi.d) onTi.er {
t.aQ~i.et.~ . center

fejleszti

program portljra

CGPotntJ1oke( t.:qe'Jt~ . center. x

posttton . x,

1~\J.~ . center. y + po:

tf ( u:o;~eVtt!\,; .center. X>328 ll t PIOge\! t eo.t .center.><dl} posi t t ',j


It

(>~,~~--~~~--------------------------------~ pos t
codes lgn wants to sig n ust ng key ..we lme.ng lee" ln you r keych aln.
Do vou want to a!low ~cess to lhls ttem1

Alwoys Allow

~~

E.23. bra

Alkalmazsunk teleptse az eszkzre ezutn megtrtnik A folyamatot az Organizer alkalmazs Summary (sszegzs) lapjn kvethetjk figyelemmel Osd az E.24. brt) .
~nizt:r

Summary

~~~

!Phone
Nom.:
Ser~l

C.aPlc:lty: 7.07 GS Number: ~

ldtnt1fit:r: '-'

5ortw.al'1!: version: 2.0 (5Aln


c;r. .~

.... ~ ......

Provisioning

Appliu.tions

r~lc)oicl.

.,.

""Bloom~rQ

..a
'"..:..

+ O 131

E.24. bra

Miutn az alkalmazs teleptse befejezdtt, az opercis rendszer automatikusan elindtja. Az eszkzrl kpernykp eket is kszthetnk, ha rkattintunk az Organizer alkalmazs Sereenshot (kpernyments) lapjra Qsd az E.25. brt).

509

E fggelk : Tesztels konkrt iPhone-on vagy iPod Tauchon

Orgilnizer

Sereenshot

..dl SGP..

3:05 PM

SSZEFOGLALS
Ebben a fggelkben vgigvettk azokat a lpseket, amelyek alkalmazsunk teleptshez szksgesek az iPhone vagy az iPod Touch eszkznkre. Br a lpsek szma elbizonytalant lehet, maga a folyamat igazbl egyszer . Az iPhone fejleszti program keretben maximum 100 eszkzt kszthetnk fel tesztdsi clokra. Miutn az eszkzt elksztet tk, a teleptsi tanstvny segtsgvel telepthe~k r az alkalmazsainkat.

510

Trgymutat
A,
ablak, 26, 28, 35, 45, 48, 50, 52, 57, 58, 65-67, 73, 76, 78,82,92,93, 153,165,166,174,192, 193,203,210,224,279,324,437,439,445, 449-461' 496 adatbzis, 16 287,308,314-317,325,381,404 lland, 10,65,148,298,299,315,324,404 llapotsor, 19, 146, 147, 158,437 animci, 17, 112, 150, 181, 182, 183, 349, 354, 356,363,420 API, 16, 17, 18, 43,111,298,365,396,397,398, 403,409,413,414,450 AppStore, 3, 10, 18, 40, 300, 305, 495 argurnennun,298,315,358,360,361 talakthat, 65, 306, 307, 308, 309 tmenet, lll, 181, 183, 184, 222,230 Attributes Inspector, 29, 84, 96, 122, 127, 144, 168,192,193,198,224,250,372,427,455 azonost, 17, 54, 61, 274, 404, 496

D
Debugger Console, 78, 82, 297, 298, 299, 302, 305,306,324,337,338,400,403,429,445, 448,450 deleglt, 46, 66, 79, 133, 136, 144, 165, 189,202, 451,490

E,
elemvezrl, 80, 100, 101,110,159,163,166, 171,180,333,451,457,460 elrsi t, 244, 298,299, 300,308,314 els reagl, 45, 126, 132, 142, 144, 165,263, 402,403,419,451 eltols, 357, 358, 360, 364 rints, 9,10,266,267,329,334-337,340,348 rtk, 43, 78, 116, 147, 251,268,273,274,279, 300,324,354,363,392,409,480 esemnykezel, 35, 79, 116, 132, 165, 184, 458 eszkztr, 26, 28, 437, 439, 508 eszkzsv,25, 184,187,188,192,193,196,198202,212,213,215,436

B
30, 73,119-127,131,132,133,139144,198,261,262,400 binris, 321 Bonjour, 14, 16, 18
billentyzet,

F
feladat, 3, 40, 150,215, 218,251,295,336,366, 481 felhasznli fellet, 6, 12, 16, 17, 19, 23, 28, 30, 40-45,56,98,100, 105,121,152, 171, 184, 188,192,215,284,285,371,375,389,451, 452,457,458,464 flkvr, 78,169,313,318,322,343,428,445 forgats, 9, 19,150,151, 152, 159,360,433 fons, 271, 375 6wakci, 7, 16,18,44,358,360,430,439
fggvn~315,317,321,322,324-326,348,358,

c
Calendar, 365 Comacts, 188,254,316-321,323,365,381,384389 Control-kattints, 35, 48, 57, 58, 105, 108, 113, 154,170,195,282,331,367,372,382,397, 406,410,424

Cs
csszka,274,352,354,355,356

361,396,485,486,492

Gy
gyakorlat, 60, 164, 174,312,487 gyri, 163,300,365,366,371,381,389 gyorsulsmr, 4, 10, 16, 21,391,392,393,395, 413,414

Trgymutat

H
hromszgels, 404, 405, 434 hibakeres, 77, 403, 442, 448 hibs, 298 Home gomb, 30, 31, 40, 148, 149,272,278 horspot, 391 hzs, 10 hzsgesztus, 329, 346, 348

L
Library, 11, 28-30, 48, 50, 76, 77, 165, 193, 198, 288,294,295,300,308,316,352,371,372, 375,377,380,389,431,452,455,457,458

M
i\lac OS X, 4, 7, 12, 14, 20, 24, 44,247, 269, 298, 432,435,436,465
~lru1,365,366,368,369,389,433

l'
IDE, 5, 6, 7, 435, 439 Idencity lnspecror, 35, 51, 55, 107, 124, 127, !53, 166, 168,190, 192,195-197,200,224,225, 400,422,425,455,457-461 idzt, 335, 349, 355, 364, 433 l nsrrumems, 6, 12 integrlt fejleszri krnyezet, 435 interfsz, 16, 435, 467 iPhone SOK, 3, 4, 5, 6, 8, 16, 21, 28, 42, 84, 146, ISO, !63, 164, 184,188, 189,215,216,222, 230,245,313,349,356,363-365,371,389, 391,409,4 13,449,451 iPhone Simularor, 3, 4, 6-12, 21, 26, 28-31, 37-40, 62, 65, -2, 78, 82, 89, 94, 97, 100, 115, 120, 126, 131, 139, 146, 156,165, 170, 174, 177, 182,192,198,207,210,228,237,243,261, 272,278,284,287-291,294,297,300,304, 316,332,337,343,347,348,354,362,368375,384,400,404,407,412,427,433,441, 495 iPad Touch, 4, 5, 8, 9, 10, 15, 23, 333, 349, 370, 371,381,391,392,393,395,405,413,434, 495,496,500,502,510

meghv, 218,389,404,433,441,489 mretezs, 33, 96, 361, 364 metdus, 51, 61, 65, 73, 98, !Ol, 103, 147, 150152, !58, !59, 182, 183, !99, 218,219,220, 239,253,254,263,264,290,299,308,314, 317,320,334,343,354,355,363,380,385, 386,387,388, 441,473-478,485,487-494 mobilrorony, 391 modlis, 80, 220, 375 mvclet, 35, 36, 50, 51,58-61,64,73, 131 , 132, 178,219,220,318,403,437,439,458-460

o,
objektum, 45, 79,100, 102,103, 132,144,171, 211,241,244,251,264,268,306,307,309, 315,317,321,333-335,349,356,364,409, 412,419,433,441,445,469,475,478,481487, 490-492

p
paramter, 79, 80, 150, 151, 152, 174, 183,298, 355,489,492 pldny, 171, 174,190,395,473,491 Phone, 11,122,187, !88, 365,369,389,434 Phoros, 371 pipa, 233, 265, 268 programkd, 23, 37, 41, 77, 91,96-99, 104, 120, 133, !46, 163,164,175,179,210,216,234, 250,312,319,330,36!,366,370,371,393, 397,405,433,439,442,446,458,460,461, 466,475,486,489,492 projekt, 24, 42, 43, 66, 67, 103, 153,189,213, 216,217,224,256,272,30 1,312,314,317, 318,322,336,340,346,403,410,436,437, 451 protokoll,46,80,218,219, 220,229,236,238, 242,245,26-,26 ,285,395,429,434,489

J
jellngyzet, 123,166,313,350,361,498 jobb gombbal kattint, 220, 378, 382, 439, 462, 463

K
keretrendszer, 14, 16, 215, 245, 405 ktszer kattint, 48 kezelfellet, 17, 375 kdrszlet, 147, 150, 184,268, 271, 369,467 kulcssz, 61,469,476,478,481,482,483,485487

R
rnzs,396,402,403,414

512

Trgymutat
referencia, 141, 282, 313 rszletez gomb, 265 rszletez jell, 265 tbbnzetes, 47, 163, 184, 187, 212 tulajdonsg, 61,101,110,115,156,157,182,210, 222,266,331,335,363,395,412,420,428, 477,488

s
sablon,66,202,216,230,247,301 Safari,81, 145,329,365,369,389,391,433 Size lnspector, 33, 153, 455, 456 S11S, 10,365,370,371,389,433 sorosts, 298 Spotlight, 7, 24, 435

U,
utasts, 46, 58, 103, 132,242, 257, 287,288, 300, 321,370,371,428,447,448,465,466,471, 477,478,484,486,488

v
vlaszt, 375, 386 vezrlelem, 34, 65, 84, 90, 91, 95, 127, 218

Sz
szirnultor, 9, 10, 30,407,439 sztling,64,65, 100,264,317,320,321,325,391, 492, 493

w
\vebbngsz,21,

70,95,329,391

T
mg,60,88, 90,99, 101,102,103,419 tagvltoz, 60, 475 tjols, 33, 40, 146, 147, 151, 200 tartalom, 61, 95, 142 tbb rints, 335, 338 tbbrinrses, 16, 19, 119, 329

x
2GMDL, 17,28,43,44,45,273,300,439

513

You might also like