Share via


Xamarin.iOS için MonoTouch.Dialog'a Giriş

MonoTouch.Dialog, MT olarak adlandırılır. Kısaca D, geliştiricilerin görünüm denetleyicileri, tablolar vb. oluşturmanın bir parçası yerine bilgileri kullanarak uygulama ekranları ve gezinti oluşturmasına olanak tanıyan hızlı bir kullanıcı arabirimi geliştirme araç setidir. Bu nedenle, kullanıcı arabirimi geliştirme ve kod azaltma önemli bir basitleştirme sağlar. Örneğin, aşağıdaki ekran görüntüsünü göz önünde bulundurun:

For example, consider this screenshot

Bu ekranın tamamını tanımlamak için aşağıdaki kod kullanılmıştır:

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

iOS'ta tablolarla çalışırken genellikle bir ton tekrarlı kod vardır. Örneğin, her tablo gerektiğinde, bu tabloyu doldurmak için bir veri kaynağı gerekir. Bir gezinti denetleyicisi aracılığıyla bağlanan iki tablo tabanlı ekrana sahip bir uygulamada, her ekran aynı kodun çoğunu paylaşır.

MT. D, bu kodun tümünü tablo oluşturmak üzere genel bir API'de kapsülleyerek bunu basitleştirir. Daha sonra bu API'nin üzerinde, daha da kolaylaştıran bildirim temelli bir nesne bağlama söz dizimine olanak tanıyan bir soyutlama sağlar. Bu nedenle MT'de iki API vardır. D:

  • Alt düzey Öğeler API'si – Öğeler API'si, ekranları ve bileşenlerini temsil eden bir hiyerarşik öğe ağacı oluşturmayı temel alır. Öğeler API'si geliştiricilere YAPAY zeka oluşturma konusunda en fazla esnekliği ve denetimi sağlar. Ayrıca, Elements API'si JSON aracılığıyla bildirim temelli tanım için gelişmiş desteğe sahiptir ve bu sayede hem inanılmaz hızlı bildirim hem de bir sunucudan dinamik kullanıcı arabirimi oluşturma olanağı sağlanır.
  • Üst Düzey Düşünceler ion API'si – BağlamaAPI'si olarak da bilinir; bu API'de sınıflara kullanıcı arabirimi ipuçları ve ardından MT ile açıklama eklenir. D, nesneleri temel alan ekranları otomatik olarak oluşturur ve ekranda görüntülenen (ve isteğe bağlı olarak düzenlenen) ile temel alınan nesne yedeklemesi arasında bir bağlama sağlar. Yukarıdaki örnekte Düşünceler ion API'sinin kullanımı gösterilmiştir. Bu API, öğe API'sinin yaptığı ayrıntılı denetimi sağlamaz, ancak sınıf özniteliklerine göre öğe hiyerarşisini otomatik olarak oluşturarak karmaşıklığı daha da azaltır.

MT. D, ekran oluşturma için büyük bir yerleşik kullanıcı arabirimi öğeleri kümesiyle birlikte gelir, ancak özelleştirilmiş öğeler ve gelişmiş ekran düzenleri gereksinimini de tanır. Bu nedenle genişletilebilirlik, API'de pişirilen birinci sınıf bir özelliktir. Geliştiriciler mevcut öğeleri genişletebilir veya yeni öğeler oluşturabilir ve ardından sorunsuz bir şekilde tümleştirebilir.

Ayrıca MT. D'de "yenilemeye çekme" desteği, zaman uyumsuz görüntü yükleme ve arama desteği gibi yerleşik bir dizi yaygın iOS UX özelliği vardır.

Bu makale MT ile çalışmaya kapsamlı bir bakış sağlayacaktır. D, dahil:

  • MT. D Bileşenleri – Bu, MT'yi oluşturan sınıfları anlamaya odaklanır. Hızlı bir şekilde hız elde etmek için D.
  • Elements Reference : MT.D'nin yerleşik öğelerinin kapsamlı bir listesi.
  • Gelişmiş Kullanım – Bu, yenileme, arama, arka plan görüntüsü yükleme, LINQ kullanarak öğe hiyerarşileri oluşturma ve MT.D ile kullanılmak üzere özel öğeler, hücreler ve denetleyiciler oluşturma gibi gelişmiş özellikleri kapsar.

MT'nin ayarlanması. D

