{"id":4690,"date":"2010-10-18T17:35:11","date_gmt":"2010-10-18T15:35:11","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=4690"},"modified":"2011-03-16T11:22:58","modified_gmt":"2011-03-16T10:22:58","slug":"t076-utilizziamo-una-classe-esterna-per-passare-oggetti-tra-viste-differenti","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t076-utilizziamo-una-classe-esterna-per-passare-oggetti-tra-viste-differenti\/","title":{"rendered":"T#076 &#8211; Utilizziamo una classe esterna per passare oggetti tra viste differenti"},"content":{"rendered":"<p>Ciao a tutti, come promesso sul Forum oggi vi faccio vedere come utilizzare una classe esterna per passare oggetti tra viste. In particolare io la utilizzo sempre per creare le detailView delle UITableView.<br \/>\nL&#8217;idea di fondo \u00e8 questa: realizzare una classe in cui sono presenti ufficialmente due metodi:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- impostaValore\r\n- ottieniValore\r\n<\/pre>\n<p>La nostra classe verr\u00e0 inizializzata la prima volta che la utilizziamo e poi basta, cos\u00ec da poterci accedere.<!--more--><\/p>\n<h4>Iniziamo con il nostro progetto<\/h4>\n<p>Creaiamo un progetto &#8220;Navigation-Based&#8221;, che includer\u00e0 gi\u00e0 una tabella, e nel file .h definiamo un array e un viewController (ci servir\u00e0 per passare alla vista dettagli)_<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \r\n\r\n@interface RootViewController : UITableViewController \r\n{\r\n\tNSArray * arrayValori;\r\n\tUIViewController * temp;\r\n}\r\n\r\n@end\r\n<\/pre>\n<p>A questo punto passiamo al metodo &#8220;viewDidLoad&#8221; del file di implementazione .m e inizializziamo l&#8217;array:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad {\r\n    [super viewDidLoad];\r\n\tself.title = @\"Singleton\";\r\n\r\n    NSDictionary * dict1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@\"iPhone 3G\", @\"Questo \u00e8 un iPhone 3G\", nil] \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t   forKeys:[NSArray arrayWithObjects:@\"titolo\", @\"descrizione\", nil]];\r\n\r\n\tNSDictionary * dict2 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@\"iPhone 3GS\", @\"Questo \u00e8 un iPhone 3GS\", nil] \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t   forKeys:[NSArray arrayWithObjects:@\"titolo\", @\"descrizione\", nil]];\r\n\r\n\tNSDictionary * dict3 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@\"iPhone 4\", @\"Questo \u00e8 un iPhone 4\", nil] \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t   forKeys:[NSArray arrayWithObjects:@\"titolo\", @\"descrizione\", nil]];\r\n\r\n\tNSDictionary * dict4 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@\"iPhone 5\", @\"Questo modello non esiste\", nil] \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t   forKeys:[NSArray arrayWithObjects:@\"titolo\", @\"descrizione\", nil]];\r\n\r\n\tarrayValori = [[NSArray alloc] initWithObjects:dict1, dict2, dict3, dict4, nil];\r\n}\r\n<\/pre>\n<p>Su ogni dizionario abbiamo inserito un valore per &#8220;titolo&#8221; e uno per &#8220;descrizione&#8221; \u00a0che visualizzeremo nella &#8220;detailView&#8221;.<\/p>\n<p>Modifichiamo ora il metono &#8220;numberOfRowInSection&#8221; come segue:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {\r\n    return [arrayValori count];\r\n}\r\n<\/pre>\n<p>e nel metodo:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\r\n<\/pre>\n<p>inseriamo prima del &#8220;returm cell;&#8221; la seguente istruzione:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\ncell.textLabel.text = [[arrayValori objectAtIndex:indexPath.row] objectForKey:@\"titolo\"];\r\n<\/pre>\n<p>Proviamo ad eseguire sul simulatore. Dovremmo ottenere una tabella come questa:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/Schermata-2010-10-18-a-15.45.44.png\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/Schermata-2010-10-18-a-15.45.44.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-4694\" title=\"Schermata 2010-10-18 a 15.45.44\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/Schermata-2010-10-18-a-15.45.44-198x300.png\" alt=\"\" width=\"198\" height=\"300\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/Schermata-2010-10-18-a-15.45.44-198x300.png 198w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/Schermata-2010-10-18-a-15.45.44-99x150.png 99w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/Schermata-2010-10-18-a-15.45.44.png 320w\" sizes=\"auto, (max-width: 198px) 100vw, 198px\" \/><\/a><br \/>\n<\/a><br \/>\n<\/center><\/p>\n<h4>La classe &#8220;singleton&#8221;<\/h4>\n<p>Andiamo ora su <em>File -> New File<\/em> e selezioniamo &#8220;Objective-c class&#8221;. Verifichiamo quindi che la classe erediti da &#8220;NSObject&#8221; (altrimenti impostiamolo noi a mano)<\/p>\n<p>Chiamiamo questa classe &#8220;singleton&#8221;.<\/p>\n<p>Ecco cosa dovremo inserire nel nuovo file .h:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n@interface singleton : NSObject {\r\n\r\n}\r\n\r\n+ (void)impostaArray:(NSMutableArray *)valore;\r\n+ (NSMutableArray *)ritornaArray;\r\n\r\n+ (void)impostaItem:(NSMutableDictionary *)valore;\r\n+ (NSMutableDictionary *)ritornaItem;\r\n\r\n+ (void)impostaStringa:(NSMutableString *)valore;\r\n+ (NSMutableString *)ritornaStringa;\r\n\r\n@end\r\n<\/pre>\n<p>Abbiamo inserito 6 metodi, ogni coppia ci permetter\u00e0 di settare e ottenere array, dictionary e stringhe.<\/p>\n<p>Passiamo al file .m e definiamo quindi i metodi appena dichiarati:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nNSMutableArray *arrayCondiviso;\r\nNSMutableDictionary *itemCondiviso;\r\nNSMutableString * stringaCondivisa;\r\n\r\nstatic singleton *sharedClass = nil;\r\n\r\n\/\/ Con questo metodo imposto il valore dell'item condiviso\r\n+ (void)impostaArray:(NSMutableArray *)valore{\r\n\tarrayCondiviso = valore;\r\n}\r\n\r\n\/\/ Con questo metodo, prelevo il valore dell'item condiviso da qualsiasi classe\r\n+ (NSMutableArray *)ritornaArray{\r\n\treturn arrayCondiviso;\r\n}\r\n\r\n+ (void)impostaItem:(NSMutableDictionary *)valore{\r\n\r\n\titemCondiviso = valore;\r\n}\r\n\r\n+ (NSMutableDictionary *)ritornaItem{\r\n\r\n\treturn itemCondiviso;\r\n}\r\n\r\n+ (void)impostaStringa:(NSMutableString *)valore{\r\n\tstringaCondivisa = valore;\r\n}\r\n\r\n\/\/ Con questo metodo, prelevo il valore dell'item condiviso da qualsiasi classe\r\n+ (NSMutableString *)ritornaStringa{\r\n\treturn stringaCondivisa;\r\n}\r\n\r\n+ (singleton *)sharedManager\r\n{\r\n    @synchronized(self) {\r\n        if (sharedClass == nil) {\r\n            [[self alloc] init]; \/\/ assignment not done here\r\n        }\r\n    }\r\n    return sharedClass;\r\n}\r\n\r\n+ (id)allocWithZone:(NSZone *)zone\r\n{\r\n    @synchronized(self) {\r\n        if (sharedClass == nil) {\r\n            sharedClass = [super allocWithZone:zone];\r\n            return sharedClass;  \/\/ assignment and return on first allocation\r\n        }\r\n    }\r\n    return nil; \/\/on subsequent allocation attempts return nil\r\n}\r\n\r\n- (id)copyWithZone:(NSZone *)zone\r\n{\r\n    return self;\r\n}\r\n\r\n- (id)retain\r\n{\r\n    return self;\r\n}\r\n\r\n- (unsigned)retainCount\r\n{\r\n    return UINT_MAX;  \/\/denotes an object that cannot be released\r\n}\r\n\r\n- (void)release\r\n{\r\n    \/\/do nothing\r\n}\r\n\r\n- (id)autorelease\r\n{\r\n    return self;\r\n}\r\n<\/pre>\n<p>Non preoccupatevi se non capite tutto il codice, vi basta sapere che la prima volta che utilizzate questa classe lei chiama il metodo &#8220;init&#8221; e vi permette di utilizzarla per impostare un oggetto.<\/p>\n<h4>La classe &#8220;detailView&#8221;<\/h4>\n<p>Fatto questo procediamo nel creare la vista dettaglio. Andate in File -> New File e creiamo una classe di tipo &#8220;UIViewController subclass&#8221; con rispettivo file .xib (ma che non erediti da UITableView) e chiamiamola &#8220;detailView&#8221;.<\/p>\n<p>Ritorniamo un attimo al nostro RootViewController e nel metodo:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\r\n<\/pre>\n<p>Inseriamo il seguente codice:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n[singleton impostaItem:[arrayValori objectAtIndex:indexPath.row]];\r\n\r\ntemp = [[detailView alloc] initWithNibName:@\"detailView\" bundle:[NSBundle mainBundle]];\r\n\r\n[self.navigationController pushViewController:temp animated:YES];\r\n\r\n[temp release];\r\n\r\ntemp = nil;\r\n<\/pre>\n<p>Ricordiamoci di importare nel &#8220;RootViewController.h&#8221; sia la classe &#8220;singleton.h&#8221; che la &#8220;detailView.h&#8221;<\/p>\n<p>Passiamo alla classe detailView.h:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n#import \"singleton.h\"\r\n\r\n@interface detailView : UIViewController {\r\n\tUILabel * descrizione;\r\n}\r\n\r\n@end\r\n<\/pre>\n<p>Anche qui non abbiamo fatto altro che importare di nuovo la classe singleton e dichiarare un UILabel che conterra la nostra descrizione.<\/p>\n<p>Mentre nel file .m allochiamo semplicemente la label e ne impostiamo il testo ottenuto dalla classe singleton in questo modo:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad \r\n{\r\n    [super viewDidLoad];\r\n\tdescrizione = [[UILabel alloc] initWithFrame:CGRectMake(50, 200, 300, 20)];\r\n\tdescrizione.text = [[singleton ritornaItem] objectForKey:@\"descrizione\"];\r\n\t[self.view addSubview:descrizione];\r\n\r\n}\r\n<\/pre>\n<p>Ecco qui il nostro progetto con il passaggio di variabili.. quello che dovete fare \u00e8 semplicemente importare la classe, impostare il valore e poi ottenerlo.<\/p>\n<p>Ogni oggetto resta impostato finch\u00e8 non lo sovrascrivete, quindi potete anche richiamare piu volte<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n[singleton ritornaItem] \r\n<\/pre>\n<p>se non l&#8217;avete modificata prima.<\/p>\n<p>Ciao, alla prossima<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/10\/articolo4.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\/2010\/10\/articolo4.zip\">questo \u00e8 il nostro file di progetto.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ciao a tutti, come promesso sul Forum oggi vi faccio vedere come utilizzare una classe esterna per&#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":[270,621,620,242],"class_list":["post-4690","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-andrea-cappellotto","tag-passare-oggetti-tra-view","tag-singleton","tag-tutorial-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4690","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=4690"}],"version-history":[{"count":12,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4690\/revisions"}],"predecessor-version":[{"id":6248,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/4690\/revisions\/6248"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=4690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=4690"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=4690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}