Einführung in MonoTouch.Dialog für Xamarin.iOS

MonoTouch.Dialog, auch als MT bezeichnet. D kurz, ist ein schnelles Ui-Entwicklungstoolkit, mit dem Entwickler Anwendungsbildschirme und Navigation mithilfe von Informationen erstellen können, anstatt Ansichtscontroller, Tabellen usw. zu erstellen. Daher bietet es eine erhebliche Vereinfachung der Entwicklung der Benutzeroberfläche und der Codereduzierung. Betrachten Sie beispielsweise den folgenden Screenshot:

Betrachten Sie beispielsweise diesen Screenshot.

Der folgende Code wurde verwendet, um diesen gesamten Bildschirm zu definieren:

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;
}

Bei der Arbeit mit Tabellen in iOS gibt es häufig eine Menge wiederholten Codes. Beispielsweise wird jedes Mal, wenn eine Tabelle benötigt wird, eine Datenquelle benötigt, um diese Tabelle aufzufüllen. In einer Anwendung, die über zwei tabellenbasierte Bildschirme verfügt, die über einen Navigationscontroller verbunden sind, teilt sich jeder Bildschirm einen Großteil desselben Codes.

MT. D vereinfacht dies, indem der gesamte Code in eine generische API für die Tabellenerstellung gekapselt wird. Anschließend wird zusätzlich zu dieser API eine Abstraktion bereitgestellt, die eine deklarative Objektbindungssyntax ermöglicht, die sie noch einfacher macht. Daher stehen in MT zwei APIs zur Verfügung. D:

  • Element-API auf niedriger Ebene : Die Elemente-API basiert auf der Erstellung einer hierarchischen Struktur von Elementen, die Bildschirme und deren Komponenten darstellen. Die Elements-API bietet Entwicklern die größte Flexibilität und Kontrolle beim Erstellen von UIs. Darüber hinaus bietet die Elements-API erweiterte Unterstützung für deklarative Definition per JSON, die sowohl eine unglaublich schnelle Deklaration als auch die dynamische Ui-Generierung von einem Server ermöglicht.
  • Allgemeine Reflektions-API– Auch bekannt als Bindungs-API , in der Klassen mit UI-Hinweisen und dann MT kommentiert werden. D erstellt automatisch Bildschirme basierend auf den Objekten und stellt eine Bindung zwischen dem, was auf dem Bildschirm angezeigt (und optional bearbeitet) wird, und der zugrunde liegenden Objektsicherung bereit. Im obigen Beispiel wurde die Verwendung der Reflektions-API veranschaulicht. Diese API bietet nicht die differenzierte Steuerung, die die Element-API ausführt, aber sie reduziert die Komplexität noch weiter, indem die Elementhierarchie automatisch basierend auf Klassenattributen aufgebaut wird.

MT. D ist mit einer großen Menge von integrierten UI-Elementen für die Bildschirmerstellung ausgestattet, erkennt aber auch die Notwendigkeit angepasster Elemente und erweiterter Bildschirmlayouts. Daher ist die Erweiterbarkeit ein erstklassiges Feature, das in die API integriert ist. Entwickler können die vorhandenen Elemente erweitern oder neue elemente erstellen und dann nahtlos integrieren.

Darüber hinaus ist MT. D verfügt über eine Reihe gängiger iOS-UX-Features, z. B. "Pull-to-Refresh"-Unterstützung, asynchrones Laden von Bildern und Suchunterstützung.

Dieser Artikel enthält einen umfassenden Einblick in die Arbeit mit MT. D, einschließlich:

  • MT. D-Komponenten : Der Schwerpunkt liegt auf dem Verständnis der Klassen, aus denen MT besteht. D, um schnelles Aufholen zu ermöglichen.
  • Elementreferenz : Eine umfassende Liste der integrierten Elemente von MT.D.
  • Erweiterte Verwendung : Dies umfasst erweiterte Features wie Pull-to-Refresh, Suche, Laden von Hintergrundbildern, Verwendung von LINQ zum Erstellen von Elementhierarchien und Erstellen von benutzerdefinierten Elementen, Zellen und Controllern für die Verwendung mit MT.D.

Einrichten von MT. D