MT. D, Xamarin.iOS ile dağıtılır. Bunu kullanmak için Visual Studio 2017 veya Mac için Visual Studio bir Xamarin.iOS projesinin Başvurular düğümüne sağ tıklayın ve MonoTouch.Dialog-1 derlemesine başvuru ekleyin. Ardından, kaynak kodunuza gerektiği gibi deyimler ekleyin using MonoTouch.Dialog .

MT'nin Parçalarını Anlama. D

Düşünceler ion API'sini kullanırken bile MT. D, doğrudan Öğeler API'si aracılığıyla oluşturulmuş gibi arka planda bir Öğe hiyerarşisi oluşturur. Ayrıca, önceki bölümde bahsedilen JSON desteği de Öğeler oluşturur. Bu nedenle, MT.D'nin kurucu parçaları hakkında temel bilgilere sahip olmak önemlidir.

MT. D, aşağıdaki dört bölümü kullanarak ekranlar oluşturur:

  • DialogViewController
  • RootElement
  • Bölüm
  • Öğe

DialogViewController

DialogViewController veya kısaca DVC, öğesinden UITableViewController devralır ve bu nedenle tablo içeren bir ekranı temsil eder. DVC'ler, normal UITableViewController gibi bir gezinti denetleyicisine gönderilebilir.

RootElement

RootElement, DVC'ye giden öğeler için en üst düzey kapsayıcıdır. Daha sonra Öğeleri içerebilen Bölümler içerir. RootElement'ler işlenmez; bunun yerine yalnızca gerçekte işlenenler için kapsayıcılardır. RootElement bir DVC'ye atanır ve ardından DVC alt öğelerini işler.

Section

Bölüm, tablodaki bir hücre grubudur. Normal bir tablo bölümünde olduğu gibi, isteğe bağlı olarak, aşağıdaki ekran görüntüsünde olduğu gibi metin, hatta özel görünümler olabilecek bir üst bilgi ve alt bilgiye sahip olabilir:

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

Öğe

Öğe, tablodaki gerçek bir hücreyi temsil eder. MT. D, farklı veri türlerini veya farklı girişleri temsil eden çok çeşitli Öğelerle birlikte gelir. Örneğin, aşağıdaki ekran görüntüleri kullanılabilir öğelerden birkaçını gösterir:

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

Bölümler ve RootElements hakkında daha fazla bilgi

Şimdi RootElement'leri ve Bölümleri daha ayrıntılı olarak ele alalım.

RootElements

MonoTouch.Dialog işlemini başlatmak için en az bir RootElement gereklidir.

RootElement bir bölüm/öğe değeriyle başlatılırsa, bu değer, ekranın sağ tarafında işlenen yapılandırmanın özetini sağlayacak bir alt Öğeyi bulmak için kullanılır. Örneğin, aşağıdaki ekran görüntüsünde sol tarafta seçili çölün değeriyle birlikte sağ tarafta ayrıntı ekranının başlığını içeren bir hücre olan "Tatlı" adlı bir tablo gösterilmektedir.

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

Kök öğeler, yukarıda gösterildiği gibi yeni bir iç içe yapılandırma sayfasının yüklenmesini tetikmek için Bölümler'in içinde de kullanılabilir. Bu modda kullanıldığında, sağlanan başlık bir bölümün içinde işlenirken kullanılır ve alt sayfanın Başlığı olarak da kullanılır. Örneğin:

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

Yukarıdaki örnekte, kullanıcı "Tatlı" seçeneğine dokunduğunda MonoTouch.Dialog yeni bir sayfa oluşturur ve kök değeri "Tatlı" olan ve üç değer içeren bir radyo grubuna sahip olan sayfaya gider.

Bu örnekte, "2" değerini RadioGroup'a geçirdiğimiz için radyo grubu "Tatlı" bölümünde "Chocolate Cake" öğesini seçer. Bu, listedeki 3. öğeyi (sıfır dizin) seçme anlamına gelir.

Add yöntemini çağırmak veya C# 4 başlatıcı söz dizimini kullanmak bölümler ekler. Insert yöntemleri, animasyon içeren bölümler eklemek için sağlanır.

RootElement'i bir Grup örneğiyle (RadioGroup yerine) oluşturursanız, Bir Bölümde görüntülendiğinde RootElement'in özet değeri Group.Key değeriyle aynı anahtara sahip olan tüm BooleanElement'lerin ve CheckboxElement'lerin birikmeli sayısı olur.

Bölümler

