Swift From Scratch Delega e Proprietà

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à.

Prerequisiti

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.

1. Aggiunta di articoli

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.

Passaggio 1: Crea 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.

Passaggio 2: aggiungere punti vendita e azioni

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) 

Passaggio 3: creare l'interfaccia utente

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> ClasseAddItemViewController.

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 IdentifierInserisci 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 IdentifierAnnulla. 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.

2. Implementazione di un protocollo delegato

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.

Passaggio 1: dichiarare il AddItemViewControllerDelegate Protocollo

Aperto 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 :).

Passaggio 2: dichiarare il 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.

Passaggio 3: azioni di implementazione

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)

Passaggio 4: impostare il delegato

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.

Passaggio 5: implementare il AddItemViewControllerDelegate Protocollo

Implementare 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)

Passaggio 6: costruisci ed esegui

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?

Conclusione

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!