MT. D wird mit Xamarin.iOS verteilt. Klicken Sie dazu mit der rechten Maustaste auf den Knoten Verweise eines Xamarin.iOS-Projekts in Visual Studio 2017 oder Visual Studio für Mac, und fügen Sie einen Verweis auf die MonoTouch.Dialog-1-Assembly hinzu. Fügen Sie dann nach Bedarf Anweisungen im Quellcode hinzu using MonoTouch.Dialog .

Grundlegendes zu den Teilen von MT. D

Auch bei Verwendung der Reflektions-API, MT. D erstellt eine Elementhierarchie unter der Haube, so als ob sie direkt über die Elemente-API erstellt würde. Außerdem erstellt die im vorherigen Abschnitt erwähnte JSON-Unterstützung auch Elemente. Aus diesem Grund ist es wichtig, ein grundlegendes Verständnis der Bestandteile von MT.D zu haben.

MT. D erstellt Bildschirme mit den folgenden vier Teilen:

  • DialogViewController
  • RootElement
  • Bereich
  • Element

DialogViewController

Ein DialogViewController, kurz DVC , erbt von UITableViewController und stellt daher einen Bildschirm mit einer Tabelle dar. DVCs können wie ein regulärer UITableViewController auf einen Navigationscontroller gepusht werden.

RootElement

Ein RootElement ist der Container auf oberster Ebene für die Elemente, die in einen DVC gelangen. Es enthält Abschnitte, die dann Elemente enthalten können. RootElements werden nicht gerendert. stattdessen sind sie einfach Container für das, was tatsächlich gerendert wird. Ein RootElement wird einem DVC zugewiesen, und dann rendert der DVC seine untergeordneten Elemente.

`Section`

Ein Abschnitt ist eine Gruppe von Zellen in einer Tabelle. Wie bei einem normalen Tabellenabschnitt kann er optional über eine Kopf- und Fußzeile verfügen, bei denen es sich entweder um Text oder sogar um benutzerdefinierte Ansichten handeln kann, wie im folgenden Screenshot gezeigt:

Wie bei einem normalen Tabellenabschnitt kann er optional über eine Kopf- und Fußzeile verfügen, bei der es sich entweder um Text oder sogar um benutzerdefinierte Ansichten handeln kann, wie in diesem Screenshot gezeigt.

Element

Ein Element stellt eine tatsächliche Zelle in der Tabelle dar. MT. D enthält eine Vielzahl von Elementen, die verschiedene Datentypen oder unterschiedliche Eingaben darstellen. Die folgenden Screenshots veranschaulichen beispielsweise einige der verfügbaren Elemente:

Diese Screenshots veranschaulichen beispielsweise einige der verfügbaren Elemente.

Weitere Informationen zu Abschnitten und RootElements

Lassen Sie uns nun ausführlicher auf RootElements und Abschnitte eingehen.

RootElements

Zum Starten des MonoTouch.Dialog-Prozesses ist mindestens ein RootElement erforderlich.

Wenn ein RootElement mit einem Abschnitts-/Elementwert initialisiert wird, wird dieser Wert verwendet, um ein untergeordnetes Element zu suchen, das eine Zusammenfassung der Konfiguration bereitstellt, die auf der rechten Seite der Anzeige gerendert wird. Der folgende Screenshot zeigt beispielsweise eine Tabelle auf der linken Seite mit einer Zelle mit dem Titel des Detailbildschirms auf der rechten Seite, "Dessert", zusammen mit dem Wert der ausgewählten Wüste.

Dieser Screenshot zeigt eine Tabelle auf der linken Seite mit einer Zelle mit dem Titel des Detailbildschirms auf der rechten Seite, Dessert, zusammen mit dem Wert der ausgewählten Wüste. Dieser Screenshot unten zeigt eine Tabelle auf der linken Seite mit einer Zelle, die den Titel des Detailbildschirms rechts enthält, Dessert, zusammen mit dem Wert der ausgewählten Wüste.

Stammelemente können auch in Abschnitten verwendet werden, um das Laden einer neuen geschachtelten Konfigurationsseite auszulösen, wie oben gezeigt. Bei Verwendung in diesem Modus wird die bereitgestellte Untertitel verwendet, während sie innerhalb eines Abschnitts gerendert wird, und wird auch als Titel für die Unterseite verwendet. Beispiel:

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")
            }
        }
    }
};

