Aracılığıyla paylaş


Xamarin.iOS'ta Verilerle Tablo Doldurma

'a UITableView satır eklemek için bir UITableViewSource alt sınıf uygulamanız ve tablo görünümünün kendisini doldurmak için çağırdığını yöntemleri geçersiz kılmanız gerekir.

Bu kılavuz aşağıdakileri kapsar:

  • UITableViewSource'un alt sınıfını oluşturma
  • Hücre Yeniden Kullanımı
  • Dizin Ekleme
  • Üst Bilgi ve Alt Bilgi Ekleme

UITableViewSource Alt Sınıfı oluşturma

UITableViewSource Her UITableViewöğesine bir alt sınıf atanır. Tablo görünümü, kendisini nasıl işleneceğini (örneğin, kaç satırın gerekli olduğunu ve varsayılandan farklıysa her satırın yüksekliğini) belirlemek için kaynak sınıfı sorgular. En önemlisi, kaynak verilerle doldurulmuş her hücre görünümünü sağlar.

Tablo görüntüleme verilerini oluşturmak için yalnızca iki zorunlu yöntem gerekir:

  • RowsInSection : tablonun görüntülemesi gereken toplam veri satırı sayısını döndürür nint .
  • GetCell – yöntemine geçirilen ilgili satır dizini için verilerle doldurulmuş bir UITableViewCell döndürür.

BasicTable örnek dosyası TableSource.cs en basit olası uygulamasına UITableViewSourcesahiptir. Aşağıdaki kod parçacığında tabloda görüntülenecek dize dizisini kabul ettiğini ve her dizeyi içeren varsayılan hücre stilini döndürdüğünü görebilirsiniz:

public class TableSource : UITableViewSource {

        string[] TableItems;
        string CellIdentifier = "TableCell";

        public TableSource (string[] items)
        {
            TableItems = items;
        }

        public override nint RowsInSection (UITableView tableview, nint section)
        {
            return TableItems.Length;
        }

        public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
        {
            UITableViewCell cell = tableView.DequeueReusableCell (CellIdentifier);
            string item = TableItems[indexPath.Row];

            //if there are no cells to reuse, create a new one
            if (cell == null)
            {
                cell = new UITableViewCell (UITableViewCellStyle.Default, CellIdentifier);
            }

            cell.TextLabel.Text = item;

            return cell;
        }
}

A UITableViewSource , basit bir dize dizisinden (bu örnekte gösterildiği gibi) Bir Liste <> veya başka bir koleksiyona kadar herhangi bir veri yapısını kullanabilir. Yöntemlerin UITableViewSource uygulanması, tabloyu temel alınan veri yapısından yalıtır.

Bu alt sınıfı kullanmak için, kaynağı oluşturmak üzere bir dize dizisi oluşturun ve bir örneğine atayın UITableView:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    table = new UITableView(View.Bounds); // defaults to Plain style
    string[] tableItems = new string[] {"Vegetables","Fruits","Flower Buds","Legumes","Bulbs","Tubers"};
    table.Source = new TableSource(tableItems);
    Add (table);
}

Sonuçta elde edilen tablo şöyle görünür:

Çalışan örnek tablo

Tabloların çoğu kullanıcının bir satıra dokunarak bunu seçmesine ve başka bir eylem gerçekleştirmesine (şarkı çalma, kişiyi çağırma veya başka bir ekran gösterme gibi) olanak tanır. Bunu başarmak için yapmamız gereken birkaç şey vardır. İlk olarak, kullanıcı yönteme aşağıdakileri ekleyerek bir satıra tıkladığında ileti görüntülemek için RowSelected bir AlertController oluşturalım:

public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
    UIAlertController okAlertController = UIAlertController.Create ("Row Selected", tableItems[indexPath.Row], UIAlertControllerStyle.Alert);
    okAlertController.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
    ...

    tableView.DeselectRow (indexPath, true);
}

Ardından Görünüm Denetleyicimizin bir örneğini oluşturun:

HomeScreen owner;

UiTableViewSource sınıfınıza bir görünüm denetleyicisini parametre olarak alan ve bir alana kaydeden bir oluşturucu ekleyin:

public TableSource (string[] items, HomeScreen owner)
{
    ...
    this.owner = owner;

}

