{"id":5866,"date":"2011-02-14T12:37:56","date_gmt":"2011-02-14T11:37:56","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=5866"},"modified":"2011-02-14T12:37:56","modified_gmt":"2011-02-14T11:37:56","slug":"t084-differenti-tipi-di-view-controller-per-le-nostre-tabbar","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t084-differenti-tipi-di-view-controller-per-le-nostre-tabbar\/","title":{"rendered":"T#084 &#8211; Differenti tipi di View Controller per le nostre TabBar"},"content":{"rendered":"<p>Lo scopo di questa guida \u00e8 riuscire a scrivere un&#8217;applicazione basata sull&#8217;utilizzo di una <em>TabBar<\/em> che gestisca differenti tipologie di view controller, ovvero da una semplice <em>UIViewController<\/em> fino ad arrivare ad una basilare implementazione di <em>UINavigationController<\/em> e relative view associate. La guida si prepone inoltre di effettuare tutte le operazioni necessarie via codice, senza mettere mano in nessun caso ad Interface Builder.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/operabook\/id337935161?mt=8&#038;partnerId=2003\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner-OperaBook-iPhone-devAPP.jpg\" alt=\"banner-OperaBook-iPhone-devAPP\" title=\"banner-OperaBook-iPhone-devAPP\" width=\"468\" height=\"78\" class=\"aligncenter size-full wp-image-5871\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner-OperaBook-iPhone-devAPP.jpg 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner-OperaBook-iPhone-devAPP-300x50.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner-OperaBook-iPhone-devAPP-150x25.jpg 150w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><!--more--><\/p>\n<h4>Il nostro progetto<\/h4>\n<p>Iniziamo col creare un nuovo progetto, di tipo <em>Window-Based application<\/em> e diamogli il nome che preferiamo: io ho scelto &#8220;TutorialTabBar&#8221;. Fatto ci\u00f2, apriamo la cartella Classes: saranno presenti i file di header ed implementazione della classe che fa da delegato di <em>UIApplication<\/em>; non entriamo troppo nei dettagli, ma \u00e8 qui che viene scritto il codice per caricare l&#8217;interfaccia iniziale della nostra applicazione.<\/p>\n<p>La prima cosa da fare \u00e8 dichiarare il nostro <em>UITabBarController<\/em> e siccome esso sar\u00e0 presente sempre nella nostra applicazione, converr\u00e0 dichiararlo nel file di header, infatti:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n\r\n@interface TutorialTabBarAppDelegate : NSObject <UIApplicationDelegate> {\r\n\tUIWindow *window;\r\n\tUITabBarController *tabBarController;\r\n}\r\n\r\n@property (nonatomic, retain) IBOutlet UIWindow *window;\r\n@property (nonatomic, retain) UITabBarController *tabBarController;\r\n\r\n@end\r\n<\/pre>\n<p>Si noti come l\u02bcoggetto di tipo <em>UITabBarController<\/em> non \u00e8 un <em>IBOutlet<\/em> (come la variabile di tipo <em>UIWindow<\/em>, l&#8217;unica gestita tramite Interface Builder).<\/p>\n<p>Andiamo nel file di implementazione, individuiamo il metodo &#8220;application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions&#8221; e scriviamo l\u00ec il codice che servir\u00e0 a caricare appunto l&#8217;interfaccia della nostra applicazione.<br \/>\nCi servir\u00e0 un oggetto di tipo <em>NSMutableArray<\/em> in cui raccoglieremo mano a mano i diversi controller per i diversi Tab; allochiamo ed inizializziamo l&#8217;oggetto di tipo <em>UITabBarController<\/em>, impostiamo la sua variabile di tipo NSArray viewControllers come &#8220;controllers&#8221;, e rilasciamo appunto &#8220;controllers&#8221; (non ci serve pi\u00f9). Infine aggiungiamo alla window la view di <em>UITabBarController<\/em> (che sottolineo, non \u00e8 altro che una sottoclasse di UIViewController); senza dimenticarsi di includere l&#8217;oggetto UITabBarController in @synthetize (\u00e8 una property, quindi devo anche sintetizzarla) e di deallocarla nel metodo dealloc, otterremo un codice che somiglier\u00e0 a questo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"TutorialTabBarAppDelegate.h\"\r\n\r\n@implementation TutorialTabBarAppDelegate\r\n\r\n@synthesize window,tabBarController;\r\n\r\n#pragma mark -\r\n#pragma mark Application lifecycle\r\n\r\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    \r\n    \r\n    NSMutableArray *controllers = [[NSMutableArray alloc] initWithCapacity:3];\r\n\ttabBarController = [[UITabBarController alloc] init];\r\n\t\r\n\t\/\/ -----------------------------------------\r\n\t\r\n\ttabBarController.viewControllers = controllers;\r\n\t[controllers release];\r\n\t\r\n\t[window addSubview:tabBarController.view];\r\n    [self.window makeKeyAndVisible];\r\n    \r\n    return YES;\r\n}\r\n\r\n#pragma mark -\r\n#pragma mark Memory management\r\n\r\n- (void)dealloc {\r\n\t[tabBarController release];\r\n    [window release];\r\n    [super dealloc];\r\n}\r\n\r\n@end\r\n<\/pre>\n<p>Si noti come non ho fatto alcun cenno alla gestione della memoria, ed al perch\u00e9 su quell\u02bcoggetto di nome \u201ccontrollers\u201d \u00e8 stato fatto un release: non \u00e8 lo scopo di questa guida, quindi invito a chi non \u00e8 avvezzo a tale argomento a riguardarselo, per poter avere un\u02bcidea pi\u00f9 chiara sulle operazioni di retain e release. Ma voglio per\u00f2 dare una piccola spiegazione sul perch\u00e9 ho dato una capacit\u00e0 iniziale di 3 all\u02bcoggetto \u201ccontrollers\u201d: il<br \/>\ncompilatore sa che in questo array verranno inseriti almeno 3 oggetti, dunque invece di allocare tre aree di memoria differenti con un indirizzo per ognuna di esse, verr\u00e0 allocata una sola zona in cui inserirli e sar\u00e0 necessario un solo indirizzo per individuarli.<br \/>\nOvviamente il discorso non vale se non conoscete a priori il numero degli oggetti da inserire nell\u02bcarray.<br \/>\nPotete anche compilare ed eseguire: tutto funzioner\u00e0 alla perfezione, ma la TabBar sar\u00e0 vuota:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-01.jpg\" alt=\"t084-differenti-view-controller-nelle-tabbar-xcode-01\" title=\"t084-differenti-view-controller-nelle-tabbar-xcode-01\" width=\"321\" height=\"480\" class=\"aligncenter size-full wp-image-5876\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-01.jpg 321w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-01-200x300.jpg 200w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-01-100x150.jpg 100w\" sizes=\"auto, (max-width: 321px) 100vw, 321px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Aggiungiamo un UIViewController<\/h4>\n<p>Adesso aggiungiamo le diverse view alla TabBar. Create un nuovo file di tipo UIViewController, dategli un nome a vostro piacimento (io l&#8217;ho chiamato &#8220;Tab1ViewController&#8221;). Esso gestir\u00e0 una view, che a sua volta conterr\u00e0 una subview di tipo UILabel con un testo a piacimento. Quindi, nel file header dichiariamo un oggetto NSString che servir\u00e0 appunto ad impostare il testo dell\u02bcUILabel, ed aggiungiamolo come property:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n\r\n@interface Tab1ViewController : UIViewController {\r\n\r\n\tNSString *testo;\r\n}\r\n\r\n@property (nonatomic, retain) NSString *testo;\r\n\r\n@end\r\n<\/pre>\n<p>Nel file di implementazione invece utilizziamo il metodo <em>loadView<\/em> per caricare l\u02bcinterfaccia di questa view: creazione della view principale (che occpuer\u00e0 tutto lo schermo visibile), creazione dell\u02bc<em>UILabel<\/em> ed il suo posizionamento nella view principale, senza dimenticare del synthetize della NSString e della sua deallocazione:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)loadView {\r\n\t\r\n\tCGRect rectViewPrincipale = CGRectMake(0.0, 0.0, 320.0, 411.0);\r\n\tUIView *viewPrincipale = [[UIView alloc] initWithFrame:rectViewPrincipale];\r\n\t\r\n\tUILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 30.0, 300.0, 21.0)];\r\n\tlabel.textAlignment = UITextAlignmentCenter;\r\n\tlabel.text = testo;\r\n\t[viewPrincipale addSubview:label];\r\n\t[label release];\r\n\t\r\n\tself.view = viewPrincipale;\r\n\t[viewPrincipale release];\r\n}\r\n<\/pre>\n<p>Torniamo al file di implementazione del nostro AppDelegate: facciamo un import del nuovo file header e scriviamo il codice che serve a crearlo e ad aggiungerlo all\u02bcinterfaccia dell\u02bcapp: allochiamo ed inizializziamo, diamo un titolo, impostiamo la stringa da visualizzare a nostro piacimento, aggiungiamo il nuovo view controller all\u02bcarray controllers e poi lo rilasciamo. Compiliamo ed eseguiamo&#8230;<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    \r\n    \r\n    NSMutableArray *controllers = [[NSMutableArray alloc] initWithCapacity:2];\r\n\ttabBarController = [[UITabBarController alloc] init];\r\n    \r\n\t\/\/ -----------------------------------------\r\n\t\r\n\tTab1ViewController *tab1Controller = [[Tab1ViewController alloc] initWithNibName:nil bundle:nil];\r\n\ttab1Controller.title = @\"Tab 1\";\r\n\ttab1Controller.testo = @\"Testo di prova Tab 1\";\r\n\t[controllers addObject:tab1Controller];\r\n\t[tab1Controller release];\r\n\t\r\n\t\/\/ -----------------------------------------\r\n\t\r\n\ttabBarController.viewControllers = controllers;\r\n\t[controllers release];\r\n\t\r\n\t[window addSubview:tabBarController.view];\r\n    [self.window makeKeyAndVisible];\r\n    \r\n    return YES;\r\n}\r\n<\/pre>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-02.jpg\" alt=\"t084-differenti-view-controller-nelle-tabbar-xcode-02\" title=\"t084-differenti-view-controller-nelle-tabbar-xcode-02\" width=\"320\" height=\"480\" class=\"aligncenter size-full wp-image-5877\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-02.jpg 320w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-02-200x300.jpg 200w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-02-100x150.jpg 100w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Aggiungiamo un UITableViewController<\/h4>\n<p>Creiamo un nuovo file, questa volta sar\u00e0 un oggetto di tipo UITableViewController, e diamogli un nome (io ho scelto &#8220;Tab2ViewController&#8221;). Dichiariamo un nuovo oggetto nel file di implementazione, di tipo NSArray, il quale conterr\u00e0 tutti gli elementi da inserire nelle celle (in questo caso saranno stringhe); nel file di implementazione allochiamo ed inizializziamo l\u02bcarray (senza dimenticarci dei soliti synthetize e dealloc), in numberOfSectionsInTableView: ritorniamo il valore 1 (una sola sezione per la tabella), in numberOfRowsInSection: ritorniamo la dimensione dell\u02bcarray, ed in cellForRowAtIndexPath: invece \u00e8 tutto gi\u00e0 pronto, dobbiamo solo impostare il testo della cella recuperandolo dall\u02bcarray dei dati (non discuto sul come farlo, esula dagli scopi di questa guida l\u02bcimplementazione di una UITableView). Quindi dovreste ottenere una cosa del genere:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad {\r\n    [super viewDidLoad];\r\n\r\n\tvociTabella = [[NSArray alloc] initWithObjects:@\"iPhone\", @\"iPod\", @\"iPod touch\", @\"iPad\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t@\"iMac\", @\"Mac Pro\", @\"iBook\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t@\"MacBook\", @\"MacBook Pro\", @\"PowerBook\", nil];\r\n}\r\n\r\n\r\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {\r\n    return 1;\r\n}\r\n\r\n\r\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {\r\n    return vociTabella.count;\r\n}\r\n\r\n\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        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];\r\n    }\r\n    \r\n    cell.textLabel.text = [vociTabella objectAtIndex:indexPath.row];\r\n    \r\n    return cell;\r\n}\r\n<\/pre>\n<p>Sempre nel file di implementazione di AppDelegate, eseguiamo le solite operazioni: importiamo l\u02bcheader del nuovo UITableViewController, dichiariamo ed inizializziamo il nuovo oggetto (questa volta impostando lo stile della tabella), scegliamo un titolo, aggiungiamo il tutto all\u02bcarray dei controllers e rilasciamo. Compiliamo ed eseguiamo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-03.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-03.jpg\" alt=\"t084-differenti-view-controller-nelle-tabbar-xcode-03\" title=\"t084-differenti-view-controller-nelle-tabbar-xcode-03\" width=\"320\" height=\"480\" class=\"aligncenter size-full wp-image-5878\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-03.jpg 320w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-03-200x300.jpg 200w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-03-100x150.jpg 100w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Notate come UITableViewController si occupa in maniera del tutto automatica del posizionamento di UITableView all\u02bcinterno dello schermo, a differenza che nel caso precedente dove eravamo noi a dover impostare le dimensioni; questo \u00e8 giustificato dal fatto che in un generico UIViewController Apple da allo sviluppatore la libert\u00e0 di fare ci\u00f2 che vuole con la UIView che questo controller deve gestire, mentre UITableViewController deve invece gestire UITableView, e dunque le dimensioni vengono calcolate in maniera<br \/>\nautomatica.<\/p>\n<h4>Aggiungiamo un UINavigationController<\/h4>\n<p>Proseguiamo col nostro tutorial: questa volta il terzo tab di UITabBar dovr\u00e0 contenere un <em>UINavigationController<\/em> che ci permetter\u00e0 di passare da una view all\u02bcaltra in maniera del tutto automatica. Per prima cosa, creiamo un nuovo UITableViewController ed eseguiamo esattamente tutte le operazioni effettuate precedentemente (ma proprio tutte!), in pi\u00f9 aggiungiamo un Disclosure Indicator alle celle della tabella, per indicare all\u02bcutente che \u00e8 possibile toccarle e visualizzare ulteriori dettagli per quella voce. Utilizzeremo il view<br \/>\ncontroller che abbiamo creato prima, ma con una piccola modifica: il view controller deve sapere se la sua view \u00e8 inserita in un UINavigationController o meno, per regolarne le dimensioni: quindi modifichiamo i nostri file aggiungendo una variabile di tipo BOOL che indica appunto se questa opzione si verifica o meno, ed implementiamo il tutto nel file .m:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n\r\n@interface Tab1ViewController : UIViewController {\r\n\r\n\tNSString *testo;\r\n\tBOOL viewInNavigation;\r\n}\r\n\r\n@property (nonatomic, retain) NSString *testo;\r\n@property (nonatomic) BOOL viewInNavigation;\r\n\r\n@end\r\n<\/pre>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\r\n    \r\n\tself = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];\r\n    \r\n\tif (self) {\r\n\t\t\r\n\t\tviewInNavigation = NO;\r\n    }\r\n    \r\n\treturn self;\r\n}\r\n\r\n- (void)loadView {\r\n\r\n\tCGFloat heightView = viewInNavigation ? 367.0 : 411.0;\r\n\t\r\n\tCGRect rectViewPrincipale = CGRectMake(0.0, 0.0, 320.0, heightView);\r\n\t\r\n\t\/\/ Tutto uguale a prima...\r\n}\r\n<\/pre>\n<p>Si noti come sia stato sovrascritto il metodo init del view controller: l\u02bcabbiamo fatto perch\u00e9 la variabile deve avere per forza di cose un valore, che sia YES o NO; io ho scelto quest\u02bcultimo valore come default.<br \/>\nAndiamo in AppDelegate, importiamo l\u02bcheader del nuovo UITableViewController, dichiariamo ed inizializziamo il nuovo oggetto (impostando lo stile della tabella) e scegliamo un titolo; adesso dichiariamo ed inizializziamo con il Tab3ViewController un nuovo oggetto, di tipo UINavigationController (sottoclasse di UIViewController), che si occuper\u00e0 del passaggio tra una view e l\u02bcaltra, ed includiamolo nell\u02bcarray controllers:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nTab3ViewController *tab3Controller = [[Tab3ViewController alloc] initWithStyle:UITableViewStylePlain];\r\ntab3Controller.title = @\"Tab 3\";\r\n\t\r\nUINavigationController *nav3Controller = [[UINavigationController alloc] initWithRootViewController:tab3Controller];\r\n[controllers addObject:nav3Controller];\r\n\t\r\n[nav3Controller release];\r\n[tab3Controller release];\r\n<\/pre>\n<p>Torniamo a didSelectRowAtIndexPath: e scriviamo il codice che ci serve per importare il view controller (il suo file header), allocarlo ed inizializzarlo, dirgli che siamo in presenza di un UINavigationController, impostare titolo e testo, ed eseguire l\u02bcoperazione di push sul suo navigation controller&#8230; che significa quest\u02bcultima cosa? \u00c8 presto detto: l\u02bcistruzione self.navigationController richiama appunto l\u02bcoggetto UINavigationController di cui<br \/>\nTab3ViewController fa parte: siccome \u00e8 quest\u02bcultimo controller ad essere visualizzato in primo piano in quel momento, dobbiamo dire ad UINavigationController che vi deve sostituire l\u02bcoggetto di tipo Tab1ViewController appena creato, eseguendo appunto un\u02bcoperazione di push. Fatto questo, lo rilasciamo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {\r\n    \r\n\tNSString *voce = [vociTabella objectAtIndex:indexPath.row];\r\n\t\r\n\tTab1ViewController *viewController = [[Tab1ViewController alloc] initWithNibName:nil bundle:nil];\r\n\tviewController.viewInNavigation = YES;\r\n\tviewController.title = voce;\r\n\tviewController.testo = voce;\r\n\t\r\n\t[self.navigationController pushViewController:viewController animated:YES];\r\n\t[viewController release];\r\n}\r\n<\/pre>\n<p>Compiliamo ed eseguiamo&#8230;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-04.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-04.jpg\" alt=\"t084-differenti-view-controller-nelle-tabbar-xcode-04\" title=\"t084-differenti-view-controller-nelle-tabbar-xcode-04\" width=\"320\" height=\"480\" class=\"aligncenter size-full wp-image-5879\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-04.jpg 320w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-04-200x300.jpg 200w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-differenti-view-controller-nelle-tabbar-xcode-04-100x150.jpg 100w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>La tabella che viene visualizzata nel terzo tab \u00e8 sensibile al tocco dell\u02bcutente: una volta toccata una cella, verr\u00e0 visualizzato un UIViewController, che prender\u00e0 il posto della tabella iniziale tramite un\u02bcanimazione di scorrimento: di sostituzione ed animazione si occupa appunto UINavigationController, il quale \u00e8 anche responsabile della creazione del pulsante in alto a sinistra nella UINavigationBar (la barra di colore blu al in alto) utilizzato per eseguire l\u02bcoperazione cosiddetta di pop, e tornare alla tabella iniziale.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/t084-Tutorial-xcode-TabBar.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\/t084-Tutorial-xcode-TabBar.zip\">questo \u00e8 il nostro file di progetto.<\/a><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/operabook\/id337935161?mt=8&#038;partnerId=2003\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner-OperaBook-iPhone-devAPP.jpg\" alt=\"banner-OperaBook-iPhone-devAPP\" title=\"banner-OperaBook-iPhone-devAPP\" width=\"468\" height=\"78\" class=\"aligncenter size-full wp-image-5871\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner-OperaBook-iPhone-devAPP.jpg 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner-OperaBook-iPhone-devAPP-300x50.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/02\/banner-OperaBook-iPhone-devAPP-150x25.jpg 150w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lo scopo di questa guida \u00e8 riuscire a scrivere un&#8217;applicazione basata sull&#8217;utilizzo di una TabBar che gestisca&#8230;<\/p>\n","protected":false},"author":541,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[5,567,72,242,147,44,568],"class_list":["post-5866","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-objective-c","tag-pasquale-matrisciano","tag-tabbar","tag-tutorial-xcode","tag-uinavigationcontroller","tag-uiviewcontroller","tag-viewcontroller"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/5866","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\/541"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=5866"}],"version-history":[{"count":9,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/5866\/revisions"}],"predecessor-version":[{"id":5882,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/5866\/revisions\/5882"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=5866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=5866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=5866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}