Bölümler, ekrandaki öğeleri gruplandırmak için kullanılır ve RootElement'in tek geçerli doğrudan alt öğeleridir. Bölümler, yeni RootElement'ler de dahil olmak üzere standart öğelerden herhangi birini içerebilir.

Bir bölüme eklenmiş RootElement'ler, yeni bir daha derin düzeye gitmek için kullanılır.

Bölümlerin üst bilgileri ve alt bilgileri dize olarak veya UIViews olarak bulunabilir. Genellikle yalnızca dizeleri kullanırsınız, ancak özel URI'ler oluşturmak için üst bilgi veya alt bilgi olarak herhangi bir UIView kullanabilirsiniz. Bunları aşağıdaki gibi oluşturmak için bir dize kullanabilirsiniz:

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

Görünümleri kullanmak için görünümleri oluşturucuya geçirmeniz gerekir:

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

Bildirim Alınıyor

NSAction İşleme

MT. D, geri çağırmaları işlemek için bir NSAction temsilci olarak ortaya çıkar. Örneğin, MT.D tarafından oluşturulan bir tablo hücresi için dokunma olayını işlemek istediğinizi varsayalım. MT ile öğe oluştururken. D, aşağıda gösterildiği gibi bir geri çağırma işlevi sağlamanız yeterlidir:

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

Öğe Değeri Alınıyor

özelliğiyle birlikte Element.Value , geri çağırma diğer öğelerde ayarlanan değeri alabilir. Örneğin, aşağıdaki kodu göz önünde bulundurun:

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

Bu kod aşağıda gösterildiği gibi bir kullanıcı arabirimi oluşturur. Bu örneğin tam kılavuzu için Bkz . Öğeler API'si İzlenecek Yol öğreticisi.

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

Kullanıcı alt tablo hücresine bastığında anonim işlevdeki kod yürütülür ve örnekteki değeri element Mac için Visual Studio'deki Uygulama Çıktısı bölmesine yazar.

Yerleşik Öğeler

MT. D, Öğeler olarak bilinen bir dizi yerleşik tablo hücre öğesiyle birlikte gelir. Bu öğeler, tablo hücrelerinde dizeler, kayanlar, tarihler ve hatta görüntüler gibi çeşitli türleri görüntülemek için kullanılır ve yalnızca birkaçını adlandırır. Her öğe, veri türünü uygun şekilde görüntülemeyi üstlenir. Örneğin, boole öğesi değerini değiştirmek için bir anahtar görüntüler. Benzer şekilde, float öğesi float değerini değiştirmek için bir kaydırıcı görüntüler.

Görüntüler ve html gibi daha zengin veri türlerini desteklemek için daha da karmaşık öğeler vardır. Örneğin, seçildiğinde bir web sayfasını yüklemek için UIWebView'ı açan bir html öğesi, tablo hücresinde bir başlık görüntüler.

Öğe Değerleriyle Çalışma

Kullanıcı girişini yakalamak için kullanılan öğeler, herhangi bir zamanda öğenin geçerli değerini tutan bir ortak Value özelliği kullanıma sunar. Kullanıcı uygulamayı kullandığında otomatik olarak güncelleştirilir.

Bu, MonoTouch.Dialog'un parçası olan tüm Öğeler için davranıştır, ancak kullanıcı tarafından oluşturulan öğeler için gerekli değildir.

Dize Öğesi

Tablo StringElement hücresinin sol tarafında bir başlık ve hücrenin sağ tarafında dize değerini gösterir.

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

Düğme olarak kullanmak StringElement için bir temsilci sağlayın.

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

To use a StringElement as a button, provide a delegate

StilLi Dize Öğesi

A StyledStringElement , yerleşik tablo hücre stilleri kullanılarak veya özel biçimlendirmeyle dizelerin sunulmasını sağlar.

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

StyledStringElement sınıfı öğesinden StringElementtüretilir, ancak geliştiricilerin Yazı Tipi, metin rengi, arka plan hücre rengi, satır kesme modu, görüntülenecek satır sayısı ve bir aksesuarın görüntülenip görüntülenmeyeceği gibi birkaç özelliği özelleştirmesine olanak tanır.

Çok Satırlı Öğe

Multiline Element

Entry Öğesi

EntryElementadından da anlaşılacağı gibi, kullanıcı girişini almak için kullanılır. Karakterlerin gizlendiği normal dizeleri veya parolaları destekler.

The EntryElement is used to get user input

Üç değerle başlatılır:

  • Kullanıcıya gösterilecek girişin başlık.
  • Yer tutucu metin (kullanıcıya ipucu sağlayan gri renkteki metindir).
  • Metnin değeri.

