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

MT olarak adlandırılan MonoTouch.Dialog. Kısaca D, geliştiricilerin görünüm denetleyicileri, tablolar vb. oluşturmak yerine bilgileri kullanarak uygulama ekranları ve gezinti oluşturmalarına olanak sağlayan hızlı bir kullanıcı arabirimi geliştirme araç setidir. Bu nedenle, kullanıcı arabirimi geliştirme ve kod azaltma için önemli bir basitleştirme sağlar. Örneğin, aşağıdaki ekran görüntüsünü dikkate alın:

Örneğin, bu ekran görüntüsünü düşünün

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 çok fazla yeniden ad kod olur. Örneğin, bir tabloya her ihtiyaç duyulacak zaman, bu tabloyu doldurmak için bir veri kaynağı gerekir. Bir gezinti denetleyicisi aracılığıyla bağlanan iki tablo tabanlı ekran olan bir uygulamada, her ekran aynı kodun çok büyük bir aynısını kullanır.

MT. D, bu kodun hepsini tablo oluşturmak için genel bir API'de kapsülleerek bunu basitleştiriyor. Ardından bu API'nin üzerinde, daha da kolay hale getirir bildirime sahip bir nesne bağlama söz dizimi sağlayan 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 hiyerarşik bir öğe ağacı oluşturmaya dayalıdır. Öğeler API'si, geliştiricilere KULLANıCı oluşturma konusunda en fazla esneklik ve denetim sunar. Buna ek olarak, Öğeler API'si, hem inanılmaz hızlı bildirim hem de bir sunucudan dinamik kullanıcı arabirimi oluşturma özelliğine olanak sağlayan JSON aracılığıyla bildirimli tanım için gelişmiş destek içerir.
  • Üst Düzey Yansıma API'si– BağlamaAPI'si olarak da bilinir; burada sınıflar ui ipuçları ve ardından MT ile açıklama ek açıklamalı olarak gelir. D, nesneleri temel alan ekranlar oluşturur ve ekranda görüntülenen (ve isteğe bağlı olarak düzenlenen) ile temel alınan nesne backing arasında bir bağlama sağlar. Yukarıdaki örnekte Yansıma API'si kullanımı gösterildi. Bu API, öğeler API'sinin yaptığı ayrıntılı denetimi sağlamaz, ancak sınıf özniteliklerine göre öğe hiyerarşisini otomatik olarak oluşturmayla karmaşıklığı daha da azaltır.

MT. D, ekran oluşturma için çok sayıda yerleşik kullanıcı arabirimi öğeleriyle birlikte gelir, ancak özelleştirilmiş öğelere ve gelişmiş ekran düzenlerine olan ihtiyacı da tanır. Bu nedenle genişletilebilirlik, API'de yer alan birinci sınıf bir öne çıkandır. Geliştiriciler mevcut öğeleri genişlet veya yenilerini oluşturabilir ve ardından sorunsuz bir şekilde tümleştirin.

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

Bu makalede MT ile çalışmaya kapsamlı bir bakış yer alır. D, dahil:

  • MT. D Bileşenleri – Bu, MT'yi temel alan sınıfları anlamaya odaklanır. Hızlı bir şekilde çalışmayı etkinleştirmek için D.
  • Öğeler Başvurusu – MT.D.'nin yerleşik öğelerinin kapsamlı listesi.
  • Gelişmiş Kullanım– Bu, yenilenecek çekme, arama, arka plan görüntüsü yükleme, öğe hiyerarşileri oluşturmak için LINQ kullanma ve MT.D ile kullanmak üzere özel öğeler, hücreler ve denetleyiciler oluşturma gibi gelişmiş özellikleri kapsar.

MT'yi ayarlama. D

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

MT Parçalarını Anlama. D

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

MT. D, aşağıdaki dört parçayı kullanarak ekranlar derleme:

  • DialogViewController
  • RootElement
  • Section
  • Öğe

DialogViewController

DialogViewControllerveya kısaca DVC, tablosundan devralınan bir ekranı temsil eder. DVC'ler aynı normal UITableViewController'lar gibi bir gezinti denetleyicisine itilir.

RootElement

RootElement, DVC'ye yönelik öğeler için en üst düzey kapsayıcıdır. Daha sonra Öğeler içeren Bölümler içerir. RootElements işlenmez; bunun yerine bunlar yalnızca gerçekten işlenen kapsayıcılardır. Bir DVC'ye RootElement 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, aşağıdaki ekran görüntüsünde olduğu gibi isteğe bağlı olarak metin, hatta özel görünümler gibi bir üst bilgi ve alt bilgi olabilir:

