Uso degli avvisi tvOS in Xamarin

Questo articolo illustra l'uso di UIAlertController per visualizzare un messaggio di avviso all'utente in Xamarin.tvOS.

Se è necessario ottenere l'attenzione dell'utente tvOS o chiedere l'autorizzazione per eseguire un'azione distruttiva (ad esempio l'eliminazione di un file), è possibile presentare un messaggio di avviso usando :UIAlertViewController

Esempio di UIAlertViewController

Se oltre a visualizzare un messaggio, è possibile aggiungere pulsanti e campi di testo a un avviso per consentire all'utente di rispondere alle azioni e fornire commenti e suggerimenti.

Informazioni sugli avvisi

Come indicato in precedenza, gli avvisi vengono usati per ottenere l'attenzione dell'utente e informarli dello stato dell'app o richiedere feedback. Gli avvisi devono presentare un titolo, possono facoltativamente avere un messaggio e uno o più pulsanti o campi di testo.

Un avviso di esempio

Apple offre i suggerimenti seguenti per l'uso degli avvisi:

  • Usa avvisi con moderazione : gli avvisi interrompono il flusso dell'utente con l'app e interrompono l'esperienza utente e, di conseguenza, devono essere usati solo per situazioni importanti, ad esempio notifiche di errore, acquisti in-app e azioni distruttive.
  • Fornisce opzioni utili: se l'avviso presenta opzioni all'utente, è necessario assicurarsi che ogni opzione offra informazioni critiche e fornisca azioni utili da intraprendere per l'utente.

Titoli e messaggi di avviso

Apple include i suggerimenti seguenti per la presentazione del titolo di un avviso e del messaggio facoltativo:

  • Usa titoli multiword: il titolo di un avviso dovrebbe avere il punto della situazione in modo chiaro, pur rimanendo comunque semplice. Un singolo titolo di parola fornisce raramente informazioni sufficienti.
  • Usa titoli descrittivi che non richiedono un messaggio : laddove possibile, prendi in considerazione la descrizione del titolo dell'avviso in modo che il testo del messaggio facoltativo non sia obbligatorio.
  • Rendere il messaggio una frase breve e completa: se il messaggio facoltativo è necessario per ottenere il punto dell'avviso, mantenerlo il più semplice possibile e renderlo una frase completa con maiuscole e punteggiatura appropriate.

Pulsanti di avviso

Apple offre il suggerimento seguente per l'aggiunta di pulsanti a un avviso:

  • Limita a due pulsanti : laddove possibile, limita l'avviso a un massimo di due pulsanti. Gli avvisi a pulsante singolo forniscono informazioni, ma nessuna azione. Gli avvisi a due pulsanti offrono una semplice scelta di azione sì/no.
  • Usa succinct, logic button titles - Simple one to two word Button titles that chiaramente describe the Button's action work best.Use Succinct, Logical Button Titles - Simple one to two word Button titles that clearly describe the Button's action work best. Per altre informazioni, vedere la documentazione Sull'uso dei pulsanti .
  • Contrassegna chiaramente i pulsanti distruttivi: per i pulsanti che eseguono un'azione distruttiva (ad esempio l'eliminazione di un file) contrassegnano chiaramente i pulsanti con lo UIAlertActionStyle.Destructive stile.

Visualizzazione di un avviso

Per visualizzare un avviso, creare un'istanza di UIAlertViewController e configurarla aggiungendo Azioni (pulsanti) e selezionando lo stile dell'avviso. Ad esempio, il codice seguente visualizza un avviso OK/Annulla:

const string title = "A Short Title is Best";
const string message = "A message should be a short, complete sentence.";
const string acceptButtonTitle = "OK";
const string cancelButtonTitle = "Cancel";
const string deleteButtonTitle = "Delete";
...

var alertController = UIAlertController.Create (title, message, UIAlertControllerStyle.Alert);

// Create the action.
var acceptAction = UIAlertAction.Create (acceptButtonTitle, UIAlertActionStyle.Default, _ =>
    Console.WriteLine ("The \"OK/Cancel\" alert's other action occurred.")
);

var cancelAction = UIAlertAction.Create (cancelButtonTitle, UIAlertActionStyle.Cancel, _ =>
    Console.WriteLine ("The \"OK/Cancel\" alert's other action occurred.")
);

// Add the actions.
alertController.AddAction (acceptAction);
alertController.AddAction (cancelAction);
PresentViewController (alertController, true, null);

Esaminiamo in dettaglio questo codice. Prima di tutto, creiamo un nuovo avviso con il titolo e il messaggio specificati:

UIAlertController.Create (title, message, UIAlertControllerStyle.Alert)