Yer tutucu ve değer null olabilir. Ancak, başlık gereklidir.

Herhangi bir noktada Value özelliğine erişmek değerini EntryElementalabilir.

Ayrıca KeyboardType özellik oluşturma zamanında veri girişi için istenen klavye türü stiline ayarlanabilir. Bu, aşağıda listelenen değerleri UIKeyboardType kullanarak klavyeyi yapılandırmak için kullanılabilir:

  • Sayısal
  • Phone
  • Url
  • E-posta

Boole Öğesi

Boolean Element

Onay Kutusu Öğesi

Checkbox Element

Radyo Öğesi

ARadioElement, içinde RootElementbelirtilmesi için bir RadioGroup gerektirir.

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

A RadioElement requires a RadioGroup to be specified in the RootElement

RootElements radyo öğelerini koordine etmek için de kullanılır. Üyeler RadioElement birden çok Bölüme yayılabilir (örneğin, halka tonu seçicisine benzer bir şey uygulamak ve sistem zil seslerinden özel zil sesleri ayırmak için). Özet görünümünde o anda seçili olan radyo öğesi gösterilir. Bunu kullanmak için, aşağıdaki gibi grup oluşturucuyla öğesini oluşturun RootElement :

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

içindeki grubun RadioGroup adı, içeren sayfada (varsa) seçili değeri göstermek için kullanılır ve bu örnekte sıfır olan değer, seçilen ilk öğenin dizinidir.

Rozet Öğesi

Badge Element

Float Öğesi

Float Element

Etkinlik Öğesi

Activity Element

Date Öğesi

Date Element

DateElement öğesine karşılık gelen hücre seçildiğinde, aşağıda gösterildiği gibi bir tarih seçici gösterilir:

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

Time Öğesi

Time Element

TimeElement öğesine karşılık gelen hücre seçildiğinde, aşağıda gösterildiği gibi bir zaman seçici gösterilir:

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

DateTime Öğesi

DateTime Element

DateTimeElement öğesine karşılık gelen hücre seçildiğinde, aşağıda gösterildiği gibi bir tarih saat seçici gösterilir:

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

HTML Öğesi

HTML Element

, HTMLElement özelliğinin Caption değerini tablo hücresinde görüntüler. Seçili durumdayken Url , öğesine atanan öğe aşağıda gösterildiği gibi bir UIWebView denetime yüklenir:

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

İleti Öğesi

Message Element

Daha Fazla Öğe Yükle

Kullanıcıların listenizde daha fazla öğe yüklemesine izin vermek için bu öğeyi kullanın. Normal ve yükleme başlık, yazı tipi ve metin rengini özelleştirebilirsiniz. Gösterge UIActivity animasyonu başlatır ve kullanıcı hücreye dokunduğunda yükleme başlık görüntülenir ve ardından NSAction oluşturucuya geçirilen yürütülür. içindeki NSAction kodunuz tamamlandıktan sonra gösterge UIActivity animasyonu durdurur ve normal başlık yeniden görüntülenir.

UIView Öğesi

Ayrıca, herhangi bir özel UIView öğe kullanılarak UIViewElementgörüntülenebilir.

Sahip Tarafından Çizilmiş Öğe

Bu öğe soyut bir sınıf olduğundan alt sınıfa alınmalıdır. Öğesinin Height(RectangleF bounds)Draw(RectangleF bounds, CGContext context, UIView view) yüksekliğini döndürmeniz ve bağlam ve görünüm parametrelerini kullanarak tüm özelleştirilmiş çiziminizi verilen sınırlar içinde yapmanız gereken yöntemi geçersiz kılmanız gerekir. Bu öğe, alt UIViewsınıflamanın ağır bir şekilde kaldırılmasını ve döndürülecek hücreye yerleştirilmesini sağlar ve yalnızca iki basit geçersiz kılma gerçekleştirmeniz yeterli olur. Dosyadaki örnek uygulamada daha iyi bir örnek uygulama DemoOwnerDrawnElement.cs görebilirsiniz.

Aşağıda sınıfını uygulamaya yönelik çok basit bir örnek verilmişti:

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 Öğesi

JsonElement, iç içe alt öğesinin RootElement içeriğini yerel veya uzak url'den RootElement yükleyebilmek için öğesini genişleten bir alt sınıfıdır.