Normal bir tablo bölümünde olduğu gibi, bu ekran görüntüsünde olduğu gibi isteğe bağlı olarak metin, hatta özel görünümler gibi bir üst bilgi ve alt bilgi olabilir

Öğ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çı göstermektedir:

Örneğin, bu ekran görüntüleri kullanılabilir öğelerden birkaçı göstermektedir

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

Şimdi RootElements ve Sections öğelerini daha ayrıntılı bir şekilde ele aalı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 Öğe bulmak için kullanılır. Örneğin, aşağıdaki ekran görüntüsünde sol tarafta, sağ tarafta ayrıntı ekranı başlığını içeren bir hücrenin bulunduğu bir tablo ve seçili şarapların değeriyle birlikte "Pasta" gösterilir.

Bu ekran görüntüsüsol tarafta, Sağ tarafta Yer alan Ayrıntı ekranı başlığını ve seçili meyvenin değerini içeren bir tabloyu gösterir. Aşağıdaki ekran görüntüsünde, sol tarafta, sağ tarafta Yer alan Ayrıntı ekranı başlığını içeren bir hücrenin yanı sıra seçilinin değeriyle birlikte Pasta'nın bulunduğu bir tablo gösterilir

Kök öğeler, yukarıda gösterildiği gibi yeni bir iç içe geçmiş yapılandırma sayfasının yüklenmesini tetiklemek için Bölümler içinde de kullanılabilir. Bu modda kullanılırken, sağlanan açıklamalı alt yazı bir bölüm içinde işlenirken kullanılır ve alt sayfa için Başlık olarak da kullanılır. Örnek:

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ı "Pasta" öğesine dokunularak MonoTouch.Dialog yeni bir sayfa oluşturacak ve kök "Pasta" ve üç değere sahip bir radyo grubu olacak şekilde bu sayfaya gidecek.

Radyo grubu, "2" değerini RadioGroup'a aktarmız nedeniyle bu örnekte "Pasta" bölümünde "Chocolate Chocolate" öğesini seçecek. Bu, listede 3. öğenin (sıfır dizin) seç olduğu anlamına gelir.

Add yöntemini çağırma veya C# 4 başlatıcı söz dizimi kullanarak bölümler ekler. Ekleme yöntemleri, animasyonla bölümler eklemek için sağlanır.

RootElement'i bir Grup örneğiyle (RadioGroup yerine) oluşturmanız, Bir Bölümde görüntülendiğinde RootElement'in özet değeri, Group.Key değeriyle aynı anahtara sahip tüm BooleElements ve CheckboxElements'in toplam sayısı olacaktır.

Bölümler

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

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

Bölümler dize olarak veya UIViews olarak üst bilgiler ve alt bilgiler içerir. Genellikle yalnızca dizeleri kullanır, ancak özel UI'ler oluşturmak için üst bilgi veya alt bilgi olarak herhangi bir UIView kullanabilirsiniz. Bunları oluşturmak için aşağıdaki gibi bir dize kullanabilirsiniz:

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

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

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

Bildirilecek

NSAction'ın işlenmesi

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

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

Öğe Değerini Alma

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

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 eksiksiz bir izlenecek yolu için Bkz. Öğeler API'si Adım Adım Kılavuz öğreticisi.

Element.Value özelliğiyle birlikte, geri çağırma diğer öğelerde ayarlanmış değeri alabilir

Kullanıcı alttaki tablo hücresine bassa, anonim işlevde kod yürütülür ve örnekteki değeri element Mac için Visual Studio. element

Built-In Öğeleri

MT. D, Öğeler olarak bilinen bir dizi yerleşik tablo hücresi ile birlikte gelir. Bu öğeler dizeler, float'lar, tarihler ve hatta görüntüler gibi tablo hücrelerinde birkaç farklı tür görüntülemek için kullanılır. Her öğe, veri türünü uygun şekilde görüntülemeyi sağlar. Örneğin, boole öğesi değerini değiştirmek için bir anahtar görüntüler. Benzer şekilde, bir float öğesi kayan değeri 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 desteklemeye yönelik daha karmaşık öğeler de vardır. Örneğin, bir Web sayfası seçildiğinde bir UIWebView açan bir HTML öğesi, tablo hücresinde bir resim yazısı görüntüler.

Öğe değerleriyle çalışma

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

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

