La prima community Italiana sul nuovo linguaggio di programmazione per lo sviluppo di applicazioni iOS
Don't wanna be here? Send us removal request.
Text
Tutorial: Programmazione iOS - Passaggio di dati tra ViewController utilizzando “Segue” in Storyboard.
Nella programmazione di applicazioni iOS, soprattutto nel caso di applicazioni con più View, può presentarsi l’esigenza di trasferire dati tra una View ed un altra, simulando ( o meglio creando ) un sistema statefull: manteniamo e trasferiamo lo stato dell’applicazione tra un contesto ed un altro.
Ipotiziamo un’applicazione, composta da due View - e quindi da due ViewController, il cui scopo è cambiare il testo della label presente sulla seconda view, utilizzando il testo, inserito da un utente, nella prima View.
Inoltre, si ipotizzi la definizione delle View attraverso la creazione di una Storyboard.
Iniziamo con il creare un nuovo progetto - XCode 6 - per un’applicazione iOS con singola View, ricordando di selezionare come linguaggio Swift.
Avremo quindi un ViewController ed una Storyboard con una singola View, rappresentante il punto di ingresso dell’Applicazione.
Aggiungiamo, alla Storyboard, un altro oggetto ViewController e quindi una seconda View. Inoltre, aggiungiamo al progetto un altro file Swift, selezionando nuovo oggetto Cocoa Touch di tipo ViewController.
Chiamiamo il file ViewController_2
Avremo, quindi, un’ Applicazione con due View composte dai seguenti elementi:
View 1:
un ViewController, definito ViewController, ed originato dal processo di creazione del progetto.
un campo Testo per prelevare quanto inserito dall’utente
un Bottone per consentire ( attraverso l’oggetto Segue della Storyboard ) il cambio di View
View 2:
un ViewController, definito ViewController_2, ed originato dal processo di aggiunta di un file Swift come oggetto Cocoa Touch di tipo ViewController.
una Label che visualizzerà il testo inserito, dall’utente, nel campo di testo della View1
un Bottone per tornare alla prima View ( sempre utilizzando le transazioni della Storyboard )
Notiamo subito che, a differenza del file ViewController.swift - generato in automatico con la creazione del progetto - il nuovo file ViewController_2.swift contiene la seguente porzione di codice tra commenti:
/*
// #pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
Tale porzione di codice è ciò che serve al nostro scopo. Analiziamola nel dettaglio.
La parte importante è nel commento di specifica: In a storyboard-based application, you will often want to do a little preparation before navigation;
In pratica, ci viene spiegato che, nel caso di applicazioni basate su Storyboard, prima che la navigazione avvenga ( ovvero prima che venga cambiata la View ) possiamo fare alcune operazioni “preparatorie”.
Per raggiungere il nostro scopo, passare dati da una View ad un’altra, basta modificare il codice della funzione prepareForSegue.
Nel caso della nostra - semplice - Applicazione il trasferimento dei dati avverrà tra la View 1 e la View 2 quindi la “fase di preparazione per il Segue” è da inserire nel codice del ViewController della View 1, che, poichè è stato creato in automatico ed è il punto iniziale della Storyboard, manca della funzione prepareForSegue.
Copiamo lo snippet di codice dal ViewController_2 e copiamolo nel ViewController, avremo del codice some il seguente:
import UIKit
class ViewController: UIViewController {
@IBOutlet var testo_per_la_label : UITextField;
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// #pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
}
NB: Alla porzione di codice copiata ricordiamo di eliminare il tag di commento.
Entriamo nel dettaglio della funzione prepareForSegue.
La funzione - o meglio il metodo dell’oggetto ViewController, associato alla View - richiede due parametri:
uno rappresentante un oggetto UIStoryboardSegue
uno rappresentante un oggetto generico. Tale oggetto rappresenta chi ha richiesto la transizione tra View. Nel nostro caso si tratterà del Bottone.
Entrambi i parametri sono trattati come tipo Optional, identificabili dall’uso del carattere ?.
Ricordiamo che in Swift un tipo Optional consente di trattare i casi in cui un elemento ( ad esempio una variabile ) potrebbe o non potrebbe contenere un valore.
Per gestire elementi di tipo Optional dobbiamo utilizzare blocchi di codice if..else per valutare l’esistenza del potenziale valore e, nel caso, utilizzarlo.
Esempio:
var somma: Int?
if (somma) {
println(“Il valore della somma è: \(somma!)”)
}
else {
println(“Il valore somma è nullo”)
}
Nel caso del metodo prepareForSegue i due parametri sono generati nel momento in cui un utente compie l’azione che determinerà il cambio di View, nel nostro caso l’uso del Bottone.
Il parametro segue conterrà il riferimento all’oggetto UIStoryboardSegue ( nella rappresentazione grafica, inXCode, è l’elemento freccia di unione tra View a cui possiamo assegnare un identificatore popolando il campo Identifier del pannello Attributi. Nel nostro caso abbiamo assegnato il valore View_2 ).
Inziamo, quindi, a costruire il nostro codice per il passaggio di dati tra le View.
La prima cosa è verificare che l’oggetto segue esista e quindi prelevarne il dato ViewController riferimento al ViewController_2 della nostra seconda View:
if (segue) {
if (segue!.identifier == "View_2") {
var view_controller = segue!.destinationViewController as ViewController_2;
}
else {
// Do Something
}
}
NB: segue!.identifier == "View_2" serve per verificare quale oggetto UIStoryboardSegue stiamo trattando in quanto potremmo avere più oggetti UIStoryboardSegue, come nel caso di una View che si sposta verso due o più View.
L’oggetto ViewController, ricevuto dalla chiamata al metodo destinationViewController dell’oggetto segue ( ovvero dell’oggetto UIStoryboardSegue ), è un riferimento al nostro ViewController, connesso alla View verso la quale ci stiamo muovendo, ma non ci permetterà di gestire gli oggetti ( o meglio i riferimenti ) grafici - creati con Interface Builder - della View in quanto non sono stati renderizzati, e quindi instanziati come oggetti, perchè il processo di transizione non è stato ancora compiuto. Infatti, ci troviamo in una fase di “preparazione alla transizione Segue della Storyboard”.
Quindi, non possiamo operare direttamente - nel nostro caso - sulla Label inserita nella seconda View e qundi modificarne il test, ma possiamo operare su “proprietà” aggiunte all’oggetto ViewController e con queste modificare gli elementi grafici della View, ovvero lo scopo della nostra Applicazione.
Aggiungiamo, allo scopo, una proprietà nel codice della Classe ViewController_2:
var testo_per_la_label = ""; // una nuova proprietà per la Classe ViewController_2
Quindi avremo per ViewController_2.swift:
import UIKit
class ViewController_2: UIViewController {
@IBOutlet var label_da_cambiare : UILabel // la Label grafica da modificare con i dati della View 1
var testo_per_la_label = "";
/*init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialization
}*/
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.label_to_Set.text = self.word_to_set;
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// #pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
}
Modificato il codice della Classe ViewController_2, modifichiamo il codice della funzione prepareForSegue della Classe ViewController della View 1:
if (segue) {
if (segue!.identifier == "View_2") {
var view_controller = segue!.destinationViewController as ViewController_2;
view_controller.testo_per_la_label = self.testo_per_la_label ;
}
else {
// Do Something
}
}
Con lo snippet : view_controller.testo_per_la_label = self.testo_per_la_label ; assegniamo alla proprietà testo_per_la_label, del ViewController_2, il valore del testo dell’oggetto UITextField del ViewController della View 1.
In pratica abbiamo fatto transitare il dato da una View all’altra.
Infine, per modificare la proprietà text della Label - lo scopo della nostra Applicazione - basterà aggiungere il seguente snippet nel metodo viewDidLoad della Classe ViewController_2:
self.label_da_cambiare.text = self.testo_per_la_label;
Di seguito il codice completo per le due Classi ViewController:
NB: la porzione di codice rappresentato dal metodo init in ViewController_2 è stata posta in un ambito di commento in quanto, poichè la View è stata creata con Storyboard, non c’è file NIB vero e proprio e quindi non verrebbe inizializzato il ViewController con il metodo attivo.
ViewController.swift - connesso alla View 1:
import UIKit
class ViewController: UIViewController {
@IBOutlet var testo_per_la_label : UITextField;
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.label_da_cambiare.text = self.testo_per_la_label;
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// #pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
if (segue) {
if (segue!.identifier == "View_2") {
var view_controller = segue!.destinationViewController as ViewController_2;
view_controller.testo_per_la_label = self.testo_per_la_label ;
}
else {
// Do Something
}
}
}
}
ViewController_2.swift - connesso alla View 2:
import UIKit
class ViewController_2: UIViewController {
@IBOutlet var label_da_cambiare : UILabel // la Label grafica da modificare con i dati della View 1
var testo_per_la_label = "";
/*init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialization
}*/
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.label_to_Set.text = self.word_to_set;
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/*
// #pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
}
0 notes
Text
Visualizzare l’output della console durante le sessioni Playground
Scope: XCode 6 - Playground
Se stiamo sperimentando qualcosa, in una sessione Playground, e vogliamo visualizzare il contenuto della console, come ad esempio nel caso di comandi “println”, basta utilizzare la combinazione di tasti:
Alt + Command + Invio
La combinazione abiliterà la visualizzazione della view “Assistant Editor” - raggiungibile dal menù View - Assistant Editor - Show Assistant Editor
Inalternativa, ogni qual volta vogliamo visualizzare il dato della console, basta posizionare il puntatore del mouse sul valore visualizzato in Playground ( ad esempio quello assegnato ad una variabile ) e cliccare sull’icona a forma di cerchietto.
0 notes
Text
OS X Yosemite - Beta può catturare video direttamente dallo schermo del tuo iPhone.
Il rilascio - in versione beta - della nuova release di OS X Yosemite ha permesso, alla comunità di sviluppatori, di dare un’occhiata ravvicinata alle nuove funzionalità ed, in particolare, a quelle che non sono state presentate durante il recente WWDC 2014.
Piccole funzioni che possono rivelarsi utilissime come ad esempio quella - come riporta il sito 9to5mac - che permette di registrare video direttamente dallo schermo di un qualsiasi iPhone o iPad.
Una funzione molto interessante soprattutto sul versante sviluppo alla luce della nuova funzionalità dell’AppStore che permettereà, agli sviluppatori, di pubblicare anteprime video delle applicazioni.
1 note
·
View note