Share via


Introduzione a MonoTouch.Dialog per Xamarin.iOS

MonoTouch.Dialog, detto MT. D per brevità, è un toolkit di sviluppo rapido dell'interfaccia utente che consente agli sviluppatori di compilare schermate dell'applicazione e navigazione usando informazioni, anziché il tedium di creazione di controller di visualizzazione, tabelle e così via. Di conseguenza, offre una semplificazione significativa dello sviluppo e della riduzione del codice dell'interfaccia utente. Si consideri ad esempio lo screenshot seguente:

For example, consider this screenshot

Per definire l'intera schermata è stato usato il codice seguente:

public enum Category
{
    Travel,
    Lodging,
    Books
}
        
public class Expense
{
    [Section("Expense Entry")]

    [Entry("Enter expense name")]
    public string Name;
    [Section("Expense Details")]
  
    [Caption("Description")]
    [Entry]
    public string Details;
        
    [Checkbox]
    public bool IsApproved = true;
    [Caption("Category")]
    public Category ExpenseCategory;
}

Quando si usano tabelle in iOS, spesso è presente un tonno di codice ripetitivo. Ad esempio, ogni volta che è necessaria una tabella, è necessaria un'origine dati per popolare tale tabella. In un'applicazione con due schermate basate su tabella connesse tramite un controller di spostamento, ogni schermata condivide molto dello stesso codice.

MONTE. D semplifica questa operazione incapsulando tutto il codice in un'API generica per la creazione di tabelle. Fornisce quindi un'astrazione sopra l'API che consente una sintassi di associazione di oggetti dichiarativa che rende ancora più semplice. Di conseguenza, in MT sono disponibili due API. D:

  • API Elementi di basso livello: l'APIElements si basa sulla creazione di un albero gerarchico di elementi che rappresentano schermate e relativi componenti. L'API Elements offre agli sviluppatori la massima flessibilità e controllo nella creazione di interfacce utente. Inoltre, l'API Elements offre supporto avanzato per la definizione dichiarativa tramite JSON, che consente sia una dichiarazione incredibilmente veloce, sia la generazione dinamica dell'interfaccia utente da un server.
  • API Reflection di alto livello: nota anche come API di associazione, in cui le classi vengono annotate con hint dell'interfaccia utente e quindi MT. D crea automaticamente schermate basate sugli oggetti e fornisce un'associazione tra ciò che viene visualizzato (e facoltativamente modificato) sullo schermo e il backup dell'oggetto sottostante. L'esempio precedente illustra l'uso dell'API Reflection. Questa API non fornisce il controllo con granularità fine eseguito dall'API degli elementi, ma riduce ulteriormente la complessità creando automaticamente la gerarchia degli elementi in base agli attributi della classe.

MONTE. D è dotato di un ampio set di elementi dell'interfaccia utente predefiniti per la creazione dello schermo, ma riconosce anche la necessità di elementi personalizzati e layout dello schermo avanzati. Di conseguenza, l'estendibilità è una prima classe inserita nell'API. Gli sviluppatori possono estendere gli elementi esistenti o crearne di nuovi e quindi integrarsi senza problemi.

Inoltre, MT. D ha una serie di funzionalità comuni dell'esperienza utente iOS integrate, ad esempio il supporto "pull-to-refresh", il caricamento asincrono delle immagini e il supporto per la ricerca.

Questo articolo esaminerà in modo completo l'uso di MT. D, tra cui:

  • MONTE. Componenti D: questa operazione si concentrerà sulla comprensione delle classi che costituiscono MT. D per velocizzare la velocità.
  • Riferimento agli elementi: elenco completo degli elementi predefiniti di MT.D.
  • Utilizzo avanzato: vengono illustrate funzionalità avanzate, ad esempio l'aggiornamento pull-to-refresh, la ricerca, il caricamento di immagini in background, l'uso di LINQ per compilare gerarchie di elementi e la creazione di elementi, celle e controller personalizzati da usare con MT.D.

Configurazione di MT. D