Successivamente, per ogni pulsante che si vuole visualizzare nell'avviso viene creata un'azione che definisce il titolo del pulsante, il relativo stile e l'azione che si vuole eseguire se viene premuto il pulsante:

UIAlertAction.Create ("Button Title", UIAlertActionStyle.Default, _ =>
    // Do something when the button is pressed
    ...
);

L'enumerazione UIAlertActionStyle consente di impostare lo stile del pulsante come uno dei seguenti:

  • Impostazione predefinita : il pulsante sarà il pulsante predefinito selezionato quando viene visualizzato l'avviso.
  • Annulla : il pulsante è il pulsante Annulla per l'avviso.
  • Distruttivo : evidenzia il pulsante come azione distruttiva, ad esempio l'eliminazione di un file. Attualmente, tvOS esegue il rendering del pulsante Distruttivo con uno sfondo rosso.

Il AddAction metodo aggiunge l'azione specificata a UIAlertViewController e infine il PresentViewController (alertController, true, null) metodo visualizza l'avviso specificato all'utente.

Aggiunta di campi di testo

Oltre ad aggiungere azioni (pulsanti) all'avviso, è possibile aggiungere campi di testo all'avviso per consentire all'utente di inserire informazioni quali ID utente e password:

Campo di testo in un avviso

Se l'utente seleziona il campo di testo, verrà visualizzata la tastiera tvOS standard che consente di immettere un valore per il campo:

Immissione di testo

Nel codice seguente viene visualizzato un avviso OK/Annulla con un singolo campo di testo per l'immissione di un valore:

UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);
UITextField field = null;

// Add and configure text field
alert.AddTextField ((textField) => {
    // Save the field
    field = textField;

    // Initialize field
    field.Placeholder = placeholder;
    field.Text = text;
    field.AutocorrectionType = UITextAutocorrectionType.No;
    field.KeyboardType = UIKeyboardType.Default;
    field.ReturnKeyType = UIReturnKeyType.Done;
    field.ClearButtonMode = UITextFieldViewMode.WhileEditing;

});

// Add cancel button
alert.AddAction(UIAlertAction.Create("Cancel",UIAlertActionStyle.Cancel,(actionCancel) => {
    // User canceled, do something
    ...
}));

// Add ok button
alert.AddAction(UIAlertAction.Create("OK",UIAlertActionStyle.Default,(actionOK) => {
    // User selected ok, do something
    ...
}));

// Display the alert
controller.PresentViewController(alert,true,null);

Il AddTextField metodo aggiunge un nuovo campo di testo all'avviso che è quindi possibile configurare impostando proprietà come il testo segnaposto (il testo visualizzato quando il campo è vuoto), il valore di testo predefinito e il tipo di tastiera. Ad esempio:

// Initialize field
field.Placeholder = placeholder;
field.Text = text;
field.AutocorrectionType = UITextAutocorrectionType.No;
field.KeyboardType = UIKeyboardType.Default;
field.ReturnKeyType = UIReturnKeyType.Done;
field.ClearButtonMode = UITextFieldViewMode.WhileEditing;

Per poter agire sul valore del campo di testo in un secondo momento, verrà salvata anche una copia di usando il codice seguente:

UITextField field = null;
...

// Add and configure text field
alert.AddTextField ((textField) => {
    // Save the field
    field = textField;
    ...
});

Dopo che l'utente ha immesso un valore nel campo di testo, è possibile usare la field variabile per accedere a tale valore.

Classe helper del controller di visualizzazione avvisi

Poiché la visualizzazione di tipi semplici e comuni di avvisi tramite UIAlertViewController può comportare un po' di codice duplicato, è possibile usare una classe helper per ridurre la quantità di codice ripetitivo. Ad esempio:

using System;
using Foundation;
using UIKit;
using System.CodeDom.Compiler;

namespace UIKit
{
    /// <summary>
    /// Alert view controller is a reusable helper class that makes working with <c>UIAlertViewController</c> alerts
    /// easier in a tvOS app.
    /// </summary>
    public class AlertViewController
    {
        #region Static Methods
        public static UIAlertController PresentOKAlert(string title, string description, UIViewController controller) {
            // No, inform the user that they must create a home first
            UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);

            // Configure the alert
            alert.AddAction(UIAlertAction.Create("OK",UIAlertActionStyle.Default,(action) => {}));

            // Display the alert
            controller.PresentViewController(alert,true,null);

            // Return created controller
            return alert;
        }

        public static UIAlertController PresentOKCancelAlert(string title, string description, UIViewController controller, AlertOKCancelDelegate action) {
            // No, inform the user that they must create a home first
            UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);

