Nella lezione precedente, hai creato un semplice progetto Swift in Xcode, una semplice applicazione da fare. In questa puntata di Swift From Scratch, aggiungeremo la possibilità di creare elementi to-do. Lungo la strada, scopri le azioni, la delega e le proprietà.
Se desideri seguirmi, assicurati di aver installato Xcode 8.3.2 o successivo sulla tua macchina. Puoi scaricare Xcode 8.3.2 dall'App Store di Apple.
Alla fine di questa lezione, l'utente sarà in grado di aggiungere nuovi elementi delle cose da fare toccando un pulsante nella barra di navigazione, presentando una vista con un campo di testo e un pulsante. Iniziamo creando il controller di visualizzazione che gestirà l'aggiunta di nuovi elementi delle cose da fare, il AddItemViewController
classe.
AddItemViewController
Scegliere Nuovo> File ... da Xcode's File menu e selezionare il Cocoa Touch Class modello dalla lista di iOS> Origine modelli.
Dai un nome alla classe AddItemViewController
e assicurarsi che erediti da UIViewController
. Ricontrolla quello linguaggio è impostato per veloce e quello Crea anche un file XIB è deselezionato.
Dillo a Xcode dove desideri salvare il file per AddItemViewController
classe e clicca Creare.
Prima di creare l'interfaccia utente di AddItemViewController
classe, abbiamo bisogno di creare uno sbocco per il campo di testo e due azioni, una per un pulsante Annulla nella barra di navigazione e un'altra per il pulsante Crea sotto il campo di testo.
Aggiungere una presa dovrebbe essere familiare ormai. Creare uno sbocco nel AddItemViewController
classe e chiamarlo campo di testo
come mostrato di seguito.
class AddItemViewController: UIViewController @IBOutlet var textField: UITextField! override func viewDidLoad () super.viewDidLoad () override func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()
La creazione di un'azione è molto simile alla creazione di un metodo di istanza. In effetti, il @IBAction
l'attributo non è altro che un suggerimento per Interface Builder. Con il prefisso di un metodo con il @IBAction
attributo, ci assicuriamo che Interface Builder sia a conoscenza del metodo, che ci consente di collegarlo nello storyboard. Per il momento lasceremo i corpi di entrambe le azioni vuote.
class AddItemViewController: UIViewController @IBOutlet var textField: UITextField! override func viewDidLoad () super.viewDidLoad () override func didReceiveMemoryWarning () super.didReceiveMemoryWarning () @IBAction func cancel (_ mittente: Qualsiasi) @IBAction func create (_ mittente: Qualsiasi)
Aperto Main.storyboard nel Project Navigator e trascinare a Visualizza controller dal Libreria di oggetti sulla destra. Con il controller della vista selezionato, apri il Identity Inspector a destra e impostare Classe personalizzata> Classe a AddItemViewController.
Per aggiungere una barra di navigazione alla vista della voce aggiungi, selezionare Aggiungi elemento Visualizza controller e scegliere Incorporare in> Controller di navigazione dal editore menu. Questo renderà il Aggiungi elemento Visualizza controller il controller della vista radice di un controller di navigazione.
Il passaggio successivo consiste nell'aggiungere una voce di pulsante nella barra di navigazione di Visualizza controller-non il Aggiungi elemento Visualizza controller-e impostare il suo Identifier a Inserisci nel Ispettore degli attributi.
Quando l'utente tocca il Inserisci pulsante, il Aggiungi elemento Visualizza controller dovrebbe essere presentato modalmente Per fare ciò, premere il tasto Controllo chiave e trascina dal Inserisci pulsante per il Controller di navigazione, Selezione Presente Modalmente dal menu che si apre. Questo creerà un seguito dal Aggiungi elemento Visualizza controller al nuovo Controller di navigazione.
Trascina un campo di testo e un pulsante da Libreria di oggetti e aggiungili al Aggiungi elemento Visualizza controller scena. Seleziona il Aggiungi elemento Visualizza controller e connetti il campo di testo
presa con il campo di testo e il creare(_:)
azione con il pulsante. Il creare(_:)
l'azione dovrebbe essere attivata quando il Ritocca Dentro l'evento è licenziato. Cambia il titolo del pulsante in Creare e aggiungi i vincoli di layout necessari al campo di testo e al pulsante.
Per completare l'interfaccia utente, aggiungi una voce di pulsante nella barra in alto a sinistra della barra di navigazione di Aggiungi elemento Visualizza controller e impostare il suo Identifier a Annulla. Con il Aggiungi elemento Visualizza controller selezionato, apri il Connections Inspector e connetti il Annulla(_:)
azione per il Annulla pulsante.
Costruisci ed esegui l'applicazione premendo Comando-R per verificare che tutto sia collegato correttamente.
Quando l'utente tocca il Creare per aggiungere una voce to-do, il controller di visualizzazione delle voci aggiuntive deve notificare il controller della vista. La delega è una soluzione perfetta per questo scenario. Il processo è piuttosto semplice.
Creiamo un protocollo delegato il ViewController
classe conforme a. Quando il AddItemViewController
l'istanza viene creata, quando l'utente tocca il Inserisci button-il ViewController
oggetto è impostato come delegato del AddItemViewController
istanza, consentendo a quest'ultimo di notificare il ViewController
istanza quando viene creato un nuovo elemento attività. Scopriamolo per capire meglio questo processo.
AddItemViewControllerDelegate
ProtocolloAperto AddItemViewController.swift e dichiarare il AddItemViewControllerDelegate
protocollo sotto la dichiarazione di importazione in alto. La dichiarazione del protocollo è simile a una dichiarazione di classe. Il protocollo
la parola chiave è seguita dal nome del protocollo.
importare il protocollo UIKit AddItemViewControllerDelegate func controller (_ controller: AddItemViewController, didAddItem: String)
Il concetto è molto simile ai protocolli in Objective-C. Il nome del protocollo è AddItemViewControllerDelegate e definisce un metodo, Controller (_: didAddItem :)
.
delegare
ProprietàL'oggetto che deve implementare il protocollo delegato è il delegato di AddItemViewController
. Per prima cosa è necessario creare una proprietà per il delegato come mostrato nello snippet seguente.
class AddItemViewController: UIViewController @IBOutlet var textField: UITextField! var delegate: AddItemViewControllerDelegate? ...
Il delegare
la proprietà è di tipo AddItemViewControllerDelegate?
, un tipo facoltativo, dal momento che non possiamo essere certi che il delegare
la proprietà non lo è zero
. Si noti che il nome del protocollo non è racchiuso tra parentesi angolari come in Objective-C.
Il metodo delegato, Controller (_: didAddItem :)
, sarà invocato nel creare(_:)
azione come mostrato di seguito. Per mantenere l'esempio semplice, non facciamo alcuna convalida sull'input dell'utente.
Utilizziamo il concatenamento facoltativo per invocare il metodo delegate sull'oggetto delegato, il che significa che il metodo delegate viene invocato solo se il delegare
la proprietà è impostata. Il valore del campo di testo viene temporaneamente memorizzato in una costante, articolo
.
@IBAction func create (_ sender: Any) se let item = textField.text delegate? .Controller (self, didAddItem: item)
L'implementazione del Annulla(_:)
l'azione è facile. Tutto ciò che facciamo è respingere il AddItemViewController
esempio.
@IBAction func cancel (_ sender: Any) respingere (animato: vero)
C'è però un pezzo del puzzle mancante. Il delegare
proprietà del AddItemViewController
l'istanza non viene impostata al momento. Possiamo risolvere questo implementando il preparare (per: mittente :)
metodo nel ViewController
classe. Innanzitutto, tuttavia, è necessario rivisitare lo storyboard.
Aperto Main.storyboard e selezionare il seguito che connette il Inserisci pulsante con il Controller di navigazione. Apri il Ispettore degli attributi e impostare i seguiti Identifier aAddItemViewController.
Quindi, implementare il preparare (per: mittente :)
metodo nel ViewController
classe come mostrato di seguito. Notare la oltrepassare
parola chiave che prefissa il metodo. Questo dovrebbe essere familiare ormai.
override func prepare (per segue: UIStoryboardSegue, sender: Any?) if follows.identifier == "AddItemViewController" lascia navigationController = segue.destination as? UINavigationController ha lasciato addItemViewController = navigationController? .TopViewController as? AddItemViewController se lasciato viewController = addItemViewController viewController.delegate = self
Iniziamo controllando l'identificatore del seguito, assicurandoci che ci stiamo preparando per il seguito corretto. Quindi chiediamo al seguito il suo controller di visualizzazione di destinazione. Potresti aspettarti che questo sia il AddItemViewController
istanza, ma ricorda che abbiamo fatto il controller di visualizzazione il controller della vista radice di un controller di navigazione. Ciò significa che dobbiamo chiedere al controller di navigazione, il controller di visualizzazione della destinazione del seguito, per il suo controller di visualizzazione superiore.
Il addItemViewController
costante è di tipo AddItemViewController?
a causa dell'uso del come?
parola chiave. In altre parole, usando come?
abbiamo downcast il valore del topViewController
proprietà a un tipo facoltativo.
Nel Se
dichiarazione, scartiamo l'opzionale e impostiamo il delegare
proprietà al ViewController
esempio.
Sono sicuro che hai notato l'uso di diversi optionals nell'implementazione di preparare (per: mittente :)
metodo. Quando si interagisce con le API di Objective-C, è sempre meglio giocare sul sicuro. Durante l'invio di messaggi a zero
sta perfettamente bene in Objective-C, non è in Swift. A causa di questa differenza fondamentale, devi sempre fare attenzione quando interagisci con le API Objective-C in Swift. L'esempio sopra illustra questo bene.
AddItemViewControllerDelegate
ProtocolloImplementare il AddItemViewControllerDelegate
il protocollo è simile all'implementazione del UITableViewDataSource
protocollo. Iniziamo conformando il ViewController
classe al protocollo come mostrato di seguito.
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AddItemViewControllerDelegate ...
Successivamente, implementiamo i metodi di AddItemViewControllerDelegate
protocollo, che si riduce all'implementazione di Controller (_: didAddItem :)
metodo. Aggiungiamo il nuovo oggetto al controller della vista elementi
proprietà, ricaricare la vista tabella e chiudere il controller di visualizzazione delle voci di aggiunta.
// MARK: Aggiungi Item View Controller Delegate Methods controller funzionale (_ controller: AddItemViewController, didAddItem: String) // Aggiorna origine dati items.append (didAddItem) // Ricarica tabella Visualizza tableView.reloadData () // Elimina visualizzazione elemento Controller respinto (animato: vero)
Crea ed esegui l'applicazione per testare se puoi aggiungere nuovi elementi all'elenco delle cose da fare. Al momento non convalidiamo l'input dell'utente. Come esercizio, mostra una vista di avviso all'utente se tocca il pulsante Creare pulsante e il campo di testo è vuoto. Aggiungere una cosa da fare vuota non è molto utile. Destra?
In questa lezione, hai imparato come dichiarare e implementare un protocollo personalizzato. Hai anche imparato come creare azioni e collegarle in Interface Builder. Nella prossima lezione, completeremo la nostra do-do application aggiungendo la possibilità di eliminare gli elementi to-do e miglioreremo anche l'esperienza utente dell'applicazione.
Nel frattempo, dai uno sguardo ad alcuni dei nostri altri corsi e tutorial sullo sviluppo di iOS in lingua Swift!