Wenn der Benutzer im obigen Beispiel auf "Dessert" tippt, erstellt MonoTouch.Dialog eine neue Seite und navigiert zu dieser Seite, wobei der Stamm "Dessert" ist und eine Funkgruppe mit drei Werten aufweist.

In diesem speziellen Beispiel wählt die Funkgruppe im Abschnitt "Dessert" "Schokoladenkuchen" aus, da wir den Wert "2" an RadioGroup übergeben haben. Dies bedeutet, dass Sie das 3. Element in der Liste auswählen (Nullindex).

Durch Aufrufen der Add-Methode oder mithilfe der C# 4-Initialisierersyntax werden Abschnitte hinzugefügt. Die Insert-Methoden werden zum Einfügen von Abschnitten mit einer Animation bereitgestellt.

Wenn Sie das RootElement mit einem Group instance (anstelle einer RadioGroup) erstellen, entspricht der Zusammenfassungswert des RootElement, wenn er in einem Abschnitt angezeigt wird, der kumulativen Anzahl aller BooleanElements und CheckboxElements, die denselben Schlüssel wie der Group.Key-Wert haben.

Abschnitte

Abschnitte werden verwendet, um Elemente auf dem Bildschirm zu gruppieren, und sie sind die einzigen gültigen direkten untergeordneten Elemente des RootElement. Abschnitte können jedes der Standardelemente enthalten, einschließlich neuer RootElements.

RootElements, die in einen Abschnitt eingebettet sind, werden verwendet, um zu einer neuen tieferen Ebene zu navigieren.

Abschnitte können Kopf- und Fußzeilen entweder als Zeichenfolgen oder als UIViews enthalten. In der Regel verwenden Sie nur die Zeichenfolgen, aber um benutzerdefinierte Benutzeroberflächen zu erstellen, können Sie eine beliebige UIView als Kopf- oder Fußzeile verwenden. Sie können entweder eine Zeichenfolge verwenden, um sie wie folgt zu erstellen:

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

Um Ansichten zu verwenden, übergeben Sie einfach die Ansichten an den Konstruktor:

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

Benachrichtigungen erhalten

Behandeln von NSAction

MT. D wird als Delegat für die Verarbeitung von Rückrufen angezeigt NSAction . Angenommen, Sie möchten ein Touchereignis für eine von MT.D erstellte Tabellenzelle behandeln. Beim Erstellen eines Elements mit MT. D, geben Sie einfach eine Rückruffunktion an, wie unten gezeigt:

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

Abrufen des Elementwerts

In Kombination mit der Element.Value -Eigenschaft kann der Rückruf den in anderen Elementen festgelegten Wert abrufen. Beachten Sie z. B. folgenden Code:

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); })
    }
};

Mit diesem Code wird eine Benutzeroberfläche erstellt, wie unten gezeigt. Eine vollständige exemplarische Vorgehensweise dieses Beispiels finden Sie im Tutorial Exemplarische Vorgehensweise für die Elements-API .

In Kombination mit der Element.Value-Eigenschaft kann der Rückruf den in anderen Elementen festgelegten Wert abrufen.

Wenn der Benutzer die untere Tabellenzelle drückt, wird der Code in der anonymen Funktion ausgeführt und schreibt den Wert aus dem element instance in das Pad Anwendungsausgabe in Visual Studio für Mac.

Built-In-Elemente

MT. D enthält eine Reihe von integrierten Tabellenzellenelementen, die als Elemente bezeichnet werden. Diese Elemente werden verwendet, um eine Vielzahl verschiedener Typen in Tabellenzellen anzuzeigen, z. B. Zeichenfolgen, Floats, Datumsangaben und sogar Bilder, um nur einige zu nennen. Jedes Element kümmert sich um die entsprechende Anzeige des Datentyps. Beispielsweise zeigt ein boolesches Element einen Schalter an, um den Wert umzuschalten. Ebenso zeigt ein float-Element einen Schieberegler an, um den Gleitkommawert zu ändern.

Es gibt noch komplexere Elemente, die umfangreichere Datentypen wie Bilder und HTML unterstützen. Ein HTML-Element, das beispielsweise eine UIWebView öffnet, um eine Webseite zu laden, wenn sie ausgewählt ist, zeigt eine Untertitel in der Tabellenzelle an.

Arbeiten mit Elementwerten