String öğesi

Bir StringElement tablo hücresinin sol tarafındaki bir başlığı ve hücrenin sağ tarafındaki dize değerini gösterir.

Bir StringElement, bir tablo hücresinin sol tarafındaki bir başlık ve hücrenin sağ tarafındaki dize değeri gösterir

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

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

Bir StringElement 'i düğme olarak kullanmak için, bir temsilci sağlayın

Stilli dize öğesi

StyledStringElement, Dizelerin yerleşik tablo hücresi stilleri veya özel biçimlendirme kullanılarak sunulmasını sağlar.

Bir Stilledstrıngelement, dizelerin yerleşik tablo hücresi stilleri veya özel biçimlendirme kullanılarak sunulmasını sağlar

StyledStringElementSınıfı öğesinden türetilir StringElement , ancak geliştiricilerin yazı tipi, metin rengi, arka plan hücresi rengi, satır sonu modu, görüntülenecek satır sayısı ve bir aksesuar görüntülenip görüntülenmemelidir gibi birçok özelliği özelleştirmesini sağlar.

Multiline öğesi

Multiline öğesi

Entry öğesi

EntryElementAdının gösterdiği gibi, Kullanıcı girişi almak için kullanılır. Karakterlerin gizli olduğu normal dizeleri veya parolaları destekler.

EntryElement Kullanıcı girişi almak için kullanılır

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

  • Kullanıcıya gösterilecek girdinin başlık yazısı.
  • Yer tutucu metin (Bu, kullanıcıya bir ipucu sağlayan, gri metin olan metindir).
  • Metnin değeri.

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

Herhangi bir noktada, Value özelliğine erişmek öğesinin değerini alabilir EntryElement .

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

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

Boolean öğesi

Boolean öğesi

CheckBox öğesi

CheckBox öğesi

Radio öğesi

RadioElementRadioGroup , İçinde bir için belirtilmesini gerektirir RootElement .

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

Bir RadioElement, RootElement içinde bir RadioGroup belirtilmesini gerektirir

RootElements radyo öğelerini koordine etmek için de kullanılır. RadioElementÜyeler birden çok bölüme yayılabilir (örneğin, halka ton seçicisine benzer bir şeyi uygulamak ve sistem zil seslerine özel halka tonlarını ayırmak için). Özet görünümü şu anda seçili olan radyo öğesini gösterir. Bunu kullanmak için aşağıdaki RootElement gibi grup Oluşturucusu ile oluşturun:

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

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

Rozet öğesi

Rozet öğesi

Float öğesi

Float öğesi

Activity öğesi

Activity öğesi

Date öğesi

Date öğesi

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

DateElement öğesine karşılık gelen hücre seçildiğinde, gösterilen şekilde bir tarih seçici sunulur

Time öğesi

Time öğesi

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

TimeElement öğesine karşılık gelen hücre seçildiğinde, gösterilen şekilde bir saat seçici sunulur

DateTime öğesi

DateTime öğesi

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

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

HTML öğesi

HTML öğesi

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

Seçili olarak, öğeye atanan URL aşağıda gösterildiği gibi bir UIWebView denetimine yüklenir

İleti öğesi

İleti öğesi

Daha fazla öğe yükle

Kullanıcıların listenize daha fazla öğe yüklemesine izin vermek için bu öğeyi kullanın. Normal ve yükleme açıklamalı altyazıları ve yazı tipi ve metin rengini özelleştirebilirsiniz. UIActivityGösterge animasyon başlar ve Kullanıcı hücreye dokunduğunda yükleme başlığı görüntülenir ve sonra NSAction oluşturucuya geçirilen Oluşturucu yürütülür. İçindeki kodunuz NSAction tamamlandığında, UIActivity gösterge animasyonu durdurup normal başlık yeniden görüntülenir.

UIView öğesi

Ayrıca, kullanılarak herhangi bir özel de UIView görüntülenebilir UIViewElement .

Owner-Drawn öğesi

Bu öğe, soyut bir sınıf olduğundan alt sınıflanmış olmalıdır. Height(RectangleF bounds)Öğesinin yüksekliğini döndürmelisiniz ve Draw(RectangleF bounds, CGContext context, UIView view) 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, altsınıflama a 'nın ağır bir şekilde uygulanmasını UIView ve döndürülecek hücreye yerleştirmekten yalnızca iki basit geçersiz kılma uygulamanız gerektiğini bırakır. Dosyadaki örnek uygulamada daha iyi bir örnek uygulama görebilirsiniz DemoOwnerDrawnElement.cs .