MONTE. D viene distribuito con Xamarin.iOS. Per usarlo, fare clic con il pulsante destro del mouse sul nodo Riferimenti di un progetto Xamarin.iOS in Visual Studio 2017 o Visual Studio per Mac e aggiungere un riferimento all'assembly MonoTouch.Dialog-1. using MonoTouch.Dialog Aggiungere quindi istruzioni nel codice sorgente in base alle esigenze.

Informazioni sui pezzi di MT. D

Anche quando si usa l'API Reflection, MT. D crea una gerarchia di elementi sotto il cofano, come se fosse stata creata direttamente tramite l'API Elements. Inoltre, il supporto JSON indicato nella sezione precedente crea anche Elementi. Per questo motivo, è importante avere una conoscenza di base dei pezzi costitutivi di MT.D.

MONTE. D compila schermate usando le quattro parti seguenti:

  • DialogViewController
  • RootElement
  • Sezione
  • elemento

DialogViewController

DialogViewController, o DVC per brevità, eredita da UITableViewController e quindi rappresenta una schermata con una tabella. I DVD possono essere inseriti in un controller di spostamento proprio come un normale UITableViewController.

RootElement

RootElement è il contenitore di primo livello per gli elementi che vengono inseriti in un DVC. Contiene sezioni, che possono quindi contenere elementi. Il rendering di RootElements non viene eseguito; sono invece semplicemente contenitori per ciò che viene effettivamente sottoposto a rendering. Un Elemento RootElement viene assegnato a un DVC e quindi esegue il rendering dei relativi elementi figlio.

Sezione

Una sezione è un gruppo di celle in una tabella. Come per una sezione normale della tabella, può facoltativamente avere un'intestazione e un piè di pagina che possono essere di testo o persino visualizzazioni personalizzate, come nello screenshot seguente:

As with a normal table section, it can optionally have a header and footer that can either be text, or even custom views, as in this screenshot

Elemento

Un elemento rappresenta una cella effettiva nella tabella. MONTE. D è dotato di un'ampia gamma di elementi che rappresentano tipi di dati diversi o input diversi. Ad esempio, gli screenshot seguenti illustrano alcuni degli elementi disponibili:

For example, this screenshots illustrate a few of the available elements

Altre informazioni su sezioni e RootElements

Verranno ora illustrati in modo più dettagliato RootElements e Sections.

RootElements

Almeno un Elemento RootElement è necessario per avviare il processo MonoTouch.Dialog.

Se un elemento RootElement viene inizializzato con un valore di sezione/elemento, questo valore viene usato per individuare un elemento figlio che fornirà un riepilogo della configurazione, di cui viene eseguito il rendering sul lato destro della visualizzazione. Ad esempio, lo screenshot seguente mostra una tabella a sinistra con una cella contenente il titolo della schermata dei dettagli a destra, "Dessert", insieme al valore del deserto selezionato.

This screenshot shows a table on the left with a cell containing the title of the detail screen on the right, Dessert, along with the value of the selected desertThis screenshot below shows a table on the left with a cell containing the title of the detail screen on the right, Dessert, along with the value of the selected desert

Gli elementi radice possono essere usati anche all'interno di Sezioni per attivare il caricamento di una nuova pagina di configurazione annidata, come illustrato in precedenza. Se usato in questa modalità, il didascalia fornito viene usato durante il rendering all'interno di una sezione e viene usato anche come Titolo per la pagina secondaria. Ad esempio:

var root = new RootElement ("Meals") {
    new Section ("Dinner") {
        new RootElement ("Dessert", new RadioGroup ("dessert", 2)) {
            new Section () {
                new RadioElement ("Ice Cream", "dessert"),
                new RadioElement ("Milkshake", "dessert"),
                new RadioElement ("Chocolate Cake", "dessert")
            }
        }
    }
};

Nell'esempio precedente, quando l'utente tocca "Dessert", MonoTouch.Dialog creerà una nuova pagina e la passerà con la radice "Dessert" e con un gruppo di radio con tre valori.

In questo esempio particolare, il gruppo di radio selezionerà "Chocolate Cake" nella sezione "Dessert" perché è stato passato il valore "2" al RadioGroup. Ciò significa che selezionare il terzo elemento nell'elenco (indice zero).