Elemente, die zum Erfassen von Benutzereingaben verwendet werden, machen jederzeit eine öffentliche Value Eigenschaft verfügbar, die den aktuellen Wert des Elements enthält. Sie wird automatisch aktualisiert, wenn der Benutzer die Anwendung verwendet.

Dies ist das Verhalten für alle Elemente, die Teil von MonoTouch.Dialog sind, aber es ist nicht für benutzerseitig erstellte Elemente erforderlich.

String-Element

Ein StringElement zeigt einen Untertitel auf der linken Seite einer Tabellenzelle und den Zeichenfolgenwert auf der rechten Seite der Zelle an.

Ein StringElement zeigt eine Untertitel auf der linken Seite einer Tabellenzelle und den Zeichenfolgenwert auf der rechten Seite der Zelle an.

Um eine StringElement als Schaltfläche zu verwenden, geben Sie einen Delegaten an.

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

Um ein StringElement als Schaltfläche zu verwenden, geben Sie einen Delegaten an

Formatiertes Zeichenfolgenelement

Ein StyledStringElement ermöglicht die Darstellung von Zeichenfolgen entweder mit integrierten Tabellenzellenformaten oder mit benutzerdefinierter Formatierung.

Ein StyledStringElement ermöglicht die Darstellung von Zeichenfolgen mit integrierten Tabellenzellenformaten oder mit benutzerdefinierter Formatierung.

Die StyledStringElement -Klasse leitet sich von ab StringElement, ermöglicht es Entwicklern jedoch, einige Eigenschaften wie Schriftart, Textfarbe, Hintergrundzellenfarbe, Zeilenumbruchmodus, Anzahl der anzuzeigenden Zeilen und die Anzeige eines Zubehörs anzupassen.

Mehrzeilenelement

Mehrzeilenelement

Entry-Element

Wie EntryElementder Name schon sagt, wird zum Abrufen von Benutzereingaben verwendet. Es unterstützt entweder reguläre Zeichenfolgen oder Kennwörter, bei denen Zeichen ausgeblendet werden.

Das EntryElement wird verwendet, um Benutzereingaben abzurufen.

Es wird mit drei Werten initialisiert:

  • Die Untertitel für den Eintrag, der dem Benutzer angezeigt wird.
  • Platzhaltertext (dies ist der abgeblendete Text, der dem Benutzer einen Hinweis gibt).
  • Der Textwert.

Platzhalter und Wert können NULL sein. Die Untertitel ist jedoch erforderlich.

Der Zugriff auf die Value-Eigenschaft kann jederzeit den Wert von EntryElementabrufen.

Darüber hinaus kann die KeyboardType -Eigenschaft zur Erstellungszeit auf die für die Dateneingabe gewünschte Tastaturtypart festgelegt werden. Dies kann verwendet werden, um die Tastatur mit den Werten von UIKeyboardType wie unten aufgeführt zu konfigurieren:

  • Numerisch
  • Anschluss
  • url
  • E-Mail

Boolesches Element

Boolesches Element

Checkbox-Element

Checkbox-Element

Radio-Element

Ein RadioElement erfordert, dass in RadioGroupRootElementangegeben wird.

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

Ein RadioElement erfordert, dass eine RadioGroup im RootElement angegeben wird.

RootElements werden auch verwendet, um Funkelemente zu koordinieren. Die RadioElement Elemente können mehrere Abschnitte umfassen (z. B. um eine Ähnliche wie die Ringtonauswahl zu implementieren und benutzerdefinierte Ringtöne von Systemringtönen zu trennen). In der Zusammenfassungsansicht wird das aktuell ausgewählte Radioelement angezeigt. Um dies zu verwenden, erstellen Sie mit RootElement dem Gruppenkonstruktor wie folgt:

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

Der Name der Gruppe in RadioGroup wird verwendet, um den ausgewählten Wert auf der enthaltenden Seite anzuzeigen (sofern vorhanden), und der Wert, der in diesem Fall 0 ist, ist der Index des ersten ausgewählten Elements.

Badge-Element

Badge-Element

Float-Element

Float-Element

Aktivitätselement

Aktivitätselement

Date-Element

Date-Element

Wenn die Zelle, die dem DateElement entspricht, ausgewählt ist, wird eine Datumsauswahl wie unten dargestellt angezeigt:

