{"id":7335,"date":"2011-08-01T15:59:37","date_gmt":"2011-08-01T13:59:37","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=7335"},"modified":"2011-09-09T17:24:06","modified_gmt":"2011-09-09T15:24:06","slug":"t099-scopriamo-la-property-tag-e-impariamo-ad-usarla-durante-lo-sviluppo-di-applicazioni-ios","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t099-scopriamo-la-property-tag-e-impariamo-ad-usarla-durante-lo-sviluppo-di-applicazioni-ios\/","title":{"rendered":"T#099 &#8211; Scopriamo la property TAG e impariamo ad usarla durante lo sviluppo di Applicazioni iOS"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-00.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-00.jpg\" alt=\"property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-00\" title=\"property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-00\" width=\"150\" height=\"105\" class=\"alignleft size-full wp-image-7384\" \/><\/a> In questo nuovo tutorial di programmazione iPhone e iPad rispondiamo ad alcune richieste che arrivano dal <a href=\"http:\/\/forum.devapp.it\" target=\"_blank\">nostro forum<\/a> e nello specifico concentreremo la nostra attenzione su una particolare property presente in tutti gli oggetti dell&#8217;UIKit, il <strong>tag<\/strong>, ovvero un identificativo numerico che possiamo associare ad un nostro particolare oggetto. Questa propriet\u00e0, anche se sembra banale, \u00e8 in realt\u00e0 molto importante e ci permette di rintracciare i nostri oggetti in alcuni casi particolari. Andiamo a scoprire insieme di cosa si tratta.<!--more--><\/p>\n<p>Per capire il motivo dell&#8217;importanza della propriet\u00e0 &#8220;tag&#8221; dobbiamo analizzare cosa succede quanto creiamo un oggetto nella nostra applicazione. Vediamo un piccolo esempio.<\/p>\n<p>Per creare all&#8217;interno della nostra app un qualsiasi oggetto facente parte dell&#8217;UIKit siamo soliti utilizzare un&#8217;istruzione simile alla seguente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nUILabel * lblIp = [[UILabel alloc] initWithFrame:CGRectMake(75, 110, 150, 20)];\r\n<\/pre>\n<p>Cos\u00ec facendo non facciamo altro che definire un puntatore ad un oggetto di tipo UILabel chiamato &#8220;lblIp&#8221;. Attenzione, perch\u00e8 mentre lo sviluppatore associa il nome <em>lblIp<\/em> all&#8217;oggetto, il compilatore associa &#8220;lblIp&#8221; ad un indirizzo di memoria, che di fatto andr\u00e0 poi a puntare al nostro oggetto vero e proprio. A questo punto, quindi, il nostro oggetto avr\u00e0 un retain uguale a 1, necessiter\u00e0 di risorse (memoria) per poter essere utilizzato.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-01.jpg\" alt=\"property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-01\" title=\"property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-01\" width=\"275\" height=\"231\" class=\"aligncenter size-full wp-image-7385\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-01.jpg 275w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-01-150x125.jpg 150w\" sizes=\"auto, (max-width: 275px) 100vw, 275px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Solitamente, a questa prima riga di codice, seguono altre istruzioni in cui settiamo tutte le propriet\u00e0 che ci interessano della nostra Label (nelle istruzioni di esempio che seguono settiamo solo la nuova property &#8220;tag&#8221; su cui ci stiamo focalizzando, ma \u00e8 sott&#8217;inteso che potremo personalizzare tutto quanto sar\u00e0 necessario):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nlblIp.tag = 10;\r\n<\/pre>\n<p>Ora che abbiamo il nostro oggetto personalizzato, ci interesser\u00e0 sicuramente aggiungerlo ad una view all&#8217;interno della nostra applicazione, per farlo scriveremo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[view addSubview:lblIp];\r\n<\/pre>\n<p>Fermiamoci un attimo e vediamo cosa \u00e8 successo a questo punto. Il nostro oggetto \u00e8 stato aggiunto alla nostra vista &#8220;view&#8221;, il suo retain vale ora 2 e, se vogliamo che la vita del nostro oggetto, la label, sia gestita da ora in avanti dalla vista, dovremo rilasciarlo tramite la seguente istruzione:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[lblIp release];\r\n<\/pre>\n<p>Ecco che il retain della nostra label torna a 1 (grazie al rilascio) ma cosa pi\u00f9 importante, oltre ad aver aggiunto il nostro oggetto alla view, con il rilascio abbiamo definitivamente perso il puntatore all&#8217;oggetto.<\/p>\n<p>Ma se abbiamo perso questo importante riferimento, come possiamo usare ora la nostra label nel resto del programma?<\/p>\n<p>Grazie proprio alla property tag!<\/p>\n<p>Il tag, come accennato ad inizio articolo, non \u00e8 nient&#8217;altro che un identificativo numerico che assoceremo ai nostri oggetti. Questo identificativo dovr\u00e0 essere un numero intero maggiore o uguale a zero e il suo scopo \u00e8 proprio quello di recuperare un oggetto non avendo pi\u00f9 a disposizione il suo puntatore.<\/p>\n<p>Ecco spiegato come la propriet\u00e0 <em>tag<\/em> possa tornarci utile, \u00e8 evidente la sua importanza, non credete? <\/p>\n<p>E&#8217; chiaro che se abbiamo creato e personalizzato un oggetto \u00e8 nostro interesse utilizzarlo nel programma che stiamo realizzando. Per recuperare la label dell&#8217;esempio quindi, dopo averne fatto il release, dovremo scrivere:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nUILabel * lblTemp = (UILabel*)[view viewWithTag:10];\r\n<\/pre>\n<p>Naturalmente dobbiamo far capire al programma che l&#8217;oggetto che stiamo recuperando \u00e8 di tipo <em>UILabel<\/em> e quindi facciamo il casting alla view che viene ritornata dal metodo <em>[viewWithTag:10]<\/em>.<\/p>\n<p>Questa operazione \u00e8 possibile con tutti gli oggetti che fanno parte del framework UIKit, perch\u00e9 ereditano tutti da <em>UIView<\/em>.<\/p>\n<h4>Esempio pratico<\/h4>\n<p>Detto questo passiamo ad un esempio pi\u00f9 pratico. Supponiamo di avere una UITableView e che in ogni cella vogliamo inserire un bottone custom. Ecco sorgere il primo problema: come possiamo capire poi, durante l&#8217;utilizzo, a quale bottone corrisponde l&#8217;evento che abbiamo aggiunto?<\/p>\n<p>La risposta \u00e8 semplicissima, <strong>usiamo i tag<\/strong>!<\/p>\n<p>Vediamo come. Creiamo un nuovo progetto di tipo &#8220;Navigation-based&#8221;, arriverem\u00f2 cos\u00ec direttamente al sodo senza perderci in troppe chiacchiere e avremo a disposizione una bella tableView gi\u00e0 pronta su cui lavorare.<\/p>\n<p>Modifichiamo quindi il codice come segue:<\/p>\n<p>File RootViewController.h<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@interface RootViewController : UITableViewController\r\n{\r\n    NSArray * arraySource;\r\n}\r\n-(void)showTagButton:(id)sender;\r\n@end\r\n<\/pre>\n<p>Abbiamo aggiunto un semplice array che ci servir\u00e0 per inserire alcuni elementi nella nostra tabella, e il metodo che verr\u00e0 richiamato al tap su du un bottone (che aggiungeremo a breve nelle celle).<\/p>\n<p>Il sender \u00e8 molto importante perch\u00e9 ci permette di recuperare l&#8217;oggetto a cui \u00e8 stato aggiunto l&#8217;evento, da quest&#8217;oggetto recuperiamo il tag e cos\u00ec facendo abbiamo l&#8217;elemento esatto del nostro array (pi\u00f9 difficile dirlo a parole che a farlo via codice:))<\/p>\n<p>Passiamo al file di implementazione &#8220;RootViewController.m&#8221; e modifichiamolo come segue:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n    arraySource = [[NSArray alloc] initWithObjects:@\"primo\",@\"secondo\",@\"terzo\",@\"quarto\",@\"quinto\", nil];\r\n}\r\n<\/pre>\n<p>Qui non abbiamo fatto altro che allocare &#8220;arraySource&#8221; (il nostro array) e inizializzarlo con cinque stringhe di esempio.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\r\n{\r\n    return [arraySource count];\r\n}\r\n<\/pre>\n<p>Settiamo il numero di righe per sezione (nel nostro esempio abbiamo una sola sezione) e finalmente creiamo la nostra cella personalizzata, quella che conterr\u00e0 i vari button:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\r\n{\r\n    static NSString *CellIdentifier = @\"Cell\";\r\n    \r\n    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];\r\n    if (cell == nil) \r\n    {\r\n        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];\r\n        \r\n        \/\/Creiamo il nostro UIButton\r\n        UIButton * btnShow = [UIButton buttonWithType:UIButtonTypeCustom];\r\n        \/\/Lo personalizziamo\r\n        [btnShow setBackgroundImage:[UIImage imageNamed:@\"btnAdd.png\"] forState:UIControlStateNormal];\r\n        [btnShow setTitle:@\"tag\" forState:UIControlStateNormal];\r\n        [btnShow setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];\r\n        btnShow.frame = CGRectMake(200, 10, 70, 30);\r\n        \/\/Impostiamo la property tag di ogni button in modo che sia uguale all'indice della riga dove risiede ogni bottone\r\n        btnShow.tag = indexPath.row;\r\n        [btnShow addTarget:self action:@selector(showTagButton:) forControlEvents:UIControlEventTouchDown];\r\n        [cell.contentView addSubview:btnShow];\r\n    }\r\n    \/\/ Configure the cell.\r\n    cell.textLabel.text = [arraySource objectAtIndex:indexPath.row];\r\n    \r\n    return cell;\r\n}\r\n<\/pre>\n<p>La prima modifica che facciamo \u00e8 quella di cambiare il tipo di cella in <em>UITableViewCellStyleSubtitle<\/em> poi sempre dentro l&#8217;if creiamo il nostro bottone. Ricordiamoci la parte pi\u00f9 importante, quella del tag. In questo caso non occorre rilasciare in quanto i button sono stati creati tramite &#8220;buttonWithType&#8221;, anzich\u00e8 tramite il metodo &#8220;alloc\/init&#8221;, sono quindi in autorelease e non siamo noi responsabili della loro gestione (se avete dubbi in merito, andate a rispolverare qualche articolo sulla gestione della memoria sulle nostre pagine).<\/p>\n<p>Fatto questo impostiamo il titolo alla cella con la stringa presa dall&#8217;arraySource.<\/p>\n<p>A questo punto non ci rimane che implementare il metodo <em>showTagButton:<\/em><\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)showTagButton:(id)sender\r\n{    \r\n    UIButton * btnTemp = (UIButton*)sender;\r\n    int row = btnTemp.tag;\r\n    NSString * rowString = [NSString stringWithFormat:@\"tag: %i\",row];\r\n    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:[arraySource objectAtIndex:row]\r\n                                                     message:rowString\r\n                                                    delegate:self cancelButtonTitle:@\"Ok\" \r\n                                           otherButtonTitles:nil];\r\n    <div class=\"alert\"><button type=\"button\" class=\"close\">&#215;<\/button><div class=\"clear\"><\/div><\/div>;\r\n    <div class=\"alert\"><button type=\"button\" class=\"close\">&#215;<\/button><div class=\"clear\"><\/div><\/div>;\r\n}\r\n<\/pre>\n<p>Nella prima riga otteniamo il bottone dal sender, facendo un semplice cast, dal bottone otteniamo il tag che coincide con la riga impostata precedentemente e a questo punto visualizziamo una semplice UIAlertView.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-02.jpg\" alt=\"property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-02\" title=\"property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-02\" width=\"379\" height=\"733\" class=\"aligncenter size-full wp-image-7383\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-02.jpg 379w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-02-155x300.jpg 155w\" sizes=\"auto, (max-width: 379px) 100vw, 379px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Come vedete niente di complicato, con un piccolo esempio abbiamo visto come si utilizzano i tag e a cosa servono!<\/p>\n<p>Per qualsiasi dubbio o riflessione in merito ci trovate sul Forum, dove sicuramente qualcuno (me compreso) vi pu\u00f2 dare una mano.;)<\/p>\n<p>Buon lavoro!<br \/>\nAndrea Cappellotto<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/devAPP-property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-02-T99.zip\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"\" width=\"33\" height=\"40\" align=\"middle\" \/><\/a> Se avete problemi con il progetto presentato, <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/08\/devAPP-property-TAG-sviluppo-Applicazioni-iOS-iPhone-iPad-02-T99.zip\" target=\"_blank\">questo \u00e8 il link per scaricare il nostro esempio.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo nuovo tutorial di programmazione iPhone e iPad rispondiamo ad alcune richieste che arrivano dal nostro&#8230;<\/p>\n","protected":false},"author":136,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[773,270,856,854,857,855],"class_list":["post-7335","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-property-objective-c","tag-andrea-cappellotto","tag-property-tag","tag-property-xcode","tag-proprieta-tag-ios","tag-tag-objective-c"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7335","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/136"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=7335"}],"version-history":[{"count":23,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7335\/revisions"}],"predecessor-version":[{"id":7597,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/7335\/revisions\/7597"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=7335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=7335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=7335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}