Sınıfı uygulamanın çok basit bir örneği aşağıda verilmiştir:

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

, JsonElementRootElement Bir RootElement yerel veya uzak URL 'den iç içe alt öğenin içeriğini yükleyebilmeleri için bir alt sınıfıdır.

, JsonElementRootElement İki biçimde örnek oluşturulabilir. Bir sürüm RootElement , içeriği isteğe bağlı olarak yükleyecek bir oluşturur. Bunlar, JsonElement sonunda fazladan bir bağımsız değişken alan oluşturucular kullanılarak oluşturulur, içeriğin yükleneceği URL:

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

Diğer form, verileri yerel bir dosyadan veya System.Json.JsonObject zaten ayrıştırmış olduğunuz mevcut 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);

Lt ile JSON kullanma hakkında daha fazla bilgi için. D, bkz. JSON öğesi Izlenecek yol öğreticisi.

Diğer özellikler

Yenileme için çekme desteği

Yenilemeye alma, ilk olarak Tweetie2 uygulamasında bulunan ve birçok uygulama arasında popüler bir etkiye sahip olan görsel bir etkiye sahiptir.

İletişim kutularınız için otomatik yenileme desteği eklemek istiyorsanız, yalnızca iki şey yapmanız gerekir: Kullanıcı verileri çeker ve DialogViewController verilerin yüklendiği zaman, varsayılan durumuna geri dönmek için bir olay işleyicisini bilgilendirir.

Bir bildirimin takılarak basit olması; üzerinde olaya yalnızca aşağıdaki RefreshRequestedDialogViewController gibi bağlanın:

dvc.RefreshRequested += OnUserRequestedRefresh;

Daha sonra yönteminizin içinde OnUserRequestedRefresh , bazı veri yüklemeyi sıraya alır, net 'ten bazı verileri ister veya bir iş parçacığını alarak verileri hesaplamalısınız. Veriler yüklendikten sonra, DialogViewController yeni verilerin içinde olduğunu bilgilendirmeli ve görünümü varsayılan durumuna geri yüklemek için şunu çağırarak yapmanız gerekir ReloadComplete :

dvc.ReloadComplete ();

Destek ara

Aramayı desteklemek için, özelliğini ' EnableSearch de ayarlayın DialogViewController . Ayrıca SearchPlaceholder özelliği, arama çubuğunda filigran metni olarak kullanılacak şekilde ayarlayabilirsiniz.

Arama, görünümün içeriğini Kullanıcı türleri olarak değiştirecek. Görünür alanları arar ve kullanıcıya olanları gösterir. , DialogViewController Sonuçlar üzerinde yeni bir filtre işlemini programlı bir şekilde başlatmak, sonlandırmak veya tetiklemek için üç yöntem sunar. Bu yöntemler aşağıda listelenmiştir:

  • StartSearch
  • FinishSearch
  • PerformFilter

Sistem Genişletilebilir, bu sayede isterseniz bu davranışı değiştirebilirsiniz.

Arka plan görüntüsünü yükleme

MonoTouch. Dialog, çok sayıda Etstation uygulamasının görüntü yükleyicisini içerir. Bu görüntü yükleyicisi arka planda görüntü yüklemek için kullanılabilir, önbelleğe almayı destekler ve görüntü yüklendiğinde kodunuza bildirimde bulunabilir.

Ayrıca giden ağ bağlantısı sayısını da sınırlayacaktır.

Görüntü yükleyici, ImageLoader sınıfında uygulanır, tüm yapmanız gereken DefaultRequestImage yöntemi çağırır, yüklemek Istediğiniz görüntünün URI 'sini sağlamanız gerekir ve IImageUpdated Bu, görüntü yüklendiğinde çağrılacak olan bir arabirimin örneğini belirtmeniz gerekecektir.

Örneğin, aşağıdaki kod bir URL 'den bir görüntü yükler 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")
    }
};

ImageLoader sınıfı, bellekte önbelleğe alınmış olan tüm görüntüleri serbest bırakmak istediğinizde çağırabilmeniz için bir temizleme yöntemi sunar. Geçerli kodun 50 resimleri için bir önbelleği vardır. Farklı bir önbellek boyutu kullanmak istiyorsanız (örneğin, görüntülerin çok büyük olduğu 50 görüntünün ç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# başlatma sözdiziminin zekice kullanımı ile, LINQ bir öğe hiyerarşisi oluşturmak için kullanılabilir. Örneğin, aşağıdaki kod bazı dize dizilerinden bir ekran oluşturur ve her birine geçirilen anonim bir işlev aracılığıyla hücre seçimini işler 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"); })
    }
};

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