Başvuruyu geçirmek this için UITableViewSource sınıfının oluşturulduğu ViewDidLoad yöntemini değiştirin:

table.Source = new TableSource(tableItems, this);

Son olarak, yönteminize RowSelected dönün ve önbelleğe alınmış alanı arayın PresentViewController :

public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
    ...
    owner.PresentViewController (okAlertController, true, null);

    ...
}

Artık kullanıcı bir satıra dokunabilir ve bir uyarı görüntülenir:

Seçilen satır uyarısı

Hücre Yeniden Kullanımı

Bu örnekte yalnızca altı öğe vardır, bu nedenle hücrenin yeniden kullanılması gerekmez. Bununla birlikte, yüzlerce veya binlerce satır görüntülerken, aynı anda ekrana yalnızca birkaç tane sığdığında yüzlerce veya binlerce UITableViewCell nesne oluşturmak bellek kaybı olur.

Bu durumu önlemek için, bir hücre ekrandan kaybolduğunda görünümü yeniden kullanılmak üzere bir kuyruğa yerleştirilir. Kullanıcı kaydırılırken, tablo yeni görünümlerin görüntülenmesini istemek için çağırır GetCell ; mevcut bir hücreyi (şu anda görüntülenmemektedir) yeniden kullanmak için yalnızca yöntemini çağırır DequeueReusableCell . Hücre yeniden kullanılabilir durumdaysa döndürülür, aksi takdirde null döndürülür ve kodunuz yeni bir hücre örneği oluşturmalıdır.

Örnekteki bu kod parçacığı deseni gösterir:

// request a recycled cell to save memory
UITableViewCell cell = tableView.DequeueReusableCell (cellIdentifier);
// if there are no cells to reuse, create a new one
if (cell == null)
    cell = new UITableViewCell (UITableViewCellStyle.Default, cellIdentifier);

, cellIdentifier farklı hücre türleri için etkili bir şekilde ayrı kuyruklar oluşturur. Bu örnekte tüm hücreler aynı göründüğünden yalnızca bir sabit kodlanmış tanımlayıcı kullanılır. Farklı hücre türleri varsa, her birinin farklı bir tanımlayıcı dizesi olması gerekir. Bunların hem örneği oluşturulurken hem de yeniden kullanım kuyruğundan istendiğinde.

iOS 6+'da Hücre Yeniden Kullanımı

iOS 6, Koleksiyon Görünümleri ile girişe benzer bir hücre yeniden kullanım düzeni ekledi. Yukarıda gösterilen mevcut yeniden kullanım deseni geriye dönük uyumluluk için hala destekleniyor olsa da, hücrede null denetimi gereksinimini ortadan kaldıran bu yeni desen tercih edilir.

Yeni desenle bir uygulama, ya da RegisterClassForCellReuse denetleyicinin oluşturucusunda çağrılarak kullanılacak hücre sınıfını veya RegisterNibForCellReuse xib'yi kaydeder. Ardından, yöntemindeki GetCell hücreyi sıralarken, hücre sınıfı veya xib ve dizin yolu için kaydettiğiniz tanımlayıcıyı geçirmeyi çağırmanız DequeueReusableCell yeterlidir.

Örneğin, aşağıdaki kod UITableViewController'da özel bir hücre sınıfı kaydeder:

public class MyTableViewController : UITableViewController
{
  static NSString MyCellId = new NSString ("MyCellId");

  public MyTableViewController ()
  {
    TableView.RegisterClassForCellReuse (typeof(MyCell), MyCellId);
  }
  ...
}

MyCell sınıfı kaydedildiğinde, aşağıda gösterildiği gibi hücre, ek null denetimine gerek kalmadan yönteminde GetCellUITableViewSource sıralanabilir:

class MyTableSource : UITableViewSource
{
  public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
  {
    // if cell is not available in reuse pool, iOS will create one automatically
    // no need to do null check and create cell manually
    var cell = (MyCell) tableView.DequeueReusableCell (MyCellId, indexPath);

    // do whatever you need to with cell, such as assigning properties, etc.

    return cell;
  }
}