La chiamata al metodo Add o l'uso della sintassi dell'inizializzatore C# 4 aggiunge sezioni. I metodi Insert vengono forniti per inserire sezioni con un'animazione.

Se si crea RootElement con un'istanza di Group (anziché un RadioGroup), il valore di riepilogo di RootElement quando visualizzato in una sezione sarà il conteggio cumulativo di tutti gli elementi BooleanElement e CheckboxElement che hanno la stessa chiave del valore Group.Key.

Sezioni

Le sezioni vengono usate per raggruppare gli elementi nella schermata e sono gli unici elementi figlio diretti validi di RootElement. Le sezioni possono contenere uno qualsiasi degli elementi standard, inclusi i nuovi Elementi RootElement.

Gli elementi RootElement incorporati in una sezione vengono usati per passare a un nuovo livello più profondo.

Le sezioni possono avere intestazioni e piè di pagina come stringhe o come uiView. In genere si useranno solo le stringhe, ma per creare interfacce utente personalizzate è possibile usare qualsiasi uiView come intestazione o piè di pagina. È possibile usare una stringa per crearle come segue:

var section = new Section ("Header", "Footer");

Per usare le visualizzazioni, è sufficiente passare le visualizzazioni al costruttore:

var header = new UIImageView (Image.FromFile ("sample.png"));
var section = new Section (header);

Ricevere una notifica

Gestione di NSAction

MONTE. D espone un oggetto NSAction come delegato per la gestione dei callback. Si supponga, ad esempio, di voler gestire un evento di tocco per una cella di tabella creata da MT.D. Quando si crea un elemento con MT. D, specificare semplicemente una funzione di callback, come illustrato di seguito:

new Section () {
    new StringElement ("Demo Callback", delegate { Console.WriteLine ("Handled"); })
}

Recupero del valore dell'elemento

In combinazione con la Element.Value proprietà , il callback può recuperare il valore impostato in altri elementi. Si consideri il codice di esempio seguente:

var element = new EntryElement (task.Name, "Enter task description", task.Description);
                
var taskElement = new RootElement (task.Name) {
    new Section () { element },
    new Section () { new DateElement ("Due Date", task.DueDate) },
    new Section ("Demo Retrieving Element Value") {
        new StringElement ("Output Task Description", delegate { Console.WriteLine (element.Value); })
    }
};

Questo codice crea un'interfaccia utente come illustrato di seguito. Per una procedura dettagliata completa di questo esempio, vedere l'esercitazione procedura dettagliata sull'API Elements.

Combined with the Element.Value property, the callback can retrieve the value set in other elements

Quando l'utente preme la cella della tabella inferiore, viene eseguito il codice nella funzione anonima, scrivendo il valore dall'istanza nel riquadro Output dell'applicazione element in Visual Studio per Mac.

Elementi predefiniti

MONTE. D viene fornito con una serie di elementi delle celle di tabella predefiniti noti come Elementi. Questi elementi vengono usati per visualizzare un'ampia gamma di tipi diversi nelle celle di tabella, ad esempio stringhe, float, date e persino immagini, per citarne solo alcuni. Ogni elemento si occupa della visualizzazione appropriata del tipo di dati. Ad esempio, un elemento booleano visualizzerà un interruttore per attivarne il valore. Analogamente, un elemento float visualizzerà un dispositivo di scorrimento per modificare il valore float.

Sono disponibili elementi ancora più complessi per supportare tipi di dati più avanzati, ad esempio immagini e html. Ad esempio, un elemento html, che aprirà un UIWebView per caricare una pagina Web quando selezionata, visualizza un didascalia nella cella della tabella.

Utilizzo dei valori degli elementi

Gli elementi utilizzati per acquisire l'input dell'utente espongono una proprietà pubblica Value che contiene il valore corrente dell'elemento in qualsiasi momento. Viene aggiornato automaticamente quando l'utente usa l'applicazione.

Questo è il comportamento per tutti gli elementi che fanno parte di MonoTouch.Dialog, ma non è necessario per gli elementi creati dall'utente.

Elemento String