JsonElement, iki biçimde örneği oluşturulabilen bir RootElement örneğidir. Bir sürüm, içeriği isteğe bağlı olarak yükleyecek bir RootElement oluşturur. Bunlar, sonunda ek bir bağımsız değişken alan oluşturucular kullanılarak JsonElement oluşturulur ve içeriği yüklenecek URL:

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

Diğer form, verileri yerel bir dosyadan veya zaten ayrıştırdığınız mevcut System.Json.JsonObject bir dosyadan oluşturur:

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

MT ile JSON kullanma hakkında daha fazla bilgi için. D, bkz . JSON Öğesi İzlenecek Yol öğreticisi.

Diğer Özellikler

Çekme-Yenileme Desteği

Çekme-Yenileme, tweetie2 uygulamasında bulunan ve birçok uygulama arasında popüler bir efekt haline gelen görsel bir efekttir.

İletişim kutularınıza otomatik yenileme desteği eklemek için yalnızca iki şey yapmanız gerekir: kullanıcı verileri çektiğinde bildirim almak için bir olay işleyicisi bağlayın ve verilerin yüklendiği zamanı varsayılan durumuna geri dönmek için bilgilendirin DialogViewController .

Bir bildirim bağlamak basittir; şunun RefreshRequested gibi üzerindeki olayına DialogViewControllerbağlanın:

dvc.RefreshRequested += OnUserRequestedRefresh;

Ardından yönteminizde OnUserRequestedRefreshbazı veri yüklemelerini kuyruğa alır, ağdan veri isteyebilir veya verileri hesaplamak için bir iş parçacığı döndürebilirsiniz. Veriler yüklendikten sonra, yeni verilerin içinde olduğunu bildirmeniz DialogViewController ve görünümü varsayılan durumuna geri yüklemek için komutunu çağırarak ReloadCompletebunu yapmanız gerekir:

dvc.ReloadComplete ();

Arama Desteği

Aramayı desteklemek için özelliği üzerinde DialogViewControllerayarlayınEnableSearch. Ayrıca, arama çubuğunda filigran metni olarak kullanılacak özelliğini de ayarlayabilirsiniz SearchPlaceholder .

Arama, kullanıcı yazarken görünümün içeriğini değiştirir. Görünür alanları arar ve bunları kullanıcıya gösterir. , DialogViewController program aracılığıyla sonuçlarda yeni bir filtre işlemi başlatmak, sonlandırmak veya tetiklemek için üç yöntemi kullanıma sunar. Bu yöntemler aşağıda listelenmiştir:

  • StartSearch
  • FinishSearch
  • PerformFilter

Sistem genişletilebilir olduğundan, isterseniz bu davranışı değiştirebilirsiniz.

Arka Plan Görüntüsü Yükleme

MonoTouch.Dialog, TweetStation uygulamasının görüntü yükleyicisini içerir. Bu görüntü yükleyici arka planda görüntüleri yüklemek için kullanılabilir, önbelleğe almayı destekler ve görüntü yüklendiğinde kodunuzu bilgilendirebilir.

Ayrıca giden ağ bağlantılarının sayısını da sınırlandıracaktır.

Görüntü yükleyici sınıfına ImageLoader uygulanır, tek yapmanız gereken yöntemini çağırmaktır DefaultRequestImage . Yüklemek istediğiniz görüntü için Uri'yi ve görüntü yüklendiğinde çağrılacak arabirimin IImageUpdated bir örneğini sağlamanız gerekir.

Örneğin, aşağıdaki kod url'den içine bir BadgeElementgörüntü yükler:

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

ImageLoader sınıfı, şu anda bellekte önbelleğe alınmış olan tüm görüntüleri serbest bırakmak istediğinizde çağırabileceğiniz bir Temizleme yöntemini kullanıma sunar. Geçerli kodun 50 resim için önbelleği vardır. Farklı bir önbellek boyutu kullanmak istiyorsanız (örneğin, görüntülerin 50 görüntünün çok fazla olması için çok büyük olmasını bekliyorsanız), Yalnızca ImageLoader örnekleri oluşturabilir ve önbellekte tutmak istediğiniz görüntü sayısını geçirebilirsiniz.

Öğe Hiyerarşisi Oluşturmak için LINQ Kullanma

LINQ ve C#'nin başlatma söz diziminin akıllı kullanımı aracılığıyla LINQ, öğe hiyerarşisi oluşturmak için kullanılabilir. Örneğin, aşağıdaki kod bazı dize dizilerinden bir ekran oluşturur ve her StringElementbirine geçirilen anonim bir işlev aracılığıyla hücre seçimini işler:

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

