{"id":2568,"date":"2010-03-21T12:10:32","date_gmt":"2010-03-21T11:10:32","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=2568"},"modified":"2010-03-21T12:10:32","modified_gmt":"2010-03-21T11:10:32","slug":"uinavigationcontroller-guida-completa-all-uso","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/uinavigationcontroller-guida-completa-all-uso\/","title":{"rendered":"UINavigationController &#8211; Guida completa all\u2019uso"},"content":{"rendered":"<p>In questo articolo tratteremo la classe <strong>UINavigationController<\/strong> tanto utile e cara a quasi tutti gli sviluppatori iPhone. La suddetta classe, per intenderci, \u00e8 quella che consente di passare da una vista (UIViewController meglio) ad un&#8217;altra con la simpatica animazione dello scorrimento da destra a sinistra facendo apparire solitamente un tasto in alto a sinistra per tornare alla vista precedente. Ecco un esempio tratto dalla documentazione Apple:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/developer.apple.com\/iphone\/library\/documentation\/UIKit\/Reference\/UINavigationController_Class\/Art\/navigation_interface.jpg\" alt=\"Esempio di un UINavigationController\" width=\"628\" height=\"283\" \/><br \/>\n<\/center><br \/>\n<!--more--><br \/>\nMa analizziamo ora in dettaglio come funziona questa classe.<\/p>\n<p>UINavigationController non \u00e8 altro che uno <strong>stack<\/strong> di UIViewController. Chi conosce un po&#8217; di teoria del C capisce subito il suo funzionamento e pu\u00f2 immaginare le sue possibili funzioni, ma per chi non lo sapesse ecco una breve spiegazione.<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/StackThird.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2571\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/StackThird.png\" alt=\"\" width=\"168\" height=\"179\" \/><\/a> Immaginiamo lo stack come una pila di libri, ogni nuovo libro (in questo caso UIViewController) viene posto sopra a tutti gli atri e non \u00e8 possibile rimuovere un qualsiasi altro libro, altrimenti la pila cadrebbe. L&#8217;unica soluzione \u00e8 togliere un libro alla volta partendo dall&#8217;ultimo inserito, dal libro in cima.<\/p>\n<p>Da questo ragionamento se ne deduce quindi la &#8220;filosofia&#8221; dello stack in generale: <\/p>\n<p>&#8220;<em>Il primo ad entrare \u00e8 l&#8217;ultimo ad uscire<\/em>&#8220;.<\/p>\n<p>Di conseguenza si possono dedurre anche le azioni che potranno essere applicate allo stack:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>push (per aggiungere un elemento allo stack);<\/li>\n<li>pop (per togliere l&#8217;ultimo elemento inserito).<\/li>\n<\/ul>\n<p>Il tutto sembra molto semplice, ed infatti lo \u00e8!<\/p>\n<p>Portiamoci al caso specifico della classe trattata, dalla <a href=\"http:\/\/developer.apple.com\/iphone\/library\/documentation\/UIKit\/Reference\/UINavigationController_Class\/Reference\/Reference.html\" target=\"_blank\">documentazione Apple<\/a> si capisce subito la semplicit\u00e0 della classe e dei suoi metodi:<\/p>\n<ul>\n<li>&#8211; (id)initWithRootViewController:(<a href=\"http:\/\/developer.apple.com\/iphone\/library\/documentation\/UIKit\/Reference\/UIViewController_Class\/Reference\/Reference.html#\/\/apple_ref\/doc\/c_ref\/UIViewController\" target=\"_blank\">UIViewController<\/a> *)<em>rootViewController <\/em>per inizializzare l&#8217;oggetto con il primo elemento dello stack;<\/li>\n<li>&#8211; (void)<strong>push<\/strong>ViewController:(<a href=\"http:\/\/developer.apple.com\/iphone\/library\/documentation\/UIKit\/Reference\/UIViewController_Class\/Reference\/Reference.html#\/\/apple_ref\/doc\/c_ref\/UIViewController\" target=\"_blank\">UIViewController<\/a> *)<em>viewController<\/em> animated:(BOOL) <em>animated<\/em> per aggiungere un elemento allo stack;<\/li>\n<li>&#8211; (<a href=\"http:\/\/developer.apple.com\/iphone\/library\/documentation\/UIKit\/Reference\/UIViewController_Class\/Reference\/Reference.html#\/\/apple_ref\/doc\/c_ref\/UIViewController\" target=\"_blank\">UIViewController<\/a> *)<strong>pop<\/strong>ViewControllerAnimated:(BOOL)<em>animated<\/em> per togliere l&#8217;ultimo elemento inserito;<\/li>\n<\/ul>\n<p>Lascio a voi analizzare gli altri metodi che sono delle estensioni dei due metodi principali e consentono principalmente di andare direttamente al primo elemento (eliminando sempre tutti gli atri elementi) o di andare ad un elemento predefinito o di ottenere un array con tutti gli elementi dello stack etc.<\/p>\n<h4>Piccoli dettagli per facilitarne l&#8217;uso<\/h4>\n<p>UINavigationController si utilizza con gli oggetti della classe UIViewController, ma come fare ad aggiungere questi ultimi al UINavigationController non avendo il riferimento (puntatore) a quest&#8217;ultimo oggetto?<\/p>\n<p>Semplice:<\/p>\n<p>ogni UIViewController ha una propriet\u00e0 (navigationController) che \u00e8 il puntatore al UINavigationController di cui esso fa parte. Mi spiego meglio con un esempio:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n\/\/ inizializzo un UIViewController, sar\u00e0 il primo dello stack\r\nUIViewController *firstViewController = [[UIViewController alloc] init];\r\n\r\n\/\/ inizializzo il mio UINavigationController con il primo elemento dello stack\r\nUINavigationController *myNavigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController];\r\n\r\n[firstViewController release];\r\n\r\n\/\/ rendo visibile la vista del myNavigationController\r\n[window addSubview:myNavigationController.view];\r\n\r\n[myNavigationController release];\r\n<\/pre>\n<p>Ora lo stack si presenta cos\u00ec<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/StackFirst.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2581\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/StackFirst.png\" alt=\"\" width=\"168\" height=\"179\" \/><\/a><br \/>\n<\/center><\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n\/\/ firstViewController implementation\r\n\/\/ ...\r\n\r\nUIViewController *secondViewController = [[UIViewController alloc] init];\r\n\r\n\/\/ aggiungo un altro elemento allo stack\r\n[self.navigationController pushViewController:secondViewController animated:YES];\r\n\r\n[secondViewController release];\r\n<\/pre>\n<p>Ora lo stack si presenta con un elemento in pi\u00f9:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/StackSecond.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2582\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/StackSecond.png\" alt=\"\" width=\"168\" height=\"179\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Infine per tornare al UIViewController precedente basta fare:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n\/\/ secondViewController implementation\r\n\/\/ ...\r\n\r\n[self.navigationController popViewControllerAnimated:YES];\r\n<\/pre>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/StackFirst.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2581\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/StackFirst.png\" alt=\"\" width=\"168\" height=\"179\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo articolo tratteremo la classe UINavigationController tanto utile e cara a quasi tutti gli sviluppatori iPhone&#8230;.<\/p>\n","protected":false},"author":17,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[42],"tags":[90,42,5,4,14,1,147,23],"class_list":["post-2568","post","type-post","status-publish","format-standard","hentry","category-framework","tag-animazioni","tag-framework","tag-objective-c","tag-programmazione","tag-sdk","tag-tutorial-pratici","tag-uinavigationcontroller","tag-xcode"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2568","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\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=2568"}],"version-history":[{"count":13,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2568\/revisions"}],"predecessor-version":[{"id":2602,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2568\/revisions\/2602"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=2568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=2568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=2568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}