Wenn die Zelle, die dem DateElement entspricht, ausgewählt ist, wird eine Datumsauswahl wie gezeigt angezeigt angezeigt.

Time-Element

Time-Element

Wenn die Zelle, die dem TimeElement entspricht, ausgewählt ist, wird eine Zeitauswahl angezeigt, wie unten dargestellt:

Wenn die Zelle, die dem TimeElement entspricht, ausgewählt ist, wird eine Zeitauswahl wie gezeigt angezeigt angezeigt.

DateTime-Element

DateTime-Element

Wenn die Zelle, die dem DateTimeElement entspricht, ausgewählt ist, wird eine datetime-Auswahl wie unten dargestellt angezeigt:

Wenn die Zelle, die dem DateTimeElement entspricht, ausgewählt ist, wird eine datetime-Auswahl wie gezeigt angezeigt angezeigt.

HTML-Element

HTML-Element

Zeigt HTMLElement den Wert seiner Caption Eigenschaft in der Tabellenzelle an. Wenn sie ausgewählt ist, wird das Url dem Element zugewiesene wie unten gezeigt in ein UIWebView Steuerelement geladen:

Wenn sie ausgewählt ist, wird die dem Element zugewiesene URL in ein UIWebView-Steuerelement geladen, wie unten gezeigt

Message-Element

Message-Element

Weiteres Element laden

Verwenden Sie dieses Element, um Benutzern das Laden weiterer Elemente in Ihrer Liste zu ermöglichen. Sie können die normalen Und Ladebeschriftungen sowie die Schriftart und Die Textfarbe anpassen. Der UIActivity Indikator beginnt mit der Animierung, und das Laden Untertitel wird angezeigt, wenn ein Benutzer auf die Zelle tippt, und dann wird die NSAction an den Konstruktor übergebene ausgeführt. Sobald Ihr Code in NSAction abgeschlossen ist, wird der UIActivity Indikator nicht mehr animiert, und die normale Untertitel wird erneut angezeigt.

UIView-Element

Darüber hinaus können alle benutzerdefinierten UIView mithilfe von UIViewElementangezeigt werden.

Owner-Drawn-Element

Dieses Element muss unterklassiert werden, da es sich um eine abstrakte Klasse handelt. Sie sollten die Methode überschreiben, in der Height(RectangleF bounds) Sie die Höhe des Elements zurückgeben sollen, sowie Draw(RectangleF bounds, CGContext context, UIView view) in der Sie ihre gesamte benutzerdefinierte Zeichnung innerhalb der angegebenen Grenzen unter Verwendung der Kontext- und Ansichtsparameter ausführen sollten. Dieses Element führt das schwere Heben der Unterklassifizierung eines durch UIViewund platziert sie in der zurückzugebenden Zelle, sodass Sie nur zwei einfache Außerkraftsetzungen implementieren müssen. Eine bessere Beispielimplementierung wird in der Beispiel-App in der DemoOwnerDrawnElement.cs Datei angezeigt.

Hier sehen Sie ein sehr einfaches Beispiel für die Implementierung der -Klasse:

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;
    }
}

JSON-Element

Ist JsonElement eine Unterklasse von, die RootElement eine RootElement erweitert, um den Inhalt geschachtelter untergeordneter Elemente aus einer lokalen oder Remote-URL laden zu können.

Das JsonElement ist ein RootElement , das in zwei Formen instanziiert werden kann. Eine Version erstellt eine RootElement , die den Inhalt bei Bedarf lädt. Diese werden mithilfe der JsonElement Konstruktoren erstellt, die ein zusätzliches Argument am Ende der URL zum Laden des Inhalts verwenden:

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

Das andere Formular erstellt die Daten aus einer lokalen Datei oder einer vorhandenen System.Json.JsonObject Datei, die Sie bereits analysiert haben:

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

Weitere Informationen zur Verwendung von JSON mit MT. Sehen Sie sich das Tutorial zum JSON-Element Exemplarische Vorgehensweise an .

Andere Funktionen

Pull-to-Refresh-Unterstützung

Pull-to-Refresh ist ein visueller Effekt, der ursprünglich in der Tweetie2-App gefunden wurde und bei vielen Anwendungen zu einem beliebten Effekt wurde.