Bu, neredeyse tamamen verilerden karmaşık uygulamalar oluşturmak için bir XML veri deposu veya veritabanındaki verilerle kolayca birleştirilebilir.

MT genişletiyor. D

Özel Öğeler Oluşturma

Var olan bir Öğeden devralarak veya kök sınıf Öğesinden türeterek kendi öğenizi oluşturabilirsiniz.

Kendi Öğenizi oluşturmak için aşağıdaki yöntemleri geçersiz kılmak istersiniz:

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

Öğenizin değişken boyutu varsa, tek bir yöntem içeren arabirimini uygulamanız IElementSizing gerekir:

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

Döndürülen hücreyi çağırarak base.GetCell(tv) ve özelleştirerek yönteminizi GetCell uygulamayı planlıyorsanız, öğesiniz için benzersiz olacak bir anahtar döndürmek için özelliğini de geçersiz kılmanız CellKey gerekir, örneğin:

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

Bu, ve için değil, birçok öğe için StringElementStyledStringElement çalışır, ancak bunlar çeşitli işleme senaryoları için kendi anahtar kümesini kullanır. Kodu bu sınıflarda çoğaltmanız gerekir.

DialogViewControllers (DVCs)

Hem Düşünceler ion hem de Öğeler API'si aynı DialogViewControllerkullanır. Bazen görünümün görünümünü özelleştirmek veya temel URI oluşturmanın ötesine geçmek için bazı özelliklerini UITableViewController kullanmak isteyebilirsiniz.

DialogViewController yalnızca öğesinin UITableViewController alt sınıfıdır ve bir öğesini özelleştirdiğiniz gibi özelleştirebilirsinizUITableViewController.

Örneğin, liste stilini veya Plainolarak Grouped değiştirmek istiyorsanız, denetleyiciyi oluştururken özelliğini değiştirerek bu değeri ayarlayabilirsiniz, örneğin:

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

öğesinin DialogViewControllerarka planını ayarlamak gibi daha gelişmiş özelleştirmeler için, aşağıdaki örnekte gösterildiği gibi alt sınıfa alır ve uygun yöntemleri geçersiz kılarsınız:

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

Başka bir özelleştirme noktası, içinde DialogViewControlleraşağıdaki sanal yöntemlerdir:

public override Source CreateSizingSource (bool unevenRows)

Bu yöntem, hücrelerinizin eşit boyutlandırıldığı durumlar için alt sınıfını DialogViewController.Source veya hücreleriniz eşit değilse alt sınıfını DialogViewController.SizingSource döndürmelidir.

Yöntemlerden herhangi birini yakalamak için bu geçersiz kılmayı UITableViewSource kullanabilirsiniz. Örneğin TweetStation, kullanıcının ne zaman en üste kaydığını izlemek ve okunmamış tweet sayısını buna göre güncelleştirmek için bunu kullanır.

Doğrulama

Web sayfaları ve masaüstü uygulamaları için uygun modeller doğrudan i Telefon etkileşim modeline eşlenmediğinden öğeler kendilerini doğrulama sağlamaz.

Veri doğrulama yapmak istiyorsanız, kullanıcı girilen verilerle bir eylem tetiklediğinde bunu yapmalısınız. Örneğin, üst araç çubuğundaki Bitti veya İleri düğmesi ya da bir sonraki aşamaya gitmek için düğme olarak kullanılanlarStringElement.

Burada temel giriş doğrulaması ve bir sunucuyla kullanıcı/parola bileşiminin geçerliliğini denetleme gibi daha karmaşık bir doğrulama gerçekleştirebilirsiniz.

Kullanıcıya bir hatayı nasıl bildirdiğiniz uygulamaya özgüdür. Bir ipucu açabilir UIAlertView veya ipucu gösterebilirsiniz.

Özet

Bu makalede MonoTouch.Dialog hakkında birçok bilgi ele alınmıştır. Bu makalede MT'nin temelleri ele alınmıştı. D, MT.D'yi oluşturan çeşitli bileşenleri çalışır ve kapsar. Ayrıca, MT tarafından desteklenen çok sayıda öğe ve tablo özelleştirmesi de gösterildi. D ve mt nasıl tartışıldı. D özel öğelerle genişletilebilir. Ayrıca MT'de JSON desteği açıklanmıştır. JSON'dan dinamik olarak öğe oluşturmaya olanak tanıyan D.