            // Add cancel button
            alert.AddAction(UIAlertAction.Create("Cancel",UIAlertActionStyle.Cancel,(actionCancel) => {
                // Any action?
                if (action!=null) {
                    action(false);
                }
            }));

            // Add ok button
            alert.AddAction(UIAlertAction.Create("OK",UIAlertActionStyle.Default,(actionOK) => {
                // Any action?
                if (action!=null) {
                    action(true);
                }
            }));

            // Display the alert
            controller.PresentViewController(alert,true,null);

            // Return created controller
            return alert;
        }

        public static UIAlertController PresentDestructiveAlert(string title, string description, string destructiveAction, UIViewController controller, AlertOKCancelDelegate action) {
            // No, inform the user that they must create a home first
            UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);

            // Add cancel button
            alert.AddAction(UIAlertAction.Create("Cancel",UIAlertActionStyle.Cancel,(actionCancel) => {
                // Any action?
                if (action!=null) {
                    action(false);
                }
            }));

            // Add ok button
            alert.AddAction(UIAlertAction.Create(destructiveAction,UIAlertActionStyle.Destructive,(actionOK) => {
                // Any action?
                if (action!=null) {
                    action(true);
                }
            }));

            // Display the alert
            controller.PresentViewController(alert,true,null);

            // Return created controller
            return alert;
        }

        public static UIAlertController PresentTextInputAlert(string title, string description, string placeholder, string text, UIViewController controller, AlertTextInputDelegate action) {
            // No, inform the user that they must create a home first
            UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);
            UITextField field = null;

            // Add and configure text field
            alert.AddTextField ((textField) => {
                // Save the field
                field = textField;

                // Initialize field
                field.Placeholder = placeholder;
                field.Text = text;
                field.AutocorrectionType = UITextAutocorrectionType.No;
                field.KeyboardType = UIKeyboardType.Default;
                field.ReturnKeyType = UIReturnKeyType.Done;
                field.ClearButtonMode = UITextFieldViewMode.WhileEditing;

            });

            // Add cancel button
            alert.AddAction(UIAlertAction.Create("Cancel",UIAlertActionStyle.Cancel,(actionCancel) => {
                // Any action?
                if (action!=null) {
                    action(false,"");
                }
            }));

            // Add ok button
            alert.AddAction(UIAlertAction.Create("OK",UIAlertActionStyle.Default,(actionOK) => {
                // Any action?
                if (action!=null && field !=null) {
                    action(true, field.Text);
                }
            }));

            // Display the alert
            controller.PresentViewController(alert,true,null);

            // Return created controller
            return alert;
        }
        #endregion

        #region Delegates
        public delegate void AlertOKCancelDelegate(bool OK);
        public delegate void AlertTextInputDelegate(bool OK, string text);
        #endregion
    }
}

Usando questa classe, è possibile visualizzare e rispondere agli avvisi semplici come indicato di seguito:

#region Custom Actions
partial void DisplayDestructiveAlert (Foundation.NSObject sender) {
    // User helper class to present alert
    AlertViewController.PresentDestructiveAlert("A Short Title is Best","The message should be a short, complete sentence.","Delete",this, (ok) => {
        Console.WriteLine("Destructive Alert: The user selected {0}",ok);
    });
}

partial void DisplayOkCancelAlert (Foundation.NSObject sender) {
    // User helper class to present alert
    AlertViewController.PresentOKCancelAlert("A Short Title is Best","The message should be a short, complete sentence.",this, (ok) => {
        Console.WriteLine("OK/Cancel Alert: The user selected {0}",ok);
    });
}

partial void DisplaySimpleAlert (Foundation.NSObject sender) {
    // User helper class to present alert
    AlertViewController.PresentOKAlert("A Short Title is Best","The message should be a short, complete sentence.",this);
}

partial void DisplayTextInputAlert (Foundation.NSObject sender) {
    // User helper class to present alert
    AlertViewController.PresentTextInputAlert("A Short Title is Best","The message should be a short, complete sentence.","placeholder", "", this, (ok, text) => {
        Console.WriteLine("Text Input Alert: The user selected {0} and entered `{1}`",ok,text);
    });
}
#endregion

Riepilogo

Questo articolo ha illustrato come usare UIAlertController per visualizzare un messaggio di avviso all'utente in Xamarin.tvOS. In primo luogo, ha illustrato come visualizzare un avviso semplice e aggiungere pulsanti. Successivamente, è stato illustrato come aggiungere campi di testo a un avviso. Infine, ha illustrato come usare una classe helper per ridurre la quantità di codice ripetitivo necessaria per visualizzare un avviso.