Um Ihren Dialogfeldern automatische Pull-to-Refresh-Unterstützung hinzuzufügen, müssen Sie nur zwei Dinge tun: Sie müssen einen Ereignishandler einbinden, um benachrichtigt zu werden, wenn der Benutzer die Daten abruft, und benachrichtigen DialogViewController , wenn die Daten geladen wurden, um in den Standardzustand zurückzukehren.

Das Einbinden einer Benachrichtigung ist einfach. Stellen Sie einfach eine Verbindung mit dem RefreshRequested -Ereignis auf dem DialogViewControllerher, wie folgt:

dvc.RefreshRequested += OnUserRequestedRefresh;

Anschließend würden Sie in Ihrer Methode OnUserRequestedRefreshdatenladen, daten aus dem Netz anfordern oder einen Thread drehen, um die Daten zu berechnen. Nachdem die Daten geladen wurden, müssen Sie den benachrichtigen, in dem DialogViewController sich die neuen Daten befinden, und um die Ansicht in ihren Standardzustand wiederherzustellen, rufen Sie folgendes auf ReloadComplete:

dvc.ReloadComplete ();

Suchunterstützung

Um die Suche zu unterstützen, legen Sie die EnableSearch -Eigenschaft für Ihr DialogViewControllerfest. Sie können auch die SearchPlaceholder -Eigenschaft festlegen, die als Wasserzeichentext in der Suchleiste verwendet werden soll.

Die Suche ändert den Inhalt der Ansicht, wenn der Benutzer eingibt. Es durchsucht die sichtbaren Felder und zeigt diese dem Benutzer an. Macht DialogViewController drei Methoden verfügbar, um einen neuen Filtervorgang für die Ergebnisse programmgesteuert zu initiieren, zu beenden oder auszulösen. Diese Methoden sind unten aufgeführt:

  • StartSearch
  • FinishSearch
  • PerformFilter

Das System ist erweiterbar, sodass Sie dieses Verhalten bei Bedarf ändern können.

Laden des Hintergrundbilds

MonoTouch.Dialog enthält den Bildladeprogramm der TweetStation-Anwendung . Dieses Imageloader kann verwendet werden, um Bilder im Hintergrund zu laden, unterstützt die Zwischenspeicherung und kann Ihren Code benachrichtigen, wenn das Bild geladen wurde.

Außerdem wird die Anzahl der ausgehenden Netzwerkverbindungen begrenzt.

Der Imageloader ist in der ImageLoader -Klasse implementiert. Sie müssen lediglich die DefaultRequestImage -Methode aufrufen. Sie müssen den URI für das Bild angeben, das Sie laden möchten, sowie eine instance der Schnittstelle, die IImageUpdated aufgerufen wird, wenn das Image geladen wurde.

Der folgende Code lädt beispielsweise ein Bild aus einer URL in ein 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")
    }
};

Die ImageLoader-Klasse macht eine Purge-Methode verfügbar, die Sie aufrufen können, wenn Sie alle Images freigeben möchten, die derzeit im Arbeitsspeicher zwischengespeichert sind. Der aktuelle Code verfügt über einen Cache für 50 Bilder. Wenn Sie eine andere Cachegröße verwenden möchten (für instance, wenn Sie erwarten, dass die Images zu groß sind, dass 50 Bilder zu viel wären), können Sie einfach Instanzen von ImageLoader erstellen und die Anzahl der Bilder übergeben, die Sie im Cache behalten möchten.

Verwenden von LINQ zum Erstellen einer Elementhierarchie

Durch die clevere Verwendung der Initialisierungssyntax von LINQ und C# kann LINQ verwendet werden, um eine Elementhierarchie zu erstellen. Der folgende Code erstellt beispielsweise einen Bildschirm aus einigen Zeichenfolgenarrays und behandelt die Zellauswahl über eine anonyme Funktion, die an jedes StringElementübergeben wird:

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"); })
    }
};

Dies kann problemlos mit einem XML-Datenspeicher oder Daten aus einer Datenbank kombiniert werden, um komplexe Anwendungen fast vollständig aus Daten zu erstellen.

Erweitern von MT. D

Erstellen benutzerdefinierter Elemente

Sie können Ein eigenes Element erstellen, indem Sie entweder von einem vorhandenen Element erben oder von der Stammklasse Element ableiten.