Un StringElement oggetto mostra un didascalia sul lato sinistro di una cella della tabella e il valore stringa a destra della cella.

A StringElement shows a caption on the left side of a table cell and the string value on the right side of the cell

Per usare un oggetto StringElement come pulsante, specificare un delegato.

new StringElement ("Click me", () => { 
    new UIAlertView("Tapped", "String Element Tapped", null, "ok", null).Show();
});

To use a StringElement as a button, provide a delegate

Elemento String con stile

Un StyledStringElement consente di presentare stringhe utilizzando stili di cella di tabella predefiniti o con formattazione personalizzata.

A StyledStringElement allows strings to be presented using either built-in table cell styles or with custom formatting

La StyledStringElement classe deriva da StringElement, ma consente agli sviluppatori di personalizzare alcune proprietà, ad esempio Font, colore del testo, colore della cella di sfondo, modalità di interruzione della riga, numero di righe da visualizzare e se deve essere visualizzato un accessorio.

Elemento multilinea

Multiline Element

Elemento Entry

, EntryElementcome suggerisce il nome, viene usato per ottenere l'input dell'utente. Supporta stringhe regolari o password, in cui i caratteri sono nascosti.

The EntryElement is used to get user input

Viene inizializzato con tre valori:

  • Il didascalia per la voce che verrà visualizzata all'utente.
  • Testo segnaposto (testo disattivato che fornisce un suggerimento all'utente).
  • Valore del testo.

Il segnaposto e il valore possono essere Null. Tuttavia, il didascalia è obbligatorio.

In qualsiasi momento, l'accesso alla relativa proprietà Value può recuperare il valore di EntryElement.

Inoltre, la KeyboardType proprietà può essere impostata in fase di creazione sullo stile del tipo di tastiera desiderato per la voce di dati. Può essere usato per configurare la tastiera usando i valori di UIKeyboardType come indicato di seguito:

  • Numerico
  • il numero
  • Url
  • E-mail

Elemento booleano

Boolean Element

Elemento Checkbox

Checkbox Element

Elemento Radio

Un RadioElement oggetto deve RadioGroup essere specificato in RootElement.

mtRoot = new RootElement ("Demos", new RadioGroup("MyGroup", 0));

A RadioElement requires a RadioGroup to be specified in the RootElement

RootElements vengono usati anche per coordinare gli elementi radio. I RadioElement membri possono estendersi su più sezioni( ad esempio per implementare qualcosa di simile al selettore del tono dell'anello e separare i toni degli anelli personalizzati dalle suonerie di sistema). La visualizzazione riepilogo mostrerà l'elemento radio attualmente selezionato. Per usarlo, creare RootElement con il costruttore di gruppo, come illustrato di seguito:

var root = new RootElement ("Meals", new RadioGroup ("myGroup", 0));

Il nome del gruppo in RadioGroup viene usato per visualizzare il valore selezionato nella pagina contenitore (se presente) e il valore, che in questo caso è zero, è l'indice del primo elemento selezionato.

Elemento Badge

Badge Element

Elemento Float

Float Element

Elemento Activity

Activity Element

Elemento Date

Date Element

Quando viene selezionata la cella corrispondente a DateElement, viene visualizzata una selezione data, come illustrato di seguito:

When the cell corresponding to the DateElement is selected, a date picker is presented as shown

Elemento Time

Time Element

Quando viene selezionata la cella corrispondente a TimeElement, viene visualizzata una selezione ora, come illustrato di seguito:

When the cell corresponding to the TimeElement is selected, a time picker is presented as shown

Elemento DateTime

DateTime Element

Quando viene selezionata la cella corrispondente a DateTimeElement, viene visualizzata una selezione datetime, come illustrato di seguito:

When the cell corresponding to the DateTimeElement is selected, a datetime picker is presented as shown

Elemento HTML

HTML Element

HTMLElement Visualizza il valore della relativa Caption proprietà nella cella della tabella. Whe selezionato, l'oggetto Url assegnato all'elemento viene caricato in un UIWebView controllo come illustrato di seguito:

Whe selected, the Url assigned to the element is loaded in a UIWebView control as shown below

Elemento messaggio

Message Element

Carica altro elemento

Usare questo elemento per consentire agli utenti di caricare più elementi nell'elenco. È possibile personalizzare le didascalia normali e caricate, nonché il colore del carattere e del testo. L'indicatore UIActivity avvia l'animazione e il caricamento didascalia viene visualizzato quando un utente tocca la cella e quindi viene eseguito il NSAction passaggio al costruttore. Al termine del codice in NSAction , l'indicatore interrompe l'animazione UIActivity e il normale didascalia viene visualizzato di nuovo.

Elemento UIView

Inoltre, qualsiasi personalizzato UIView può essere visualizzato usando .UIViewElement

Elemento Owner-Drawn

Questo elemento deve essere sottoclassato perché è una classe astratta. È consigliabile eseguire l'override del Height(RectangleF bounds) metodo in cui restituire l'altezza dell'elemento, nonché Draw(RectangleF bounds, CGContext context, UIView view) in cui è necessario eseguire tutto il disegno personalizzato all'interno dei limiti specificati, usando il contesto e i parametri di visualizzazione. Questo elemento esegue l'aumento elevato della sottoclassazione di un UIViewoggetto e lo inserisce nella cella da restituire, lasciando solo necessario implementare due semplici override. È possibile visualizzare un'implementazione di esempio migliore nell'app di esempio nel DemoOwnerDrawnElement.cs file .

Ecco un esempio molto semplice di implementazione della classe :

public class SampleOwnerDrawnElement : OwnerDrawnElement
{
    public SampleOwnerDrawnElement (string text) : base(UITableViewCellStyle.Default, "sampleOwnerDrawnElement")
    {
        this.Text = text;
    }

    public string Text { get; set; }

    public override void Draw (RectangleF bounds, CGContext context, UIView view)
    {
        UIColor.White.SetFill();
        context.FillRect(bounds);

        UIColor.Black.SetColor();   
        view.DrawString(this.Text, new RectangleF(10, 15, bounds.Width - 20, bounds.Height - 30), UIFont.BoldSystemFontOfSize(14.0f), UILineBreakMode.TailTruncation);
    }

    public override float Height (RectangleF bounds)
    {
        return 44.0f;
    }
}

Elemento JSON

JsonElement è una sottoclasse di RootElement che estende un RootElement oggetto per poter caricare il contenuto dell'elemento figlio annidato da un URL locale o remoto.

JsonElement è un oggetto RootElement di cui è possibile creare un'istanza in due forme. Una versione crea un oggetto RootElement che caricherà il contenuto su richiesta. Questi vengono creati usando i JsonElement costruttori che accettano un argomento aggiuntivo alla fine, l'URL da cui caricare il contenuto:

var je = new JsonElement ("Dynamic Data", "https://tirania.org/tmp/demo.json");

L'altro modulo crea i dati da un file locale o da un esistente System.Json.JsonObject già analizzato:

var je = JsonElement.FromFile ("json.sample");
using (var reader = File.OpenRead ("json.sample"))
    return JsonElement.FromJson (JsonObject.Load (reader) as JsonObject, arg);

Per altre informazioni sull'uso di JSON con MT. D, vedere l'esercitazione dettagliata sull'elemento JSON.

Altre funzionalità

Supporto per l'aggiornamento tramite trascinamento verso il basso

Pull-to-Refresh è un effetto visivo originariamente trovato nell'app Tweetie2, che è diventato un effetto popolare tra molte applicazioni.

Per aggiungere il supporto automatico da pull a aggiornamento alle finestre di dialogo, è sufficiente eseguire due operazioni: associare un gestore eventi per ricevere una notifica quando l'utente esegue il pull dei dati e notifica DialogViewController quando i dati sono stati caricati per tornare allo stato predefinito.

L'associazione di una notifica è semplice; è sufficiente connettersi all'evento RefreshRequested in DialogViewController, come illustrato di seguito:

dvc.RefreshRequested += OnUserRequestedRefresh;

Quindi, nel metodo OnUserRequestedRefresh, si accoderebbe il caricamento di alcuni dati, si richiedevano alcuni dati dalla rete o si spin un thread per calcolare i dati. Dopo aver caricato i dati, è necessario notificare DialogViewController che i nuovi dati si trovano e ripristinare lo stato predefinito della visualizzazione, è necessario chiamare ReloadComplete:

dvc.ReloadComplete ();

Supporto per la ricerca

Per supportare la ricerca, impostare la EnableSearch proprietà su DialogViewController. È anche possibile impostare la SearchPlaceholder proprietà da utilizzare come testo della filigrana nella barra di ricerca.

La ricerca modificherà il contenuto della visualizzazione man mano che l'utente digita. Esegue una ricerca nei campi visibili e mostra quelli all'utente. DialogViewController espone tre metodi per avviare, terminare o attivare a livello di codice una nuova operazione di filtro sui risultati. Questi metodi sono elencati di seguito:

  • StartSearch
  • FinishSearch
  • PerformFilter

Il sistema è estendibile, quindi è possibile modificare questo comportamento, se necessario.

Caricamento di immagini di sfondo

MonoTouch.Dialog incorpora il caricatore di immagini dell'applicazione TweetStation . Questo caricatore di immagini può essere usato per caricare immagini in background, supporta la memorizzazione nella cache e può notificare al codice quando l'immagine è stata caricata.

Limiterà anche il numero di connessioni di rete in uscita.

Il caricatore di immagini viene implementato nella ImageLoader classe , tutto quello che devi fare è chiamare il DefaultRequestImage metodo , dovrai fornire l'URI per l'immagine che vuoi caricare, nonché un'istanza dell'interfaccia IImageUpdated che verrà richiamata quando l'immagine è stata caricata.

Ad esempio, il codice seguente carica un'immagine da un URL in :BadgeElement

string uriString = "http://some-server.com/some image url";

var rootElement = new RootElement("Image Loader") {
    new Section() {
        new BadgeElement( ImageLoader.DefaultRequestImage( new Uri(uriString), this), "Xamarin")
    }
};

La classe ImageLoader espone un metodo Purge che è possibile chiamare quando si desidera rilasciare tutte le immagini attualmente memorizzate nella cache. Il codice corrente ha una cache per 50 immagini. Se si vuole usare una dimensione della cache diversa ( ad esempio, se si prevede che le immagini siano troppo grandi che 50 immagini sarebbero troppo grandi), è sufficiente creare istanze di ImageLoader e passare il numero di immagini che si desidera mantenere nella cache.

Uso di LINQ to Create Element Hierarchy

Tramite l'uso intelligente della sintassi di inizializzazione di LINQ e C#, LINQ può essere usato per creare una gerarchia di elementi. Ad esempio, il codice seguente crea una schermata da alcune matrici di stringhe e gestisce la selezione delle celle tramite una funzione anonima passata a ogni StringElement:

var rootElement = new RootElement ("LINQ root element") {
    from x in new string [] { "one", "two", "three" }
    select new Section (x) {
        from y in "Hello:World".Split (':')
        select (Element) new StringElement (y, delegate { Debug.WriteLine("cell tapped"); })
    }
};

Questa operazione può essere facilmente combinata con un archivio dati o dati XML da un database per creare applicazioni complesse quasi interamente dai dati.

Estensione di MT. D

Creazione di elementi personalizzati

È possibile creare un elemento personalizzato ereditando da un elemento esistente o derivando dall'elemento della classe radice.

Per creare un elemento personalizzato, è necessario eseguire l'override dei metodi seguenti:

// To release any heavy resources that you might have
void Dispose (bool disposing);

// To retrieve the UITableViewCell for your element
// you would need to prepare the cell to be reused, in the
// same way that UITableView expects reusable cells to work
UITableViewCell GetCell (UITableView tv);

// To retrieve a "summary" that can be used with
// a root element to render a summary one level up.  
string Summary ();

// To detect when the user has tapped on the cell
void Selected (DialogViewController dvc, UITableView tableView, NSIndexPath path);

// If you support search, to probe if the cell matches the user input
bool Matches (string text);

Se l'elemento può avere una dimensione variabile, è necessario implementare l'interfaccia IElementSizing , che contiene un metodo:

// Returns the height for the cell at indexPath.Section, indexPath.Row
float GetHeight (UITableView tableView, NSIndexPath indexPath);

Se si prevede di implementare il GetCell metodo chiamando base.GetCell(tv) e personalizzando la cella restituita, è necessario eseguire anche l'override della CellKey proprietà per restituire una chiave che sarà univoca per l'elemento, come illustrato di seguito:

static NSString MyKey = new NSString ("MyKey");
protected override NSString CellKey {
    get {
        return MyKey;
    }
}

Questo comportamento funziona per la StringElement maggior parte degli elementi, ma non per e StyledStringElement , poiché questi usano il proprio set di chiavi per vari scenari di rendering. È necessario replicare il codice in tali classi.

DialogViewControllers (DVCs)

Sia la reflection che l'API Elements usano lo stesso DialogViewController. A volte si vuole personalizzare l'aspetto della visualizzazione o si potrebbe voler usare alcune funzionalità di UITableViewController che vanno oltre la creazione di interfacce utente di base.

DialogViewController è semplicemente una sottoclasse di UITableViewController e è possibile personalizzarla nello stesso modo in cui si personalizza un oggetto UITableViewController.

Ad esempio, se si desidera modificare lo stile dell'elenco in modo che sia Grouped o Plain, è possibile impostare questo valore modificando la proprietà quando si crea il controller, come illustrato di seguito:

var myController = new DialogViewController (root, true) {
    Style = UITableViewStyle.Grouped;
}

Per personalizzazioni più avanzate di , ad esempio l'impostazione DialogViewControllerdello sfondo, è necessario sottoclassarla ed eseguire l'override dei metodi appropriati, come illustrato nell'esempio seguente:

class SpiffyDialogViewController : DialogViewController {
    UIImage image;

    public SpiffyDialogViewController (RootElement root, bool pushing, UIImage image) 
        : base (root, pushing) 
    {
        this.image = image;
    }

    public override LoadView ()
    {
        base.LoadView ();
        var color = UIColor.FromPatternImage(image);
        TableView.BackgroundColor = UIColor.Clear;
        ParentViewController.View.BackgroundColor = color;
    }
}

Un altro punto di personalizzazione è costituito dai metodi virtuali seguenti in DialogViewController:

public override Source CreateSizingSource (bool unevenRows)

Questo metodo deve restituire una sottoclasse di DialogViewController.Source per i casi in cui le celle vengono ridimensionate uniformemente o una sottoclasse di DialogViewController.SizingSource se le celle non sono uniformi.

È possibile usare questa override per acquisire uno dei UITableViewSource metodi. Ad esempio, TweetStation usa questa opzione per tenere traccia di quando l'utente ha eseguito lo scorrimento verso l'alto e aggiornare di conseguenza il numero di tweet non letti.

Convalida

Gli elementi non forniscono la convalida stessa perché i modelli adatti per le pagine Web e le applicazioni desktop non eseguono il mapping diretto al modello di interazione i Telefono.

Se si vuole eseguire la convalida dei dati, è necessario eseguire questa operazione quando l'utente attiva un'azione con i dati immessi. Ad esempio, un pulsante Fine o Avanti sulla barra degli strumenti superiore o alcuni StringElement usati come pulsante per passare alla fase successiva.

In questo caso è possibile eseguire la convalida di input di base e, ad esempio, una convalida più complessa, ad esempio la verifica della validità di una combinazione di utente/password con un server.

La modalità di notifica all'utente di un errore è specifica dell'applicazione. È possibile visualizzare un UIAlertView suggerimento o visualizzare un suggerimento.

Riepilogo

Questo articolo ha illustrato molte informazioni su MonoTouch.Dialog. Ha discusso i concetti fondamentali del modo in cui mt. D funziona e ha trattato i vari componenti che comprendono MT.D. Ha inoltre mostrato l'ampia gamma di elementi e personalizzazioni delle tabelle supportate da MT. D e ha discusso come MT. D può essere esteso con elementi personalizzati. È stato illustrato anche il supporto JSON in MT. D che consente di creare elementi in modo dinamico da JSON.