{"id":2963,"date":"2010-04-08T16:29:20","date_gmt":"2010-04-08T14:29:20","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=2963"},"modified":"2010-04-12T09:01:16","modified_gmt":"2010-04-12T07:01:16","slug":"ipad001-usiamo-le-split-view","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/ipad001-usiamo-le-split-view\/","title":{"rendered":"IPAD#001 &#8211; Usiamo le Split View"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/iPad.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/iPad.jpg\" alt=\"Apple iPad\" title=\"iPad\" width=\"78\" height=\"100\" class=\"alignleft size-full wp-image-2973\" \/><\/a> Oggi vi proponiamo il primo di una lunga serie di <strong>Tutorial di programmazione iPad<\/strong>. Come sicuramente sar\u00e0 gi\u00e0 noto ad ognuno di voi, il nuovo dispositivo Apple, appunto l&#8217;iPad, monta una versione di iPhone OS, ovvero, lo stesso sistema che fa funzionare i nostri amati melafonini. Tra le poche differenze troviamo sicuramente qualche piccolo accorgimento dovuto all&#8217;evidente differenza di dimensioni dei display di questi due dispositivi. Imparerete quindi, con questa nuova serie di tutorial, a programmare anche il vostro iPad. Da oggi potrete creare 3 tipologie di applicazioni:<!--more--><\/p>\n<ul>\n<li>Applicazioni iPhone<\/li>\n<li>Applicazioni iPad<\/li>\n<li>Applicazioni Universali<\/li>\n<\/ul>\n<p>Queste ultime, le gi\u00e0 note e chiaccherate <strong>Universal Application<\/strong>, sono in grado di funzionare perfettamente sia su iPhone che su iPad. Questo sar\u00e0 sicuramente un bene per le vendite delle vostre creazioni, avrete di fatto un potenziale clienti maggiore, anche se vi toccher\u00e0 lavorare un briciolo in pi\u00f9. Potete rispolverare la memoria rileggendo l&#8217;introduzione a questo argomento con il nostro <a href=\"http:\/\/www.devapp.it\/wordpress\/l010-introduzione-alle-applicazioni-universali-per-iphone-os-ipad.html\" target=\"_blank\">primo articolo<\/a> su questo tema. Oggi non parleremo di Universal App, vedremo semplicemente come sfruttare una nuova caratteristica compatibile esclusivamente con iPad: le <strong>Split View<\/strong>.<\/p>\n<h4>Cos&#8217;\u00e8 una Split View?<\/h4>\n<p>Una <strong>Split View<\/strong> non \u00e8 nient&#8217;altro che una particolare vista composta. Immaginate di tenere il vostro iPad in modalit\u00e0 landscape (orizzontale), la split View in questo caso \u00e8 composta dall&#8217;unione di una classica TableView (sulla sinistra) utilizzabile ad esempio come men\u00f9 di scelta per l&#8217;utente e una UIView (sulla destra), o meglio DetailView, dove finiranno i contenuti veri e propri.<\/p>\n<p>In modalit\u00e0 portrait (verticale), invece, avremo sempre la View, questa volta a tutto schermo, corredata da comodissimo &#8220;Popover&#8221;, ovvero una tabella a comparsa che apparir\u00e0 dopo un tap nell&#8217;apposito tasto ad esso associato. Un paio di screenshot chiariranno facilmente eventuali dubbi:<\/p>\n<p><center><\/p>\n<div id=\"attachment_2964\" style=\"width: 604px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_landscape.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2964\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_landscape.jpg\" alt=\"IPAD 001 - Split View in modalit\u00e0 Landscape\" title=\"IPAD_001_landscape\" width=\"594\" height=\"488\" class=\"size-full wp-image-2964\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_landscape.jpg 594w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_landscape-300x246.jpg 300w\" sizes=\"auto, (max-width: 594px) 100vw, 594px\" \/><\/a><\/p>\n<p id=\"caption-attachment-2964\" class=\"wp-caption-text\">Split View in modalit\u00e0 Landscape<\/p>\n<\/div>\n<p><\/center><\/p>\n<p><center><\/p>\n<div id=\"attachment_2965\" style=\"width: 476px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_Portrait.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2965\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_Portrait.jpg\" alt=\"IPAD 001 - Split View in modalit\u00e0 Portrait\" title=\"IPAD_001_Portrait\" width=\"466\" height=\"616\" class=\"size-full wp-image-2965\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_Portrait.jpg 466w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_Portrait-226x300.jpg 226w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/a><\/p>\n<p id=\"caption-attachment-2965\" class=\"wp-caption-text\">Split View in modalit\u00e0 Portrait<\/p>\n<\/div>\n<p><\/center><\/p>\n<p>Come potete vedere dalle immagini \u00e8 evidente l&#8217;incompatibilit\u00e0 di questa nuova visuale con il nostro caro &#8220;vecchio&#8221; iPhone, il suo &#8220;piccolo&#8221; display, infatti, non offre abbastanza spazio a video per mostrare questo tipo di visuale. In futuro vedremo come rendere le nostre applicazioni universali e come ovviare quindi a questi problemi progettando a dovere le loro interfacce grafiche.<\/p>\n<h4>Il progetto<\/h4>\n<p>Partiamo, dopo questa breve introduzione, con il tutorial vero e proprio. Quella che andremo a creare in questo tutorial \u00e8 una semplice applicazione che mostra un elenco di prodotti sulla tabella a sinistra (o nel popover) e il dettaglio del prodotto nella DetailView, ovvero nella vista principale.<\/p>\n<p><strong>NOTA:<\/strong> Per il seguente tutorial \u00e8 sottointeso che dovrete aver scaricata e installata l&#8217;ultima versione dell&#8217;SDK fornito da Apple (attualmente versione 3.2).<\/p>\n<p>Apriamo Xcode e creiamo un nuovo progetto. Dall&#8217;elenco dei template disponibili selezioniamo il nuovissimo &#8220;<strong>Split View-based Application<\/strong>&#8220;, diamo un nome alla nostra applicazione, ad esempio &#8220;<em>iPadSplitView<\/em>&#8220;, scegliamo la posizione in cui salvare il nostro progetto e proseguiamo.<\/p>\n<p>Dando un primo sguardo alla sezione &#8220;<em>Groups &#038; Files<\/em>&#8221; in Xcode notiamo gi\u00e0 qualcosa di nuovo tra le classi presenti:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_GroupsAndFiles.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_GroupsAndFiles.jpg\" alt=\"IPAD 001 - Groups &amp; Files\" title=\"IPAD_001_GroupsAndFiles\" width=\"266\" height=\"447\" class=\"aligncenter size-full wp-image-2966\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_GroupsAndFiles.jpg 266w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_GroupsAndFiles-178x300.jpg 178w\" sizes=\"auto, (max-width: 266px) 100vw, 266px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Troviamo infatti le due nuove classi che compongono il tipo di template scelto:<\/p>\n<ul>\n<li>RootViewController<\/li>\n<li>DetailViewController<\/li>\n<\/ul>\n<p>Iniziamo a lavorare sulla prima classe. Apriamo il file &#8220;<em>RootViewController.h<\/em>&#8221; e modifichiamo il codice come segue:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n\r\n@class DetailViewController;\r\n\r\n@interface RootViewController : UITableViewController {\r\n    DetailViewController *detailViewController;\r\n    NSMutableArray *prodotti;\r\n}\r\n\r\n@property (nonatomic, retain) IBOutlet DetailViewController *detailViewController;\r\n@property (nonatomic, retain) NSMutableArray *prodotti;\r\n\r\n@end\r\n<\/pre>\n<p>Abbiamo semplicemente dichiarato un oggetto di tipo &#8220;<em>NSMutableArray<\/em>&#8221; chiamato &#8220;<em>prodotti<\/em>&#8221; che useremo pi\u00f9 avanti per visualizzare l&#8217;elenco dei prodotti.<\/p>\n<p>Creiamo ora un file <em>.plist<\/em> chiamato &#8220;<em>prodotti<\/em>&#8221; e sfruttiamolo per salvarci dentro l&#8217;elenco dei prodotti, che caricheremo successivamente nell&#8217;array dichiarato poco fa. Per far ci\u00f2 cliccate con il pulsante destro del mouse su &#8220;<em>Resources<\/em>&#8220;, quindi su &#8220;<em>Add<\/em>&#8221; e infine su &#8220;<em>New File&#8230;<\/em>&#8220;.<\/p>\n<p>Selezionate il gruppo &#8220;<em>Resource<\/em>&#8221; sulla sinistra, quindi scegliete il modello di file &#8220;<em>Property List<\/em>&#8221; dall&#8217;elenco sulla destra. Diamo un nome al nostro nuovo file, ad esempio &#8220;<em>prodotti.plist<\/em>&#8221; e proseguiamo. Andiamo quindi a modificare il file appena creato selezionando &#8220;Array&#8221; e aggiungendo le voci mostrate in figura qui in basso (fate click sull&#8217;immagine per ingrandire):<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_plist.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_plist.jpg\" alt=\"IPAD 001 - File prodotti.plist\" title=\"IPAD_001_plist\" width=\"462\" height=\"86\" class=\"aligncenter size-full wp-image-2967\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Salviamo il file <em>prodotti.plist<\/em>. Trasciniamo ora 5 immagini nella cartella &#8220;<em>Resources<\/em>&#8221; del nostro progetto. Il loro nome (delle immagini) dovr\u00e0 essere uguale ai rispettivi oggetti inseriti nel file <em>.plist<\/em>. Nel nostro caso abbiamo utilizzato immagini in formato .jpg, se usate altri formati, dovrete fare una piccola modifica nella parte di codice dove verranno richiamate mettendo il vostro formato al posto di &#8220;jpg&#8221;. Ricordate inoltre di mettere la spunta su &#8220;<em>Copy items into destination group&#8217;s folder (if needed)<\/em>&#8221; per copiare i file nel progetto.<\/p>\n<p>Passiamo ora al file <em>RootViewController.m<\/em>. Modifichiamo innanzitutto la seguente istruzione come segue:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n@synthesize detailViewController, prodotti;\r\n<\/pre>\n<p>Passiamo quindi al metodo &#8220;viewDidLoad&#8221; e modifichiamolo in questo modo:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (void)viewDidLoad {\r\n    [super viewDidLoad];\r\n\t\r\n    self.title = @\"Prodotti Apple\";\r\n\t\r\n    self.clearsSelectionOnViewWillAppear = NO;\r\n    self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0);\r\n    self.prodotti = [[NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@\"prodotti\" ofType:@\"plist\"]] retain];\r\n}\r\n<\/pre>\n<p>Come vedete abbiamo semplicemente aggiunto un titolo, &#8220;<em>Prodotti Apple<\/em>&#8220;, e caricato nell&#8217;array &#8220;<em>prodotti<\/em>&#8221; il contenuto del file &#8220;<em>prodotti.plist<\/em>&#8221; creato in precedenza.<\/p>\n<p>Passiamo quindi al &#8220;riempimento&#8221; della nostra tabella con i valori dell&#8217;array:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView {\r\n    \/\/ Return the number of sections.\r\n    return 1;\r\n}\r\n\r\n- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section {\r\n    \/\/ Return the number of rows in the section.\r\n    return [prodotti count];\r\n}\r\n\r\n\r\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\r\n    \r\n    static NSString *CellIdentifier = @\"CellIdentifier\";\r\n    \r\n    \/\/ Dequeue or create a cell of the appropriate type.\r\n    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];\r\n    if (cell == nil) {\r\n        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];\r\n        cell.accessoryType = UITableViewCellAccessoryNone;\r\n    }\r\n    \r\n    \/\/ Configure the cell.\r\n    cell.textLabel.text = [self.prodotti objectAtIndex:indexPath.row];\r\n    return cell;\r\n}\r\n<\/pre>\n<p>Come potete vedere stiamo lavorando in modo molto simile a quanto accade nella programmazione iPhone classica.<\/p>\n<p>Specifichiamo ora quale vista caricare nella &#8220;Detail View&#8221; al tap su una voce della tabella:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {\r\n    \r\n    \/*\r\n     When a row is selected, set the detail view controller's detail item to the item associated with the selected row.\r\n     *\/\r\n    detailViewController.detailItem = [self.prodotti objectAtIndex:indexPath.row];\r\n}\r\n<\/pre>\n<p>Abbiamo terminato con la nostra classe <em>RootViewController<\/em>, passiamo quindi all&#8217;altra classe disponibile con il nuovo template scelto ad inizio tutorial <em>DetailViewController<\/em>.<\/p>\n<p>Apriamo quindi il file <em>DetailViewController.h<\/em> e modifichiamo il codice come segue:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n\r\n@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate> {    \r\n    UIPopoverController *popoverController;\r\n    UIToolbar *toolbar;\r\n    \r\n    id detailItem;\r\n\r\n    IBOutlet UILabel *lblTitolo;\r\n    IBOutlet UIImageView *prodottoImageView;\r\n    IBOutlet UITextView *textViewDescrizione;\r\n}\r\n\r\n@property (nonatomic, retain) IBOutlet UIToolbar *toolbar;\r\n@property (nonatomic, retain) id detailItem;\r\n\r\n@property (nonatomic, retain) IBOutlet UILabel *lblTitolo;\r\n@property (nonatomic, retain) IBOutlet UIImageView *prodottoImageView;\r\n@property (nonatomic, retain) IBOutlet UITextView *textViewDescrizione;\r\n\r\n@end\r\n<\/pre>\n<p>Abbiamo semplicemente dichiarato i 3 oggetti che comporranno l&#8217;interfaccia della DetailView nella nostra App.<\/p>\n<p>Salviamo e andiamo quindi a disegnare l&#8217;interfaccia grafica, in questo caso, davvero molto semplice. Facciamo doppio-click sul file &#8220;DetailView.xib&#8221; in modo da aprire Interface Builder. Trasciniamo dentro la nostra vista i seguenti oggetti:<\/p>\n<ul>\n<li>N. 1 UILabel<\/li>\n<li>N. 1 UIImageView<\/li>\n<li>N. 1 UITextView<\/li>\n<\/ul>\n<p>Clicchiamo su &#8220;File&#8217;sOwner&#8221; e dalla finestra &#8220;Detail View Controller Connection&#8221; colleghiamo i tre nuovi oggetti con i rispettivi dichiarati precedentemente via Xcode (lblTitolo, prodottoImageView e textViewDescrizione).<\/p>\n<p>Prima di chiudere verificate le impostazioni <strong>per ogni oggetto<\/strong> nella finestra &#8220;<em>View Size<\/em>&#8221; e in particolare la configurazione nella sezione &#8220;<em>Autosizing<\/em>&#8220;. Questi accorgimenti vi eviteranno brutti scherzi quando la vostra applicazione passer\u00e0 dalla modalit\u00e0 portrait (verticale) a landscape (orizzontale) e viceversa. Potete effettuare delle prove sul funzionamento dell&#8217;interfaccia direttamente da Interface Builder cliccando la &#8220;frecciolina&#8221; che trovate in alto a destra nella view.<\/p>\n<p>Terminate le personalizzazioni possiamo salvare e chiudere Interface Builder.<\/p>\n<p>Apriamo il file DetailViewController.m e iniziamo ad aggiungere i tre oggetti alla riga del @synthesize:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n@synthesize toolbar, popoverController, detailItem, lblTitolo, prodottoImageView, textViewDescrizione;\r\n<\/pre>\n<p>Modifichiamo quindi i successivi due metodi come segue:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (void)setDetailItem:(id)newDetailItem {\r\n    if (detailItem != newDetailItem) {\r\n        [detailItem release];\r\n        detailItem = [newDetailItem retain];\r\n        \r\n        \/\/ Update the view.\r\n        [self configureView];\r\n\r\n        NSString *nomeImmagine = [NSString stringWithFormat:@\"%@.jpg\", detailItem];\r\n        [self.prodottoImageView setImage:[UIImage imageNamed:nomeImmagine]];\r\n\t\t\t\t\r\n        NSString *testo = [NSString stringWithFormat:@\"Testo di prova per la categoria %@\", detailItem];\r\n        self.textViewDescrizione.text = testo;\r\n    }\r\n\r\n    if (popoverController != nil) {\r\n        [popoverController dismissPopoverAnimated:YES];\r\n    }        \r\n}\r\n\r\n- (void)configureView {\r\n    \/\/ Update the user interface for the detail item.\r\n\tself.lblTitolo.text = [detailItem description];\r\n}\r\n<\/pre>\n<p>In questo modo non faremo altro che caricare i dati corretti nella DetailView, in base alle scelte dell&#8217;utente. A questo punto non ci rimane altro che rilasciare gli oggetti, per i soliti discorsi di corretta gestione della memoria:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (void)dealloc {\r\n    [popoverController release];\r\n    [toolbar release];\r\n    \r\n    [detailItem release];\r\n    [lblTitolo release];\r\n    [prodottoImageView release];\r\n    [textViewDescrizione release];\r\n\r\n    [super dealloc];\r\n}\r\n<\/pre>\n<p>Con il primo tutorial di programmazione iPad abbiamo terminato, potete cliccare su &#8220;Build &#038; Run&#8221; e testare l&#8217;applicazione sul vostro <strong>simulatore iPad<\/strong>, a meno che non siate gi\u00e0 tra i pochi fortunati possessori di questo fantastico dispositivo, che ancora deve uscire nel nostro paese.<\/p>\n<p>Concludiamo l&#8217;articolo mostrandovi un paio di screenshot dell&#8217;applicazione iPad appena creata in esecuzione, in entrambe le modalit\u00e0:<\/p>\n<p><center><\/p>\n<div id=\"attachment_2968\" style=\"width: 604px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_IS_landscape.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2968\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_IS_landscape.jpg\" alt=\"IPAD 001 - Esecuzione in modalit\u00e0 Landscape\" title=\"IPAD_001_IS_landscape\" width=\"594\" height=\"488\" class=\"size-full wp-image-2968\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_IS_landscape.jpg 594w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_IS_landscape-300x246.jpg 300w\" sizes=\"auto, (max-width: 594px) 100vw, 594px\" \/><\/a><\/p>\n<p id=\"caption-attachment-2968\" class=\"wp-caption-text\">Esecuzione in modalit\u00e0 Landscape<\/p>\n<\/div>\n<p><center><\/p>\n<p><center><\/p>\n<div id=\"attachment_2969\" style=\"width: 476px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_IS_portrait.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2969\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_IS_portrait.jpg\" alt=\"IPAD 001 - Esecuzione in modalit\u00e0 Portrait\" title=\"IPAD_001_IS_portrait\" width=\"466\" height=\"616\" class=\"size-full wp-image-2969\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_IS_portrait.jpg 466w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/04\/IPAD_001_IS_portrait-226x300.jpg 226w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/a><\/p>\n<p id=\"caption-attachment-2969\" class=\"wp-caption-text\">Esecuzione in modalit\u00e0 Portrait<\/p>\n<\/div>\n<p><center><\/p>\n<p>Alla prossima \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggi vi proponiamo il primo di una lunga serie di Tutorial di programmazione iPad. Come sicuramente sar\u00e0&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[98],"tags":[98,4,171,170,23],"class_list":["post-2963","post","type-post","status-publish","format-standard","hentry","category-ipad","tag-ipad","tag-programmazione","tag-split-view","tag-tutorial-ipad","tag-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2963","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=2963"}],"version-history":[{"count":13,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2963\/revisions"}],"predecessor-version":[{"id":3018,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2963\/revisions\/3018"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=2963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=2963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=2963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}