{"id":5900,"date":"2011-02-17T17:08:42","date_gmt":"2011-02-17T16:08:42","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=5900"},"modified":"2011-02-17T17:08:42","modified_gmt":"2011-02-17T16:08:42","slug":"t085-creare-una-lista-di-preferiti-parte-1","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t085-creare-una-lista-di-preferiti-parte-1\/","title":{"rendered":"T#085 &#8211; Creare una lista di Preferiti (Parte 1)"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-00.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-00.jpg\" alt=\"t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-00\" title=\"t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-00\" width=\"200\" height=\"105\" class=\"alignleft size-full wp-image-5924\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-00.jpg 200w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-00-150x78.jpg 150w\" sizes=\"auto, (max-width: 200px) 100vw, 200px\" \/><\/a> Ciao a tutti colleghi sviluppatori \ud83d\ude42 Per il mio primo articolo su devAPP.it ho pensato di scrivere una guida che io stesso qualche tempo fa ho richiesto per questo blog attraverso il <a href=\"http:\/\/www.devapp.it\/wordpress\/forum\/\" target=\"_blank\">Forum<\/a>, ma che purtroppo, viste le numerose richieste, non \u00e8 ancora mai stata pubblicata\u2026 fino ad ora \ud83d\ude42 A quel tempo ero alla disperata ricerca di una guida per completare la mia prima applicazione per iPhone, &#8220;<a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/japanese-grammar-dictionary\/id407677358?mt=8&#038;partnerId=2003\" target=\"_blank\">Japanese Grammar Dictionary: Basic<\/a>&#8220;. Purtroppo, come dicevo, non l&#8217;ho trovata: n\u00e8 qui n\u00e8 altrove, quindi mi sono dovuto arrangiare da solo. Alla fine, tra documentazione Apple e l&#8217;aiuto di uno sviluppatore esperto sono riuscito nel mio intento: <strong>creare una tab che mostrasse una <em>tableView<\/em> con una lista modificabile di preferiti nella mia applicazione iPhone<\/strong>. Spiegare come sono riuscito a far questo e condividerlo con tutti voi \u00e8 proprio l&#8217;obbiettivo dell&#8217;articolo che vi accingete a leggere, che vi anticipo subito, sar\u00e0 diviso in due parti.<!--more--><\/p>\n<h4>Il progetto di partenza<\/h4>\n<p>Per semplificare le cose, ho creato un piccolo progetto da cui partiremo: una semplice applicazione formata da due tab, la prima contenente un&#8217;<em>UITableView<\/em> con tre elementi, la seconda contenente l&#8217;<em>UITableView<\/em> in cui mostreremo i nostri elementi preferiti. Vi invito, dunque, a <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/AddToFavorites-prima.zip\" target=\"_blank\">scaricare il progetto<\/a> &#8220;AddToFavorites&#8221; prima di proseguire.<\/p>\n<p>All&#8217;interno di questo pacchetto troverete il nostro progettino di partenza, con all&#8217;interno una cartella chiamata &#8220;Favorites Classes&#8221; contenente le classi che useremo nel corso di questo tutorial pi\u00f9 due immagini, &#8220;EmptyStar.png&#8221; e &#8220;FullStar.png&#8221; che useremo per il tasto &#8220;Aggiungi\/Rimuovi Preferito&#8221;.<\/p>\n<p>In questa prima parte dell&#8217;articolo vedremo come aggiungere il tasto &#8220;Aggiungi\/Rimuovi Preferito&#8221; all&#8217;interno delle detailView di ogni elemento, come salvare l&#8217;elemento tra i preferiti senza usare alcun database o plist (e come rimuoverlo dalla stessa lista, ovviamente). Nella seconda parte, invece, andremo a vedere come mostrare gli elementi salvati come preferiti nella tableView precedentemente creata nel secondo tab del progetto e vedremo inoltre come modificare la posizione dei vari elementi o come eliminarli dall&#8217;elenco senza accedere alla vista dettaglio corrispondente.<\/p>\n<h4>Passiamo a Xcode..<\/h4>\n<p>Prima di tutto, apriamo il progetto di partenza &#8220;AddToFavorites&#8221; in Xcode. Espandiamo quindi i gruppi &#8220;Classes&#8221; e &#8220;Resources&#8221; (sar\u00e0 pi\u00f9 comodo lavorare in questo modo). In Classes, creiamo un nuovo gruppo (cliccando con il tasto destro del mouse su &#8220;Classes&#8221;) e chiamiamolo, ad esempio, &#8220;FavoritesClasses&#8221; (tutto attaccato).<\/p>\n<p>Nella cartella &#8220;Favorites Classes&#8221; del pacchetto .zip scaricato, selezioniamo tutti i file e importiamoli nel progetto semplicemente trascinandoli direttamente nel gruppo &#8220;FavoritesClasses&#8221; che abbiamo appena creato, assicurandoci che l&#8217;opzione &#8220;Copy file into destination folder (if needed)&#8221; sia selezionata. Facciamo lo stesso per le due immagini, facendo attenzione, questa volta, ad importarle nel gruppo &#8220;Resources&#8221;. Ora abbiamo tutto ci\u00f2 che ci serve per poter procedere.<\/p>\n<p>A questo punto avrete notato che nel gruppo &#8220;Classes&#8221; sono presenti tre serie di file .h, .m e .xib chiamate rispettivamente Detail1, Detail2 e Detail3. Questi sono i file delle detailView che si apriranno rispettivamente selezionando le tre celle della tabella principale, che ho preparato per il progetto e che potrete vedere immediatamente se cliccate su &#8220;Build &#038; Run&#8221; in Xcode.<\/p>\n<p>In questa prima parte del tutorial lavoreremo fondamentalmente su queste tre serie di file, o meglio, mostreremo il lavoro solo su uno di questi tre (Detail1) baster\u00e0 poi ripetere il processo analogamente per le altre due.<\/p>\n<h4>Come salviamo i preferiti?<\/h4>\n<p>Come funziona il processo di salvataggio che stiamo per utilizzare? Fondamentalmente sfrutteremo delle tag preimpostate dove verranno temporaneamente salvati rispettivamente titolo e sottotitolo, che mostreremo in una riga della tableView con gli elementi preferiti (normalmente vorremo mostrare lo stesso titolo e sottotitolo che corrisponde allo stesso elemento nella tableView principale). A questo punto le salveremo in due array. Se le tag assegnate a un elemento sono presenti nei due array, allora l&#8217;elemento sar\u00e0 considerato &#8220;preferito&#8221;.<\/p>\n<h4>Un po&#8217; di codice<\/h4>\n<p>Prima di procedere, diamo uno sguardo ai files che abbiamo importato all&#8217;inizio. Iniziamo da &#8220;SyntetizeSingleton.h&#8221;. Di questo file non parler\u00f2 molto, per maggiori informazioni vi rimando a un&#8217;ottimo articolo che trovate sul blog <a href=\"http:\/\/cocoawithlove.com\/2008\/11\/singletons-appdelegates-and-top-level.html\" target=\"_blank\">Cocoa with Love<\/a>. Per ora vi basti sapere che questo \u00e8 uno dei files che si occupa di far in modo che la nostra lista di preferiti sia accessibile da qualsiasi classe. In Favorite.h e Favorite.m, invece, abbiamo semplicemente dichiarato due stringe, &#8220;favId&#8221; e &#8220;description&#8221;, le nostre tag. In FavoritesData.h e FavoritesData.m abbiamo inoltre definito i metodi che ci consentiranno di aggiungere o rimuovere un elmento ai preferiti.<\/p>\n<p>Andiamo quindi a modificare il file Detail1.m (non abbiamo necessit\u00e0 di toccare il suo header .h). La prima cosa che vorremo fare, sar\u00e0 quella di creare un tasto che si aggiorni a seconda che l&#8217;elemento sia gi\u00e0 un preferito o meno, mostrando come immagine una stellina gialla quando l&#8217;elemento \u00e8 gi\u00e0 preferito o una stellina bianca quando invece non lo \u00e8.<\/p>\n<p>Per una questione sia estetica che pratica, per far ci\u00f2 ho usato un &#8220;UISegmentedControl&#8221; con un solo elemento che pu\u00f2 essere ampliato a pi\u00f9 elementi facendo posto a pi\u00f9 bottoni nello stesso lato di una navbar. Copiate e incollate il seguente codice, facendo attenzione a rimuovere le precenti dichiarazioni di alcune righe:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/ importiamo i file Favorite and FavoritesData\r\n#import \"Favorite.h\"\r\n#import \"FavoritesData.h\"\r\n\r\n\/\/ definiamo il titolo e sottotitolo che vorremo mostrare nella tableView Preferiti\r\n#define FAV_ID @\"Titolo Riga 1\"\r\n#define FAV_DESC @\"Sottotitolo Riga 1\"\r\n\r\n\/\/ creiamo un tasto che si aggiorna a seconda che un elemento sia preferito o meno\r\n\/\/ questa implementazione ci serve per aggiornare lo stato del tasto\r\n@interface Detail1 (Private)\r\n\r\n- (void) rebuildButton;\r\n\r\n@end\r\n\r\n@implementation Detail1\r\n\r\n- (void) rebuildButton {\r\n\t\r\n\tself.navigationItem.rightBarButtonItem = nil;\r\n\t\r\n\tBOOL isFav = [[FavoritesData sharedFavoritesData] favoriteWithId:FAV_ID] != nil;\r\n\tNSString *starImage = isFav ? @\"FullStar.png\" : @\"EmptyStar.png\";\r\n\t\r\n    \/\/ Creiamo un SegmentedControl e lo aggiungiamo come rightBarButtonItem\r\n\tUISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:\r\n\t\t\t\t\t\t\t\t\t\t\t[NSArray arrayWithObjects:\r\n\t\t\t\t\t\t\t\t\t\t\t [UIImage imageNamed:starImage],\r\n\t\t\t\t\t\t\t\t\t\t\t nil]];\r\n\t\r\n\t[segmentedControl addTarget:self action:@selector(makeFavorite:) forControlEvents:UIControlEventValueChanged];\r\n\tsegmentedControl.frame = CGRectMake(0, 0, 35, 30);\r\n\tsegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;\r\n\tsegmentedControl.momentary = YES;\r\n\t\r\n\tUIBarButtonItem *segmentBarItem = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];\r\n\t[segmentedControl release];\r\n\t\r\n\tself.navigationItem.rightBarButtonItem = segmentBarItem;\r\n\t[segmentBarItem release];\r\n    \r\n}\r\n\r\n\/\/ l'azione che dev'essere eseguita quando il tasto viene premuto.\r\n- (void) makeFavorite:(id)sender\r\n{\r\n    Favorite *favorite = [[FavoritesData sharedFavoritesData] favoriteWithId:FAV_ID];\r\n    \r\n    if(!favorite) {\r\n        \r\n        Favorite *fav = [[Favorite alloc] init];\r\n        fav.favId = FAV_ID;\r\n        fav.description = FAV_DESC;\r\n        [[FavoritesData sharedFavoritesData] addFavorite:fav];\r\n        [fav release];\r\n        \r\n    }\r\n    else {\r\n        [[FavoritesData sharedFavoritesData] removeFavoriteById:FAV_ID];\r\n    }\r\n}\r\n\r\n- (void) _refreshFav{\r\n\t[self rebuildButton];\r\n}\r\n\r\n\/\/ in dealloc\r\n[[NSNotificationCenter defaultCenter] removeObserver:self];\r\n\r\n\/\/ in viewDidLoad\r\n[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_refreshFav) name:REFRESH_FAVORITES object:nil];\r\n    \r\n    [self rebuildButton];\r\n<\/pre>\n<p>Dai commenti nel codice dovreste capire come funziona il tutto. Non ci resta che ripetere il processo per i restanti file Detail2.m e Detail3.m cambiando in maniera opportuna le istruzioni #define, @interface e @implementation. Ora, se proviamo a cliccare su &#8220;Build &#038; Run&#8221; in Xcode e avviamo l&#8217;applicazione nell&#8217;iPhone Simulator, vedremo che \u00e8 presente il tasto &#8220;Aggiungi\/Rimuovi Preferito&#8221; e cliccandoci sopra l&#8217;immagine della stellina cambia (da bianco a giallo e viceversa).<\/p>\n<p>Per ora \u00e8 tutto. Vi ricordo che nella seconda parte, vedremo come mostrare gli elementi salvati come preferiti nella tableView precedentemente creata nella seconda tab del progetto e come modificare la posizione degli elementi o ancora eliminare quelli che non vogliamo pi\u00f9 visualizzare nel nostro elenco senza accedere alle relative viste dettaglio.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/AddToFavorites-parte-1.zip\"><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 tutorial, <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/AddToFavorites-parte-1.zip\">questo \u00e8 il nostro file di progetto.<\/a><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-01.jpg\" alt=\"t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-01\" title=\"t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-01\" width=\"376\" height=\"721\" class=\"aligncenter size-full wp-image-5921\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-01.jpg 376w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-01-156x300.jpg 156w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t085-Creare-una-lista-di-preferiti-xcode-iphone-ipad-01-78x150.jpg 78w\" sizes=\"auto, (max-width: 376px) 100vw, 376px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ciao a tutti colleghi sviluppatori \ud83d\ude42 Per il mio primo articolo su devAPP.it ho pensato di scrivere&#8230;<\/p>\n","protected":false},"author":539,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[574,88,72,242,133],"class_list":["post-5900","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-gestione-preferiti-xcode","tag-programmazione-iphone","tag-tabbar","tag-tutorial-xcode","tag-uitable"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/5900","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\/539"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=5900"}],"version-history":[{"count":23,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/5900\/revisions"}],"predecessor-version":[{"id":5931,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/5900\/revisions\/5931"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=5900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=5900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=5900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}