Yeni yeniden kullanım desenini özel bir hücre sınıfıyla kullanırken, aşağıdaki kod parçacığında gösterildiği gibi bir IntPtralan oluşturucuyu uygulamanız gerektiğini unutmayın; aksi takdirde Objective-C hücre sınıfının bir örneğini oluşturamaz:

public class MyCell : UITableViewCell
{
  public MyCell (IntPtr p):base(p)
  {
  }
  ...
}

Bu makaleye bağlı BasicTable örneğinde yukarıda açıklanan konuların örneklerini görebilirsiniz.

Dizin Ekleme

Dizin, kullanıcının uzun listeler arasında gezinmesine yardımcı olur, ancak istediğiniz ölçüte göre dizin oluşturabilirsiniz. BasicTableIndex örneği, dizini göstermek için dosyadan çok daha uzun bir öğe listesi yükler. Dizindeki her öğe tablonun 'bölümüne' karşılık gelir.

Dizin ekranı

'Bölümleri' desteklemek için tablonun arkasındaki verilerin gruplanması gerekir, bu nedenle BasicTableIndex örneği, her öğenin ilk harfini sözlük anahtarı olarak kullanarak dize dizisinden bir Dictionary<> oluşturur:

indexedTableItems = new Dictionary<string, List<string>>();
foreach (var t in items) {
    if (indexedTableItems.ContainsKey (t[0].ToString ())) {
        indexedTableItems[t[0].ToString ()].Add(t);
    } else {
        indexedTableItems.Add (t[0].ToString (), new List<string>() {t});
    }
}
keys = indexedTableItems.Keys.ToArray ();

Alt sınıfın UITableViewSource daha sonra öğesini kullanmak Dictionary<> için aşağıdaki yöntemlerin eklenmesi veya değiştirilmesi gerekir:

  • NumberOfSections – Bu yöntem isteğe bağlıdır ve varsayılan olarak tabloda bir bölüm varsayılır. Bir dizin görüntülenirken bu yöntem dizindeki öğelerin sayısını döndürmelidir (örneğin, dizin İngilizce alfabesinin tüm harflerini içeriyorsa 26).
  • RowsInSection – belirli bir bölümdeki satır sayısını döndürür.
  • SectionIndexTitles – dizini görüntülemek için kullanılacak dize dizisini döndürür. Örnek kod bir harf dizisi döndürür.

BasicTableIndex/TableSource.cs örnek dosyasındaki güncelleştirilmiş yöntemler şöyle görünür:

public override nint NumberOfSections (UITableView tableView)
{
    return keys.Length;
}
public override nint RowsInSection (UITableView tableview, nint section)
{
    return indexedTableItems[keys[section]].Count;
}
public override string[] SectionIndexTitles (UITableView tableView)
{
    return keys;
}

Dizinler genellikle yalnızca Düz tablo stiliyle kullanılır.

Üst Bilgi ve Alt Bilgi Ekleme

Üst bilgiler ve alt bilgiler, tablodaki satırları görsel olarak gruplandırmak için kullanılabilir. Gereken veri yapısı, dizin eklemeye çok benzer. Dictionary<> Bu, gerçekten iyi sonuç vermektedir. Bu örnek, hücreleri gruplandırmak için alfabeyi kullanmak yerine sebzeleri botanik türüne göre gruplandıracaktır. Çıkış şuna benzer:

Örnek Üst Bilgiler ve Alt Bilgiler

Üst bilgileri ve alt bilgileri UITableViewSource görüntülemek için alt sınıf şu ek yöntemleri gerektirir:

  • TitleForHeader – üst bilgi olarak kullanılacak metni döndürür
  • TitleForFooter – alt bilgi olarak kullanılacak metni döndürür.

BasicTableHeaderFooter/Code/TableSource.cs örnek dosyasındaki güncelleştirilmiş yöntemler şöyle görünür:

public override string TitleForHeader (UITableView tableView, nint section)
{
    return keys[section];
}
public override string TitleForFooter (UITableView tableView, nint section)
{
    return indexedTableItems[keys[section]].Count + " items";
}

üzerinde ve yöntemi geçersiz kılmalarını UITableViewSourcekullanarakGetViewForHeader, görünüm nesnesiyle üst bilgi ve GetViewForFooter alt bilginin görünümünü daha da özelleştirebilirsiniz.