MT 'yi genişletme TID

Özel öğeler oluşturma

Varolan bir öğeden devralarak ya da kök sınıf öğesinden türeterek kendi öğesini oluşturabilirsiniz.

Kendi öğesini oluşturmak için aşağıdaki yöntemleri geçersiz kılmak isteyeceksiniz:

// 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 bir değişken boyutu varsa, IElementSizing bir yöntemi içeren arabirimini uygulamanız gerekir:

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

GetCellDöndürülen hücreyi çağırarak ve özelleştirerek yönteminizin uygulanması planlanıyorsanız base.GetCell(tv) , aşağıdaki CellKey gibi, öğe için benzersiz olacak bir anahtar döndürecek şekilde özelliği de geçersiz kılmanız gerekir:

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

Bu, çoğu öğe için geçerlidir, ancak, StringElementStyledStringElement çeşitli işleme senaryoları için kendi anahtar kümesini kullanır. Bu sınıflarda kodu çoğaltmanız gerekir.

DialogViewControllers (DVCs)

Hem yansıma hem de öğeler API 'SI aynı şekilde kullanılır DialogViewController . Bazen görünümün görünümünü özelleştirmek veya UITableViewController temel uıof oluşturma ötesinde daha fazla olan bazı özelliklerini kullanmak isteyebilirsiniz.

DialogViewControllerYalnızca öğesinin bir alt sınıfıdır UITableViewController ve bunu özelleştirmek için aynı şekilde özelleştirebilirsiniz UITableViewController .

Örneğin, liste stilini veya ya da olarak değiştirmek isterseniz GroupedPlain , denetleyiciyi oluştururken bu değeri aşağıdaki gibi ayarlayabilirsiniz:

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

Arka planını ayarlama gibi daha gelişmiş özelleştirmeler için, DialogViewController Aşağıdaki örnekte gösterildiği gibi, alt sınıfı ve uygun yöntemleri geçersiz kılabilirsiniz.

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çindeki aşağıdaki sanal yöntemlerdir DialogViewController :

public override Source CreateSizingSource (bool unevenRows)

Bu yöntem DialogViewController.Source , hücrelerden oluşan eşit boyutta olduğu durumlarda veya hücrelerden biri eşit değilse bir alt sınıfı döndürmelidir DialogViewController.SizingSource .

Bu geçersiz kılmayı, yöntemlerden herhangi birini yakalamak için kullanabilirsiniz UITableViewSource . Örneğin, bu , kullanıcının en üst kısımdaki zamanı izlemek için bunu kullanır ve okunmamış Evcil hayvan sayısını uygun olarak güncelleştirir.

Doğrulama

web sayfaları ve masaüstü uygulamaları için uygun olan modeller doğrudan iPhone etkileşim modeliyle eşlenmediğinden, öğeler doğrulama sağlamaz.

Veri doğrulaması yapmak istiyorsanız, Kullanıcı girilen verilerle bir eylem harekete geçirdiğinde bunu yapmalısınız. Örneğin, üst araç çubuğunda bir bitti veya İleri düğmesi veya bir sonraki aşamaya gitmek için bir düğme olarak kullanılan bir düğme.

Bu, temel giriş doğrulamasını gerçekleştirdiğiniz ve sunucu ile bir kullanıcı/parola birleşiminin geçerliliğini denetlemek gibi daha karmaşık bir doğrulama gerçekleştirmediğiniz yerdir.

Bir hata kullanıcısına uygulamaya özgü bir sorun bildirme. Bir ipucu açılır veya bir UIAlertView İpucu gösterebilirsiniz.

Özet

Bu makale MonoTouch. Dialog hakkında çok fazla bilgi kapsamına alınmıştır. Bu, nasıl MT 'nin temellerini ele alınmaktadır. D işe yarar ve bu, MT. D oluşturan çeşitli bileşenleri kapsar. Ayrıca, MT tarafından desteklenen geniş kapsamlı öğe ve tablo özelleştirmeleri dizisini de gösterdi. D ve nasıl MT ile ele alınmaktadır? D, özel öğelerle genişletilebilir. Ayrıca, MT 'deki JSON desteğini de açıklandı. Bu, JSON 'dan dinamik olarak öğe oluşturulmasına izin veren D.