Professional Documents
Culture Documents
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.
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
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
Tartalomjegyzk
2.
Az
els
Ismerkeds az Xcode-dal .............................................................................. 24 Az Interface Builder hasznlata .............................................................................. 28 A kpernytjols megvltoztatsa......................................................................... 31 Az elemek trendezse ........................................................................................... .. 33 Programkd rsa ...................................................................................................... 35
3.
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
zetvezrl
4.
viii
Tartalomjegyzk
5.
Bevitel a
A
billentyzetrl. ...................................
119
billentyzet
eltntetse ................................................. ...................................... 124 tlltsa szrnbillentyzette .......... ............................................... 127 billentyzet automatikus megjelentse az elem betltsekor. ...................... 132 jelenltnek rzkelse ............................................................ 133
Billentyzet
6.
kperny
kperny
Forgats programfuts kzben ....................... ................................ ...................... 157 A nzet adott tjols megjelentse a betltskor.. ........................................... 158
8.
ix
Tartalomjegyzk
9. Segdprogramok.............................................. 215
Segdprogramok ksztse .......................................................................... 216 tmenetstlusok ........................................................................................... 221 j elem hozzadsa a segdprogramhoz .................................................... 222
Fejlc s lblc hozzadsa .............................. ...................................................... 240 Kp hozzadsa ...................................................................................................... 241 Kijellt elem megjelentse .................................................................................... 242 Behzs .................................................................................................................... 245
Tartalomjegyzk
Rekordok beszrsa ......................................... ...................................................... 318 Vltozk sszekapcsolsa ...................................................................................... 320 Rekordok beolvassa .............................................................................................. 322
15.
Egyszer
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
xi
Tartalomjegyzk
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
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 17. fejezet feladatainak a megoldsa ...... .... .. ...... ... .. ..... ...... ..... ........ ...... .. .434
Vlasz az 1. krdsre ....................... ......................................... ., ........................ .... 434 Vlasz a 2. krdsre ................................................................................................ 434 Vlasz a 3. krdsre ........................................ ............................................ ., .......... 434
Tmogatott projekttpusok .................................................................................... 436 A Toolbar szemlyre szabsa ............ .................................................................... 439 Code Sense .............................................................................................................. 439 Az alkalmazs futtatsa .......................................................................................... 441
xiii
Tartalomjegyzk
458
Kivezetsek s mveletek ltrehozsa ................................................................. 458 Kivezetsek s mveletek csatlakoztatsa ........................................................... 461 1. mdszer .................................................... .............................. ....................... 461 2. mdszer ............................................. ................... .......................... ............... 462
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
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.
2. fejezet. Az
els
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
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.
xxiv
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?
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.
vannak ki-
kvetkezkppen
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
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
3. Kivezetsek,
nzetvezrlk
............ 41
kperny
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.
<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
.,1'
.,.,.......
ITunes COnntct
Fulured Content
O'IU)
lU a
Ct~once:
Ptv9tilm Workftow
......_loponeftttUt"ttfolt.
1.1. bra
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.
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: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.
...._"__
l of 9 seitcted. 186.7 C l
llV1113.0!~
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
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
Buttd Vl 'r oRr interfa~ Learn hO'N lnterf.ace Bullder work.s with Xcode to des.gn your UJ
~d
Stor yot ~ applrcat10n da(a l..e;lm how Xcode makn it u.sy to your appHc.ation's dona.
leve~e
lum how to lntegr.ate lnstruments lnto your Xcode workflow to a.Mlyze the performance of your applic.itlon.
1.4. bra
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
Applicatton
ApplicabOn
'
M.lc OS X
Tabhr
Appl1 cahon
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
<lll
SCM
Project Symbob
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.
IEO.It let Ul
UlYiewController
UI~iewOelegote
UIIfebYievNavigot ionType
UIWetNiewNaYigottonTypel ink.C l tcked UlltJebYia.oNI:J\'i!;IOt ionTypeOther UlWet:Ni evNcN i gat IonTypeRe load
UIWindow
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
xxOXH
2.0 (SA345) 2.1 (SF13 5) 2.2 (SG77) ol 2.2.1 (SHll) 3.0 (7A238j)
Lock
XL
1.8. bra
funkciit szimullja.
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
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
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.
1.10. bra
11
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.
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,
Megjegyzs Az lnstruments alkalmazst nem trgyaljuk ebben a knyvben. Tovbbi informcit az Apple dokumentcijban tallhatunk.
12
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
<l
;::-----..
1.11. bra
lnstrurnents
ll
ao:aa:oa 0
Ro.r~OofO
~~, .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
....,nd_
( c.nc.t )
1.12. bra
13
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
gyorsulsmr,
nzethierarchia, lokalizci, figyelmeztetsek, webnze tek, kapcsolatvlaszt (People Picker), kpvlaszt (Image Picker),
vezrlk .
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
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
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
Nzervezrl-alap
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.
17
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,
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.
18
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
kezelsrl
19
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.
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
Kls
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).
Az iPhone-on minden alkalmazs egyablakos, azaz az ablakok Icitltik a teljes kpernyt, az ablakok tfedse pedig nem lehetsges.
21
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
Ismerkeds az Xcode-dal
Ha
betl~k
az Xcode-ot,
elszr
az
dvzlkperny
Megjegyzs Az Xcode elindtsnak legegyszerbb mdja az, ha a Spotlightba begpeljk az Xcode szt, majd megnyomjuk az Entert.
Welcome to Xcode
ettung Sbrted
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
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
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
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
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
=======
No Editor
Project Symbots
.lmplernent.Uon ri lu
. . . Nilifiles
2.3. bra
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
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
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
~
Actton
'Q.
Bui1d and Cf'l TolSks Inf o
)'
Surch
'
:j
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
.. ... c.
ll .
_t
Jl
2.5. bra
27
2. fejezet: Az
els
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
28
Ismerkeds az Xcode-dal
fil~,~
F"~tltu.;IOfldtr
,._
:i=:"!
lllPportS
C;::u~'=
tn"
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.
........
.,..tws. ~ rouang
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
-..:.
2.9. bra
29
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
2.12. bra
2.13. bra
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
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.
megelz
programkdot:
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!
,...---..--
(!~
Cllck Me!
x ~ v.--s?
w-
""277
Autoslzln_g__
IHBHl
J---..!
I-l r:::~
2.17. bra
33
2. fejezet: Az
els
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!
.. .
"""""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
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!
Cllck Me!
2.22. bra
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.
kvetkez,
a btnclicked:
mvele t
36
//---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
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
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
!'!. HelloWorldViewControHer.h
a.~~ . HelloWorldVa~ontro1ler.m
l Resourcu
rj L..:
J::!_P~-~
..... -... c . .
S!....!
lnro.phst
U Fr~woriC.s
,. :::.; Proctucu
~@Targtu .,_ ~ Executab1es
-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
,~ ~
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
W~ntb!'i~ebl~~
. .w.noow
2.26. bra
39
2. fejezet: Az
els
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
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.
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:
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
Navlgation- b.ased
Appl i c~l on
~~9.1ton- b.ued
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
the
VII!W .
Kernel Extension
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
e ProJtct Symbo;s
SCM
Mad'I\VindOW.XIb
UIJOt.frMMWOrk
. . . NIBFHes
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
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.
102 ,...... ,
1
Loalizatlon
n~trw.
development region
Engllsh
Sundie
displ~y
name
Execua.ble fUe
Icon file
Bundle id~tJfter
lnfoOtction;J.ry wrsJon
Bundlename
6.0
SlPRODUCT_NAME)
,7111
l. O
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,
45
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:
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:
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.
letesebb eligaztst.
'
."
t""\ ""'
1-...
Window
.,........-
.,._... ...
- .
-~
View
loade.d from ' BukUIViewControllu '
l
3.5. bra
47
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
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
,__.
~ o View lcons
Q
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
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.
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~-
~so
s<Jpporu modal
3.11. bra
3.12. bra
Alkalmazsunk egy nagyon egyszer dolgot tud: amikor berjuk a nevnket a szvegmezbe,
a nvvel.
az
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
: 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
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~
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
------
.,.
:j
~""'"
ll ll
-- -- --
:j
"' l
BostcUI!Jteo.Corltrollet .h
ti
f/
ll Bastct.II ll
Sotuttor~
l
ri~ts
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>
..,..,
tmterfoce BastcUIVie...controller : UIYie..Controt ter { tet Ul extftel *~ extfie } - {IBAct ton)btrel icked:(id)sender;
UIYie\o~Controlter
~ -
""""
-~-------~
----
--
..
..
status 2 ditferences
Choose right
J Actlons
l. .
3.15. bra
ltiiPQrt
-<LJI~tt/U I K i. t. . h>
l}
_.!....
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
ltjuk:
- (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
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
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.
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
56
A kd s a felhasznli fellet
egyttmkdsnek
az alapjai
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
CllckMe
3.21. bra
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
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
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:
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
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] ;
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
61
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.
objektumokat s
mveleteket
#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
...
.;
,.
)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 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)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
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).
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
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):
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
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
File Name
~ Also crute "MyVtcwController.h"'
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
- (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]];
@end
A [BasicUI2.'{jp} kdfjl
nzetvezrl
betlt.
70
Nzetvezrlk
Flle'sOwner
.---,.,_-.-...
"..
_,----
.
Label
SegtM:I' ted
"""
ROIUld aea
l--
l.lf'NI,bVIew ob,tKt
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
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];
@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.
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?
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.
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
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
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.
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];
77
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
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.
78
Az elemek hasznlata
4.2. bra
4.3. bra
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
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]);
80
Az elemek hasznlata
Ir
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.
kvetkez
flkvren sze-
81
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.
@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]);
83
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
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.
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).
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
4.8. bra
85
~ View
ll of Pages
Current
D.'m
H. Al ignment v . Alignmo.nt Selected
;j
o
Dr~wing
O Opaquo.
15!1 Clip Subvtews
O Hidden
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;
}
//-- -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
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;
}
// ...
ket
a UIView osztly k-
90
Az elemek hasznlata
//--- 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];
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
91
kvetkez
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).
@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
- (void)dealloc { [segmentedcontrol release]; [viewl release]; [view2 release]; [super dea ll oc] ;
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];
,, 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
95
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
x
1.00
r-t
y
0.00
r-t
..:.;
r-t
1.00 Height
..,
\!.
Wid th
Interaction
~ 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-
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
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];
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
flkvren sze-
99
- (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
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
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
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
Az
elz,
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
-(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
vgez.
gyakorlati rsz azt mutatja be, hogyan vltsunk kt nzet kztt, s homegfelel
View ControllerreL
103
Simui.ard Interbec
D~~:menu
Sutuslar
'-''
""=-===--===': yn":'
Too..,.
aonott'l
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~
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)
.... ,..
'
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 {
104
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).
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
.m
NSObje_ct subclass
.m
UIT~bleViewCell
.m
UITabltViewControllu
subdan
subclass
Ap~e.Scnpt
.m
UMew subclass
.m
.m
Unn Tut Case class
Ru by
Sync Servku
"""''
PrevKtus
4.23. bra
AppleSen p t
C and C++
CMbon
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
Se<.ondViewContT1
Sec:Oild'oo'te\.Controtte
'JCE.t~Le
4.25. bra
uteontrot
UIO~te.Ptcker
Ullmage.PickerConuoller
n u11tli UllmigeVIew
4.26. bra
107
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
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
1. Az
elemvezrl
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,
110
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
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.
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
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
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. 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
[[UIAlertview alloc] initWithTitle:@"oate and time selected" message:[formatter stringFromDate:selectedDatePicker.date] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
- (void)deal loc { //- -- release the memory used by the property--[selectedDatePicker release]; [super dealloc];
114
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;
115
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.
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
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 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
117
Bevitel a
billentyzetrl
klnbz
beviteli
lehetsgekre?
billentyzetet
billentyzetet?
hogy a
billentyzet
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
Content
5.3. bra
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
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
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
125
UIViewcontroller {
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
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
PUiizc
Corr:t.Jan
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
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
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
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.
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
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];
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.
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.
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.
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
vlik.
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.
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)
5.20. bra
134
Billentyzet
jelenltnek rzkelse
View
<
OK
5.21. bra
ro
VIew
OK
5.22. bra
mez t
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.
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
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
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 is done editing- --(void) textFieldoidEndEditing:(UITextField *) textFieldview { [UIView beginAnimations:@"back to original size" context:nil]; scrollview . contentsize = scrollvieworiginalsize; [UIView commitAnimations];
}
*)
notification
/1---gets the size of the keyboard--NSDictionary *userrnfo = [notification userrnfo]; NSValue *keyboardvalue = [userrnfo objectForKey:UIKeyboardsoundsuserrnfoKey]; [keyboardvalue getvalue:&keyboardBounds];
}
*)
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];
*)
textFieldview {
return NO;
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
5.24. bra
A keyboardBounds a
billentyzet
billentyzet
mrett trolja
(fleg
billentyzet
magassgt). Habr a
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,
kperny
nagysgt:
-(void) viewDidLoad { scrollvieworiginalsize = scrollview.contentsize; applicationFrame = [[UIScreen mainscreen] applicationFrame]; [super viewoidLoad];
140
Billentyzet
jelenltnek rzkelse
rnieltt
a View
feltnik
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,
-(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];
}
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];
}
els
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];
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.
144
A kperny forgatsa
A FEJEZET FBB RSZEl A KVETKEZK:
a ngy
klnbz kpernytjols
az eszkz elforgatsakor
bekvetkez
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.
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.
6.2. bra
146
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
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
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
Az
elz
fekv
mdokat.
A forgats kezelse
Az iPhone SDK
elemvezrlje
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
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
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
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
A metdus a
kvetkez:
jelli msodpercekben.
willAnimateRotationTolnterfaceOrientation:
A wi ll RotateTointerfaceori entati on: esemnyen kvl mg egy esemnyt kezelhetnk a
forgats elkezdse vetkezik be.
eltt:
esemnyt.
eltt
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:
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.
megfigyelhet,
152
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
- -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
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
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
6.11. bra
kvetkez
UIViewcontroller {
9. Adjuk hozz a
fjlhoz:
kvetkez
- (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
else
{
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
rendezzk
156
if (destorientatio n ;; UIInterfaceorientationPortrait)
{
btn.frame; C GRectMake(180,243,280,37);
vagy
egy adott tjolsi mdban jelentjk meg a kpernyt, amikor a nzetet betltttk
157
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.
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
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.
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
159
-:---~~~-::>:-,
'=:::~-:::--.
~:_:~~-
...._, , "-..::
e ) RSZ
i Phone-alkalmazsok
kszitse
7.
Elemvezrlk ......................................................
163
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
( -~~~~~!:_-:_~~~l__f?!~~L -~MM<w
File frAme
Cor~r~ph.cs . fr-~mewortc
Foundatlon1r.tme.worlt
MU\Wlndow.xb
WinlasedApp .. lf'lfo.pOs:t
Findluults SCM
. . . . . . ctSymbob
_..(!J Bookmv1u
lmpkmtntatlon ftles
Y . NIBFiiH
~ .,.JnWlnd-.xob
-OQOU -
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
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,
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
lm.tge Picke:r..
ObJtct
t.
View Controlfer
,,
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
0
OweMew
Clusts
':!] WinBosedAppAppO.I<gt
~ WinhndAppAppDe.lt9i-t
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
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
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
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];
}
@end
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
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.
file-
G_. MySuondVteWController.h
MySecondVteWControlltr.m
~ GJ
Winll.lsedAppAppDele
MyVJewCon~rolle.r. h
"" NyVtewControlltr.m
MtfSttonc:MewContro
(;} ~condViewContro
Oth.tr Sources
7.12. bra
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];
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
173
7. fejezet:
Elemvezrlk
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];
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
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
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
mveleteket
hasznlhatjuk:
urcontrolEventTouchoown urcontrolEventTouchoownRepeat urcontrolEventTouchoragrnside urcontrolEventTouchoragoutside urcontrolEventTouchDragEnter urcontrolEventTouchoragExit urcontrolEventTouchuprnside urcontrolEventTouchupoutside urcontrolEventTouchcancel urcontrolEventvaluechanged urcontrolEventEditingoidBegin
177
7. fejezet:
Elemvezrlk
Valamennyi
iphone/library/ documentation/ UIKit/ Reference/ UIControl_Class / Reference/ Reference . html#// apple_ref/doc/ constant_group/ Control_Events cnen.
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
-(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]; */
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];
180
A nzetvltsok animlsa
A nzetvltsok animlsa
Az
elz
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
=
kvetkez
[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
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-
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.
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];
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
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
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
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
, Device_:- 3.0
Groups & Files
l Debu_L
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
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
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!
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.
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
8.4. bra
,.._, Tab Bar Controller
."
IT) '
NIS Niime
,.--
SecondV~
View
ll
LN.de
Sw!ru!~:>Y
--
ITI
S.Cond
8.5. bra
191
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.
osztlyt, hogy
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];
}
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 .
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.8. bra
.~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
(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).
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
@end
kvetkez
197
8. fejezet: Eszkzsv- s navigcis alkalmazsok #import "searchviewcontroller.h" @ implementation searchviewcontroller - (void)searchBarsearchButtonclicked:(ursearchBar *)searchBar
{
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
...
,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
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
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:
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
201
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
.__
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
ncvtgaltonController;
l:!J BookmMks
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
@ 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.
- (void)applicationDidFinishLaunching:(UIApplication *)application {
6. Hozzadjuk
navigcivezrl
alkalmazs betltdsekor.
203
MainWmdow.xb
Name
Type
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.
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];
kvetkez
//---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
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];
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
207
Oetatl.sV1ew,xib
Label
File's Ov.-ner F1rn Rtsponder
I!IZJ
8.23. bra
@property (nonatomic, retain) Ullabel *label; @property (nonatomic, retain) NSString *textselected; -(id) initWithTextselected:(NSString *) text; @end
lv
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:
- (voi d)viewoidLoad { [label setText:[self textselected]]; self.title = @"Movie Details"; [super viewoidLoad];
@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
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;
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
- (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.
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
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.
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];
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
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
["'
" --
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
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
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
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,
218
Segdprogramok ksztse
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> {
}
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];
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.
controller . delegate
self;
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
J)
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
fil\
.._,.
Own'
o o o o o o o o o o o
o
-: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
:::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;
221
9. fejezet: Segdprogramok
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
222
O tf
.d1SC.P
:;::-
~0.:'6
:..l.i
Weather
Singapore
"='
- ..... y....
c......
Belfing
New York Mills, MN
C.llfomla City
~ TalpelCity
--c!:::::1
9.7. bra
X'Wtrr~OJ
YAHOO!
NaV1g.ltTon hem
Toolbit
.......
Fltxtble
Sp~c.e
,.........,
. Flxtd
Sp~ct. 8~
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
AcloOn
l'!> y
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
,... ,..
Stmutator- 3:_0--'I_De_b_u_,g'-----------'
o-view
J"l. AddCountryViewC
Suilel
ActiOn
jll'll
"
~ AddCountryVlewControllu.m
[;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
226
#import "Addcountryviewcontroller.h" @implementation Addcountryviewcontroller //---synthesize the delegate--@synthesize delegate; //---invokes the method defined in the protocol-- - (IBAction)done { [self.delegate addcountryviewcontrolleroidFinish:self];
kvetkez
//--- 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
kvetkez
227
9. fejezet: Segdprogramok
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,
tatja a
+ gomb megnyomsakor.
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
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];
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:
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
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
230
Rs -_-z
--~-
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.
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
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
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':'
'"'"-''
Palo Alto
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
//---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
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
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
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
tmbbl,
- (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
kt
- (NSString *) tableview:(UITableview *) tableview titleForFooterrnsection :(NSinteger)section { //---display "by Denzel washington" as the footer--return @"by Denzel washington";
Ha beszrjuk az
elz
futtatjuk az alkalmazst, a Tablenzet fejlce s lblce a 10.5. brnak megfelelen lthat lesz.
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).
Resources map-
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
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.
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
View
~.""''"
San 01 San F1
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
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
=
Miutn visszakerestk a kijellt filmet, jelertsk meg a UIA l ertview osztly segtsgve!: NSStri ng *msg
=
%@ ",
urAlertview *alert
[[UIAlertview alloc] initWithTitle: @" Movie selected " message:msg delegate : self cancelButtonTitle: @" OK" otherButtonTitles:nil];
Mov1e selected
You have selected Remember the
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
@ 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).
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&
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
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
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
ltem2 T 2007
lteml '9' 2008 ..... l
lttm l
lnstde Man
n ner
Oeja Vu
.~
lltf
String
String
10.14. bra
kvetkez
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;
}
@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
250
Szakaszok megjelentse
-g
---",
-:-
Sc.roll Style
Dt.f.auk
HonzontOll
Sc.rollen
IS!! Vtnico~l
Scrolling
En~bled
O O
Footer
Zoom
P.;r.ging En,;r,bled
Dirtetton lock
~ Bounce ScroU
~'='~~
Min
Mu
O Bounct: Zoom
Touch
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
Kulcs
2000
rtk
2001 200 2
2004 2006
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
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];
lv
val s~uk
meg, a
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;
}
Pl ai n-re. Ha Grouped stlusra lltottuk, az index tfedsben lesz a Tab le nzet elrendezsvel.
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
. . . . ' .
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
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
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
billen ty
zuk r a File's Owner elem et a Search Bar elemre, majd vlasszuk a searchBar-t.
kvetkez
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
[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
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;
11---fired before a row is selected--- (NSindexPath *)tableview :(UITableview *)theTableview willselectRowAtindexPath: (NSindexPath *)indexPath { if (canselectRow) return indexPath; else return nil;
260
Szakaszok megjelentse
- (void)viewoidunload { ll Release anything that can be recreated in viewDidLoad or on demand. ll e.g. self.myoutlet ~nil;
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
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
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];
keress vba,
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
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
kvetkez
~ ~
The Humcane
~ ~
10.26. bra
A hrom
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
klnbz
266
Szakaszok megjelenitse
(Q
~
2000)
-
Malcolm X
l ~~
~ t~
12001 200 2
-'-..:--"
t~
ll
1--J!Ji
t a bleVte w:dtdSelectRowAtindexPath:
tableVlew:occessoryButtonToppedForRoWWithindexPo th:
10.27. bra
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-
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
Tma
Tulajdonsglista hasznlata a Table nzetben
Alapelvek
A
kvetkez
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.
Valstsuk meg a
kvetkez
metdusokat
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
268
Alkalmazsbellitsok
A FEJEZET FBB RSZEl A KVETKEZK:
Hogyan adhatunk hozz alkalmazsbellitsokat az alkalmazsunkhoz? Hogyan Hogyan
rhe~k
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.
Photo a
ApplicationSettinga
Utlllty4pp
11.1. bra
Choose:
il
Bundle
User
lnttrfo~cH
MacOS X
Applc:ript
C ind C++
C.Jrbon
~ s cr l ption
Purt,J.i~
Pure Python
Ru by
Sync ServicH
Prevous
11.2. bra
270
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
Products
Q. Find Resulu
~L:!l Bookmvks
Pre.fe.re.nce.Spedflers tum l
Array
Dlcttonary
e ProJect Symbob
SCM
TYJI<
Ti tie
Stnng ,Stnng
Dictionary
,String
PSGroupSpeofler
Group
!tem 2
Tvo<
Titfe
PSTextfieldSpecifler
Name
Stnng
v
DefaultValue
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
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
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
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
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.
kvetkez
kulcsokat
hasznlha~uk:
Type,
Title, Key, oefaultvalue, rssecure, KeyBoardType, AutocapitalizationType s Autocorrecti onType. Minden kulcshoz bellthatjuk a megfelel rtk t.
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
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.
: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.
Key
:T
nz ki.
+J
11.7. bra
megfelelen
275
T Root
_'Jalu~_
I t~
StringsTa ble
T
Root
It~
: 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 ite
1.
cn;
=J
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
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.
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
~~.
.ltt'nS '
~ ~ictionary String
2 ite'TIS)
. .
'
+1
11.11. bra
Key
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)
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
"
\String String
11.12. bra
277
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).
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
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.
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
kvetkez
@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
#import "'Flipsideviewcontroller.h"' @implementation Flipsideviewcontroller @synthesize @synthesize @synthesize @synthesize delegate; loginName; password; favoritecolor;
281
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
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 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
Hogyan mkdik?
Ez idig minden
mveletnk
elksz
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-
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
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
trtn
ti t l eForRow: forcomponent: metdust. //---populating the Picker view--- (NSString *)pickerview:(UIPickerview *)thePickerview titleForRow:(NSinteger)row forComponent:(NSinteger)component { return [colors objectAtindex:row];
}
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-
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
- (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
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"];
Documents
PLAUS Desktop
Prerere.nce:s
com.apple: .PeoplePICker .pltst
1)
~menglu
Apphc:attons
Ooc.uments
11.19. bra
288
1. Szrjuk be a
kvetkez
#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
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.
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"];
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 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.
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/.
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>
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.
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
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;
}
//---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];
5. Ha a Pinderben az alkalmazs oocuments mappjba lpnk, lthat a data . txt fjl (lsd a 12.2. brt) .
.......
Applicauons E::! iDt.sk
p ,.,, -
!J Desktop
~ wtunenglee
'\ Apphcah01ts
Oocunw:nu.
12.2. bra
297
billentyvel),
Hogyan mkdik?
Elszr
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
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
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
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
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])
{
= =
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
//---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] ;
299
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
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.
.IPhone OS
A.sst.mblyF~
CluJ Wodtl
Conft9U"tl0n
SdnngJ r ...
.ex p
"q,~x
(tnp(yfl1t
Exports file
CWC+
~
Coeoa
tntt.rf~u:
P'Ut'tJ,iV~
lutlder SOk
""""""""' Ru
by
!rtVIOU~
12.4. bra
301
...
Flnd
ltt:sul~s
L!laoolt.m.arb
..... ,..,
12.5. bra
SCM
ttt.ml
lll'fn 2 lt*rt'l J
SI ""9
~-
~~sTtn
..".y
Slnng
.......
tv.Wh~r
St ""9
lltll
.Canblirt~y
litfl'nS)
.... l
lttm 2
.. tttry Monttor
ISyt:ttMII'IfO
//---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
//---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];
}
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
ltem 2
\tem 3
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
Array
lte.m l
\tem 2
String
Stnng
String
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
...,
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
//---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
NSDictionary *dict
ll ...
}
kvetkez lpsben Icilistzzuk a sztrobjektumban lv kulcsokat, s kirjuk az egyes alkalmazsneveket a Debugger Console ablakban:
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
rhet
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
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
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
beolvassa
A fjl megltnek ellenrzse
308
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
309
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.
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.
:J
r::
" '
\tr i
'--------------.J
l l
312
Az SQLite3 hasznlata
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
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"];
@e nd
313
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.
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
@end
Hogyan mkdik?
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* 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 */
be.
Maontosh HD
t:i !01Sk
.. PlA<IS
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
Tbla ltrehozsa
Ez a folyamat egyetlen
tdust:
lpsbl
-(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
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
1.
filePath {
*)
tableName
318
, '%@')" ,
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
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];
kveten
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];
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,
telezzk, h ogy az
n z ki:
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) ;
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
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:
-(void) openos { // . . .
*)
tableName
-(void) insertRecordintoTableNamed: (NSString *) tableName withFieldl: (NSString *) fieldl fieldlvalue: (NSString *) fieldlvalue andField2:(NSString *) field2 field2value: (NSString *) field2value {
// . ..
322
- (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];
}
@ end
323
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
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.
kvetkez
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
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.
326
~--::::~---.::-----------
-.....o~-
'--s2'.
~-;.
'"'
RSZ
Fej lett i Phone-programozsi mdszerek
14. Tbbrintses alkalmazsok programozsa .... 329 15.
Egyszer
16. A beptett alkalmazsok elrse ...................... 365 17. Hozzfrs a hardverhez .................................. 391
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.
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.
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
.. L:!JBoolululrks , .. SCM
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
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
lntenction
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])
{
urviewcontentModescaleAspectFit;
urviewcontentModecenter;
} break;
} }
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
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])
{
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 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.
335
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])
{
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
//---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
ugyan-
kattintunk.
337
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
338
. .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
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
-(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
//---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
=
>
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;
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
// .. . /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
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
{
>
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
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-
14.9. bra
14.10. bra
346
// ---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
if (touchPoint.x > imageview.frame.origin.x && touchPoint.x < imageview . frame . origin.x + imageview.frame.size.width &&
347
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
nzetvezrln:
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
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.
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
Tg
Dnwlng
x
Wldth
IntenelJOn
Heght
15.1. bra
350
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
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
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
kvetkez
-(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
@end
Hogyan
mkdik?
betltdtt,
Amikor a nzet
az
els
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];
CGPointMake(l2.0,4.0);
354
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
=
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
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;
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
vcik i dkzt . gy az idkz megvltoztatsnak egyetlen mdja a jelenlegi elhagysa, majd j NSTimer objektum ltrehozsa . ~
il
......
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.
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
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,
falh oz r.
@ property (nonatomic, retain) urimageview *imageview; property (nonatomic, retain) urslider *sl i der; @ - (IBAction) sliderMoved:(id) sender; @ end
kvetkez
-(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
[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];
}
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.
Forgats
tmrerezs
364
bellrl? bellrl?
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
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
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
4. Szrjuk be a fjlba:
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
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
-(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
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
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
az URL-karakterlncnak, majd a
16.3. brt).
369
Az
elz
Az
elbbi
16.3. bra
16.4. bra
370
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.
371
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
##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
- (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
- (void)imagePickercontrolleroidcancel:(UIImagePickercontroller *)picker
{
//---user did not select image/video; hide the Image Picker--[picker dismissModalviewcontrollerAnimated:YES];
}
9.
16.6. bra
374
10. Az alkalmazs betltse utn koppintsunk a Load Photo Library (Fnykptr betltse) gombra, gy a Photo Albumok megjelennek az iPhone Simulatoron Osd a
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
"vlaszt"
kezelfellet
- (IBAction) btnclicked: (id) sender{ //---the delegate that implements the methods defined in the protocols--imagePicker.delegate = self; //---type of source--imagePicker.sourceType
UIImagePickercontrollersourceTypePhotoLibrary;
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
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)
{
//--- 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
{
/l ...
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
- (void)imagePickercontrollerDidcancel :(UIImagePickercontroller *) picker //--- user did not select image/video; hide the Image Picker--[picker dismissModalviewControllerAnimated :YES];
}
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.
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];
kvetkez
kt, flkvrrel
377
@property (nonatomic, retain) UIImageview *imageview; -(IBAction) btnclicked: (id) sender; - (NSString *) filePath: (NSString *) fileName; - (void) saveimage; @end
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] ;
}
5. A
kvetkez
6. A
kvetkez
378
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
{
7. Ahhoz, hogy az alkalmazst valdi iPhone-on teszteljk, nyomjuk meg a Command-R gombokat.
379
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)];
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];
380
. " . .
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.
381
6. A
kverkez,
stsokat szrjuk be az AddressBookvi ewcontroller. h fjlba: #import <UIKit/ UIKit.h > #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h>
-(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,
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
- (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;
}
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
. . .
J
' .
G
L
G
16.10. bra
385
//---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:
387
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
*)
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
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
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.
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
klnbz
klnbz
pozciiban.
Pozci
Fggleges
x
ll helyzet
y
-1,0 0,0 0,0
z
0,0 0,0 0,0 0,0
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.
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
oldalrltlthet le.
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) .
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
@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.
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 ~
gyorsulsmrj
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
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
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.
396
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
---
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
#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
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
- (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 : ");
} }
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).
subcb.ss
roller subdass
'--
.m
.m
urYiewC.ontroller subcb.ss
.m
Unit THt .SI!
d.i!SS
C.rbon
Coco.1
UIKJLh> header.
Pure Python
Ruby
Sync SeMces
~eVIOIJSJ ~
17.6. bra
399
lehetsgre,
@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
.... J Type:
luikk,ldenti
17.7. bra
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 :
401
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
Alaprtelmezettknt azonban a nzet nem lehet az Responder metdust, hogy YES rtkkel trjen vissza: - (BOOL)canBecomeFirstResponder { return YES;
els
egy urvi ew alosztlyt (shakevi ew. m), gy fellrhatjuk az alaprtelmezett canBecomeFi rst-
Ekkor a nzet
teendnk
els
reaglknt
mkdik.
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:");
}
NSLog(@"motioncancelled:");
}
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
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
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
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.
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
405
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
#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
7. Szrjuk be a
kvetkez
#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
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,
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
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] ;
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
rszben ltrehozott projekt segtsgvel a GPSVi ew control ler .xi b fjlban ad junk hozz az nzetablak-
elz
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
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.
kvetkez
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
- (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
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
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
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;
}
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--}
tegyk a
kvetkezt
a . xi b fjlban:
418
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;
}
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
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];
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
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
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
File'sOwner
First Responder
N~
App Delegate
+ , t ted U_
Int
O.
nu
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
!ID
tnlo
N~me
'~
File'sOWMr
First Responder
U& Responder
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
,...
Cl;us
Movle:sUnV'tewControlle:r
;r
A<toon
TYP<
A.3. bra
423
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.
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
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
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
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
[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];
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];
}
426
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).
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.
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.)
427
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
#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
MainViewController.m
- (void)flipsideviewcontrolleroidFinish:(Flipsideviewcontroller *)controller { //---prints out the string obtained in the oebugger Console window--NSLog(controller.str); [self dismissModalviewcontrollerAnimated:YES];
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:
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
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.
430
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);
sszefgg
belltsokat trol, pldul az NSUseroefaults osztly belltsait. A tmp mappa ideiglenes adatokat trol, amelyeket az iTunes nem ment el.
431
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
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
kpernyn
egyszerre.
432
Vlasz a 3. krdsre
Az Optiorr billenty lenyomsval sznlelni tudjuk a tbbszrs rintst az iP hone Simulatorban.
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.
433
Vlasz a 2. krdsre
Az osztly neve: UIImagePickercontroller.
Vlasz a 3. krdsre
Az osztly neve: ABPeopl e Pi ckerNavi gationcontra ll er.
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.
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.
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
Appl.utton
WindOw--ba~
ApphatJon
ApphC&UOn
\\ .ndow-bued Cort:O..t.l
Appllc.&t.otl
Audro\JniU
Aut~tor
Actlan
Ducnptjon
Th~
~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
Exttnson
""'"
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
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
437
.........
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;
~tzot
co Ndt
( 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
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).
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,
telepthe~k
az alkalmazst.
mveletet. jellemzit.
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
"
"'
Tii(9
"'
e "'
Iul ld
~
""
Ouc.trau:
Ch~
Ali
8l.uldolndGo
..
.J EJw!
.... rd~Go
......
rind
a....
_v
T.a~b
Os~,
NIIl
..
"'
".
......
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
..................
....
~
CuStOf"'IU
tnspeor
~p.~rator
nuablt: Space
o:--'1
S.Udl
~
ldotOf
""" - of?.
"........",
...:>
QurdctJ.odd
9'
AddAW1bvtc Add
Add 'Mity
J.t:~bOnVtp
....
"""""
B.S. bra
~/
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
t~
(votd )vt~icLOOd
Ul j
~~~:liill:r-..:tlll:"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
lit) ;
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
- (votd)vl..Ou:t.- {
UIAI.rt'ltr *otert ([UIAiertYtew alloc] int [ "4 ,,... 1\MIC\cl..oad);
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
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'
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
= [UIAlertView
.
-. --..
--3 'L .
tt
8.10. bra
-~-
fO!:tJ
Iullel Iullel-Go
Ts~s
(l t:rt04
..- ..
.. MyKlllerAl)pVIewControfter.m 37 : 11J -v....o.d load '/'Tii>"l- vie-.Dlci:Oad to ilo oddlUonor.etup after ladinQ tt
- (votd)vt..Oidlood {
8.11. bra
443
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
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
al loe ]
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
to,
to wortal \Jiurtd
deleQOte:
~ett
('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
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
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
{
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.
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 {
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 ~ ..... ~
OtiiOt~
7~~1
....1""'-i...t>tl
:
o'l
.,.
um_"._fM9_lniP O,CS704cab01
""""'
~_".....tiOY
~...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
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)
{
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
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
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~
lNSObJeaJ
f r&mewor\.
IS.."!t<'I'IIUbnty/f~liU'I(Jtfr~
Ankbllity
Oodvod "'
)l;(cde
U hMbe
,_QtQ
~t~
""""" T"*
l.llll'lt" ... ll
Apol(,,~
UICllt.lio9
UIU.C.cht
r-.o.toon elff<lfl<t
W.T1p
IMot<tV-oau~
~a.ukftf-.
JOWid 1--...n
8.19. bra
449
Availability
(elrhetsg),
Related API (kapcsold API), Related D ocuments (kapcsold dokumentumok), Sample Code (programkdminta).
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
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,
reagl,
s deleglt.
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
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
~~~~~~t~~"?-~~~t-~l~~~~!~~e..~.u~:ng
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).
C.4. bra
453
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
Attributes Inspector
(attribtum-ellenr), (kapcsolatellenr),
Idencity Inspector
Az Inspector ablak a Tools );> Library (eszkzk );> knyvtr) rnenpontot vlasztva hivhat meg. Az albbiakban rszletesen bernutatjuk az Inspector ablakokat.
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
lnten.cton
W Mufttple: Touch
C.G. bra
C. 7. bra
Az Attributes Inspector ablak a Tools );> Attributes Inspector (eszkzk );> attribtumellenr) rnenpontot vlasztva hivhat meg.
455
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)
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
'
o View lcon.s ll View lcons And Labels QY View lcons And Descnptlons
View Controllr
Ul'le NC:ontr"' ~r
~
ror
(:rou"J
C.lO. bra
C.ll. bra
457
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.
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.
model in
N.avlg.ation Controller - A
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.
tN t
a set of view
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
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 {
459
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
elemekhez
trtn
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).
OK
C.16. bra
461
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
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
Otd [n d On b rt
[dlllnf1 (h.lnQotd
Edtn~
Old Sc-Qn
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.
C.20. bra
463
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-
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>
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.
~ 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
/1---someclass-h--#import <Foundation/Foundation-h> #import "Anotherclass_h" @interface someclass : NSObject //---an object from Anotherclass--Anotherclass *anotherclass;
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.
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-
[Someclass al l oc];
469
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.
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---
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
Megjegyzs Nhny programozsi nyelvben, pldul a C# s a Java nyelvben az osztlymetdusok statikus metdusknt ismertek.
//---instance methods---(void) dosomething; -(void) dosomething:(NSString *) str; -(void) dosomething:(NSString *) str withAnotherPara:(float) value ; //---class method--+(void) alsooosomething; @e nd
kvetkez
#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];
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.
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
Megjegyzs A knnyebb rthetsg kedvrt a "metdus hvsa" fogalmat hasznljuk, s ezzel hivatkazunk az Objective-C zenetkldsi mechanizmusra.
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
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
Az Objective-C nyelvvel kapcsolatban rdekessget jelent az, hogy hogyan hvunk egy
tbb paramterrel
rendelkez
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
=
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
Ezek a metdusok getter (lekrdez) s setter (befft) nven ismertek (nha accessor s mutator nven is emltik ket). Megvalsts uk a kvetkezkppen trtnik:
475
@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;
}
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
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
=
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];
}
return self;
}
-(void) dosomething { } -(void) dosomething:(NSString * ) str { } -(void) dosomething:(NSString *) str withAnotherPara:(float) value { } +(void) alsooosomething { } @ end
479
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.
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
=
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.
481
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
=
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
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;
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.
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
=
485
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];
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
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
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];
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];
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
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
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
=
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
= =
[[UrAlertview alloc] initwithTitle:@"Hello" message:@"This is an alert view" delegate:myoelegate cancelButtonTitle:@"OK" otherButtonTitles:@"Option 1", @"Option 2", nil];
491
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
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);
kvetkezkppen
nz ki:
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:
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
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
/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~
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.
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
l tdentlfiu: .
sortwi-rt Version z
Prov1sioning
Applications
Anlm1tion
0 .:.
E. l. bra
496
~
Acti'llty Vomtor
tCh at
a.o:sk
51Wtl1> PLAUP,
formauon
ll'!
VfYirt
gouuop
~--~tlgiH
.: ,Tunes
~Appi'(.it.l!(r!J
Drcc!,.".~,.l.i
'3
......
(l
~ 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
Svste:m Prl!ferences
"---------=-"'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
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
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.
E.4. bra
Vlasszuk a 2048 bites kulcsmretet s az RSA algoritmust (lsd az E.5. brt). Kattintsunk a Continue gombra.
Certficate Assistant
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
{ 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
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 .
.;~
l~~flrOf'JJ'II'OfU'
......
""- ~ 7,l00t
""'*~lb
Suopon CdW'
......_.Deu'-.""
-.......
._...T_\1chos
..-.. a..cc~......n-..
T.--.
lJ ~,~~'~U
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
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
.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
~C..,I>att-~tobulditiiiCI.",ul~~e
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
-~
"?...,, ---<~ -~
. _.,_ .. .-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
App ID Description:
n2DeveloEI_
Go&ack
E.9. bra
~~O~~~ - ~~~~~~n9 """ ;~I~;;; A
-. ~- ..-
-'N_,_
- .~--
~----~-;;..,
Setup
'Thf: UOtO ls
ill
;a
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
Device ID
1. .... -~-"'-
-.._. ~~j!:.t--.:)t+ir:.z't"C::_;..~<t.-~~-
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
Setup
Signlng Request ICSRJ utthz1ng the Keyd1.a.n Access application ln Mac OS X l eopard.
"J
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)
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
Setup
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~
App tD
Lurn1Dew:lop
Otvkt
MyiPhone
Cfflfute Niln'lt
r- c~c..
E.12. bra
~....- '..-~lOningAsst$~ .......-.--~~.._~c;-~~ " -
- .
Configur
,.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
gent:ra~.
E.13. bra
503
Downl~d
& tnsQJI
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
E.14. bra
~ -
----
Cancel
...
_...__.
__
E. lS. bra
504
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
..
' .. ..
+ 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
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
0 -----.. - -....
----
E.17. bra
Add Cortifiates
Do you want to add the cert tficare(s) from the file
"developer_identity.cer" to a keychain?
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
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
Team t.uder
private key
~-
M~
E.19. bra
OQO
0 to todc the logo lteyd\Ain n
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
log tn
Alllt!"S
loon
login
;. !..
Passwords Certlflcates
"
Keys
we .menglee
log tn
logm log1n log tn login
[J Wy Cemfleates
1'
Secure Notes
pnv;,u key
pubnc 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
#~
..
--~ ;:-~-:---::..:-
~~
v"C..-n ':"'...~~
.... ~-"':'
~:
Build & Go
Window, select
Oeb u g~
~vice ~
IPha ne os from
the L>evtce
lefl~dcomer
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
11>
Clanes
b:
E.22. bra
An1matlonAppDe1~ate.m
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
posttton . x,
(>~,~~--~~~--------------------------------~ 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
ldtnt1fit: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
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