fbpx Skip to content

Az elmúlt időszakban nem jelentkeztem új bejegyzéssel, mivel gőzerővel folytak a munkálatok, hogy elköltözzek a blog.hu-s oldalról egy saját domain-ra. Ez sikeresen befejeződött, így ezentúl az iphonefejlesztes.com illetve az iphonefejlesztes.info oldalról érhetitek el a blogom.

A mai bejegyzésben megmutatom, hogy hogyan lehet egy UITableView-t létrehozni, és kezelni. Nagyon egyszerű kis bejegyzés lesz, azonban rendkívül hasznos tud majd lenni. A tableView-k nagy előnye, hogy pontosan annyi elemet tölt be a memóriába, amennyit meg is jelenít. Így nagy memóriaigényű feladatokat sokkal hatékonyabban lehet megjeleníteni vele, mintha más logikai módszerrel végeznénk a megjelenítést.

MusicTweeter – Mutsd meg, hogy mit hallgatsz!

Esetemben ezzel akkor szembesültem, mikor a Covers-t készítettem. Ott egy ScrollView-ba raktam a felolvasott borítókat a program elején. A gond csak az volt, hogy mivel kicsit bugzik a MusicLibrary, mindig lefoglalt 256kByte memóriát minden képhez, amit nem szabadított fel. Emiatt hamar elfogy a memória, a telefon meg kilépteti az iPod-ot a háttérben, így a musiclibrary kérések time out-olnak, és az egész úgy omlik össze, hogy csak szép nézni. :) Erről részletesebben a következő bejegyzésben fogok írni majd 18-a környékén (addig sajnos egyetem). De aki kíváncsi a jelenségre, még a Covers 1.0 illetve Covers Free 1.0 így működik (az 1.1 már jó rég elfogadás alatt áll, szóval hajrá a letöltéssel mert eltűnik végleg :) )!

Na de visszakanyarodva a TableView-khoz. Egy ismerősöm, Kamocsay Lajos (www.codza.com) segített ebben a memóriás problémában, és Ő ajánlotta a TableView-kat. A mai bejegyzésben

  • Létrehozunk egy tableView-t
  • Feltöltjük adatokkal, és
  • Reagálunk az érintéseke.
A következő bejegyzésben pedig egy saját cellát fogunk megadni, amibe már képeket (album borítókat) is rakunk.
Na de kezdjük is el!

Természetesen egy új projekt, View-based template-el. Majd nyissuk is gyorsan meg a .xib fájlt, és húzzunk a view-ra egy UITableView-t. Csak két lényeges dolgunk van:
Állítsuk a datasource-t és a delegate-et a File’s Owner-re.

A következő művelet a header fájlban lesz!

Implementálni kell a UITableViewDelegate UITableViewDataSource delegátokat, továbbá létre kell hozni egy NSArray-t. Az egész header fájl így fog kinézni:

@interface MusicAppViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

NSArray *listData;

}

@property (nonatomic,retain) NSArray *listData;

@end

Az implementálása pedig szintén nagyon egyszerű. A következő logikai lépésekből áll:
  • A viewDidLoad-ban inicializáljuk a tömböt
  • Implementáljuk a numberOfRowsInSection, a cellForRowAtIndexPath illetve a didSelectRowAtIndexPath függvényt.
A viewDidLoad ezután így fog kinézni:

NSArray *array = [[NSArrayalloc] initWithObjects:@”Üdvözöllek”, @”a megújult”, @”oldalon”, nil];

self.listData = array;

[array release];

[superviewDidLoad];

 

 

A listData tömb fog szolgálni a TableView-nak forrásként. :) Szóval ennek az elemei lesznek megjelenítve.
A numberOfRowsInSection függvényben annyi dolgunk van, hogy visszaadjuk az elemek pontos számát.
Ezt egy sorban el lehet intézni, de azért álljon itt a teljesség kedvéért:

-(NSInteger)tableView:(UITableView *)tableView

numberOfRowsInSection:(NSInteger)section

{

return [listDatacount];

}

A következő függvény kicsit trükkösebb lesz. Itt visszaadjuk hogy pontosan melyik cella való a kért helyre, amit paraméterben megkapunk. Először a kód:

-(UITableViewCell *)tableView:(UITableView *)tableView

cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

NSUInteger row = [indexPath row];

static NSString *cellID = @”customCell”;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

if(cell == nil)

{

cell = [[UITableViewCellalloc] initWithFrame:CGRectZeroreuseIdentifier:cellID];

}

[cell setText:[listDataobjectAtIndex:row]];

return cell;

}

A row változó az integer értéke az adott sornak. Ezután felveszünk egy cella azonosítót, melyel hivatkozhatunk a mezőkre. Ennek akkor van fontosabb szerepe mikor custom cellákkal dolgozunk (lásd: következő bejegyzés). Ezután elkérünk egy cellát, melyet újra fel fogunk használni (ez biztosítja azt, hogy a memóriában csak az aktuálisan megjelenített van betöltve, mivel ha görgetjük akkor az eltűnő cellát frissíti az új tartalommal). Ezután egy egyszerű vizsgálat követezik, hogyha még nem volt lefoglalva a cell, akkor létrehozzuk. Az utolsó előtti sor beállítja a text tulajdonságát a tömbünk értékével, majd végül a függvény visszatér a cellával.
Na, már csak egy dolog van:
Mi történik ha rákattintunk egy cellára? Természetesen meghívódik egy függvény, mégpedig a didSelectRowAtIndexPath. Ennek az implementációja:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NSUInteger row = [indexPath row];

UIAlertView *tmp = [[UIAlertViewalloc] initWithTitle:@”TableView meg lett nyomkodva!”message:[NSStringstringWithFormat:@”Pontosan a(z) %d elem”,row] delegate:selfcancelButtonTitle:@”ok”otherButtonTitles:nil];

[tmp show];

[tmp release];

}

Ebben sincs semmi ördögi. :) Egyszerűen csak elkérjük hogy melyik cella is volt az, majd annak alapján futtathatjuk tovább a programot (betölthetünk egy új view-t vagy bármit). Jelen példában egy alertView-t dobok fel, hogy melyik cella lett megnyomkodva. :)
Remélem érthető volt!
Az eddigi szokásokkal ellentétben, most már van lehetőség forráskódot is közzétennem, így aki ellátogat az iphonefejlesztes.com oldalra, le is töltheti a mai munkánkat!

Olvasd el a hozzászólásokat is

No comment yet, add your voice below!


Add a Comment