Um ein eigenes Element zu erstellen, sollten Sie die folgenden Methoden überschreiben:

// 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);

Wenn Ihr Element eine variable Größe haben kann, müssen Sie die IElementSizing -Schnittstelle implementieren, die eine Methode enthält:

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

Wenn Sie planen, ihre GetCell Methode zu implementieren, indem Sie die zurückgegebene Zelle aufrufen base.GetCell(tv) und anpassen, müssen Sie auch die CellKey -Eigenschaft überschreiben, um einen Schlüssel zurückzugeben, der für Ihr Element eindeutig ist, wie folgt:

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

Dies funktioniert für die meisten Elemente, aber nicht für und StringElementStyledStringElement , da diese ihren eigenen Satz von Schlüsseln für verschiedene Renderingszenarien verwenden. Sie müssten den Code in diesen Klassen replizieren.

DialogViewControllers (DVCs)

Sowohl die Reflektions- als auch die Elements-API verwenden dieselbe DialogViewController. Manchmal möchten Sie das Erscheinungsbild der Ansicht anpassen oder einige Features des verwenden, die UITableViewController über die grundlegende Erstellung von Benutzeroberflächen hinausgehen.

Ist DialogViewController nur eine Unterklasse von, UITableViewController und Sie können sie auf die gleiche Weise anpassen, wie Sie eine UITableViewControlleranpassen würden.

Wenn Sie beispielsweise den Listenstil in oder GroupedPlainändern möchten, können Sie diesen Wert festlegen, indem Sie die -Eigenschaft ändern, wenn Sie den Controller erstellen, wie folgt:

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

Für erweiterte Anpassungen von , z. B. das Festlegen des DialogViewControllerHintergrunds, würden Sie es unterklassen und die richtigen Methoden überschreiben, wie im folgenden Beispiel gezeigt:

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;
    }
}

Ein weiterer Anpassungspunkt sind die folgenden virtuellen Methoden im DialogViewController:

public override Source CreateSizingSource (bool unevenRows)

Diese Methode sollte eine Unterklasse von DialogViewController.Source für Fälle zurückgeben, in denen Ihre Zellen gleichmäßig groß sind, oder eine Unterklasse von DialogViewController.SizingSource , wenn Ihre Zellen ungleichmäßig sind.

Sie können diese Außerkraftsetzung verwenden, um jede der UITableViewSource Methoden zu erfassen. TweetStation verwendet dies beispielsweise, um nachzuverfolgen, wann der Benutzer einen Bildlauf nach oben ausgeführt hat, und die Anzahl der ungelesenen Tweets entsprechend zu aktualisieren.

Überprüfen

Elemente bieten selbst keine Validierung, da die Modelle, die gut für Webseiten und Desktopanwendungen geeignet sind, nicht direkt dem iPhone-Interaktionsmodell zugeordnet werden.

Wenn Sie datenvalidieren möchten, sollten Sie dies tun, wenn der Benutzer eine Aktion mit den eingegebenen Daten auslöst. Beispielsweise eine Schaltfläche Fertig oder Weiter auf der oberen Symbolleiste oder eine StringElement Schaltfläche, die als Schaltfläche verwendet wird, um zur nächsten Phase zu wechseln.

Hier würden Sie eine grundlegende Eingabevalidierung und möglicherweise eine kompliziertere Überprüfung durchführen, z. B. die Überprüfung auf die Gültigkeit einer Benutzer-Kennwort-Kombination mit einem Server.

Wie Sie den Benutzer über einen Fehler benachrichtigen, ist anwendungsspezifisch. Sie können ein UIAlertView -Element öffnen oder einen Hinweis anzeigen.

Zusammenfassung

In diesem Artikel wurden viele Informationen zu MonoTouch.Dialog behandelt. Sie erörterte die Grundlagen der Wie-MT. D arbeitet und deckt die verschiedenen Komponenten ab, aus denen MT.D. besteht. Außerdem wurde die breite Palette von Elementen und Tabellenanpassungen gezeigt, die von MT unterstützt werden. D und erläuterte, wie MT. D kann mit benutzerdefinierten Elementen erweitert werden. Darüber hinaus wurde die JSON-Unterstützung in MT erläutert. D, das das dynamische Erstellen von Elementen aus JSON ermöglicht.