Zobrazení osnovy v Xamarin.Mac

Tento článek popisuje práci se zobrazeními osnovy v aplikaci Xamarin.Mac. Popisuje vytváření a údržbu zobrazení osnovy v Xcode a Interface Builderu a práci s nimi programově.

Při práci s C# a .NET v aplikaci Xamarin.Mac máte přístup ke stejným zobrazením osnovy, ve Objective-C kterých vývojář pracuje a Xcode . Vzhledem k tomu, že se Xamarin.Mac integruje přímo s Xcode, můžete pomocí Tvůrce rozhraní Xcode vytvářet a udržovat zobrazení osnovy (nebo je volitelně vytvořit přímo v kódu jazyka C#).

Zobrazení osnovy je typ tabulky, která uživateli umožňuje rozbalit nebo sbalit řádky hierarchických dat. Podobně jako zobrazení tabulky zobrazuje zobrazení osnovy data pro sadu souvisejících položek s řádky představujícími jednotlivé položky a sloupce představující atributy těchto položek. Na rozdíl od zobrazení tabulky nejsou položky v zobrazení osnovy v plochém seznamu uspořádané v hierarchii, jako jsou soubory a složky na pevném disku.

An example app run

V tomto článku se podíváme na základy práce se zobrazeními osnovy v aplikaci Xamarin.Mac. Důrazně doporučujeme, abyste si nejprve prošli článek Hello, Mac , konkrétně úvod do Xcode a Tvůrce rozhraní a výstupy a akce , protože se zabývá klíčovými koncepty a technikami, které budeme používat v tomto článku.

Možná se také budete chtít podívat na oddíly v dokumentu Interní dokumenty Xamarin.Mac pro zveřejnění tříd a metodObjective-Cjazyka C#. Vysvětluje také, které Register příkazy a Export které se používají k připojení tříd jazyka C# k Objective-C objektům a prvkům uživatelského rozhraní.

Úvod do zobrazení osnovy

Zobrazení osnovy je typ tabulky, která uživateli umožňuje rozbalit nebo sbalit řádky hierarchických dat. Podobně jako zobrazení tabulky zobrazuje zobrazení osnovy data pro sadu souvisejících položek s řádky představujícími jednotlivé položky a sloupce představující atributy těchto položek. Na rozdíl od zobrazení tabulky nejsou položky v zobrazení osnovy v plochém seznamu uspořádané v hierarchii, jako jsou soubory a složky na pevném disku.

Pokud položka v zobrazení osnovy obsahuje další položky, může ji uživatel rozbalit nebo sbalit. Rozbalitelná položka zobrazí trojúhelník zpřístupnění, který odkazuje vpravo, když je položka sbalená a při rozbalení položky přejde dolů. Kliknutí na trojúhelník zpřístupnění způsobí rozbalení nebo sbalení položky.

Zobrazení osnovy (NSOutlineView) je podtřídou zobrazení tabulky (NSTableView) a jako takové dědí většinu svého chování z nadřazené třídy. V důsledku toho podporuje mnoho operací podporovaných zobrazením tabulky, například výběr řádků nebo sloupců, přemístění sloupců přetažením záhlaví sloupců atd., je podporováno také zobrazením osnovy. Aplikace Xamarin.Mac má kontrolu nad těmito funkcemi a může nakonfigurovat parametry zobrazení osnovy (buď v kódu, nebo v Tvůrci rozhraní), aby umožňovaly nebo nepovolily určité operace.

Zobrazení osnovy neukládá vlastní data, místo toho spoléhá na zdroj dat (NSOutlineViewDataSource) k poskytnutí požadovaných řádků i sloupců podle potřeby.

Chování zobrazení osnovy lze přizpůsobit tak, že poskytuje podtřídu delegáta zobrazení osnovy (NSOutlineViewDelegate) pro podporu správy sloupců osnovy, typ pro výběr funkcí, výběr řádků a úpravy, vlastní sledování a vlastní zobrazení pro jednotlivé sloupce a řádky.

Vzhledem k tomu, že zobrazení osnovy sdílí většinu jeho chování a funkcí se zobrazením tabulky, můžete si před pokračováním v tomto článku projít naši dokumentaci k zobrazení tabulek.

Vytváření a údržba zobrazení osnovy v Xcode

Když vytvoříte novou aplikaci Xamarin.Mac Cocoa, ve výchozím nastavení se zobrazí standardní prázdné okno. Tato okna jsou definována .storyboard v souboru, který je automaticky zahrnutý v projektu. Pokud chcete upravit návrh oken, poklikejte v Průzkumník řešení na Main.storyboard soubor:

Selecting the main storyboard

Otevře se návrh okna v Tvůrci rozhraní Xcode:

Editing the UI in Xcode

Zadejte outline do vyhledávacího pole inspektoru knihovny, abyste usnadnili vyhledání ovládacích prvků Zobrazení osnovy:

Selecting an Outline View from the Library

Přetáhněte zobrazení osnovy do kontroleru zobrazení v editoru rozhraní, zaplňte oblast obsahu kontroleru zobrazení a nastavte ho na místo, kde se zmenší a zvětší s oknem v Editoru omezení:

Editing the constraints

V hierarchii rozhraní vyberte zobrazení osnovy a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available in the Attribute Inspector.

  • Sloupec osnovy – sloupec tabulky, ve kterém jsou zobrazena hierarchická data.
  • Sloupec osnovy automatického ukládání – Pokud truese sloupec osnovy automaticky uloží a obnoví mezi spuštěním aplikace.
  • Odsazení – velikost odsazení sloupců pod rozbalenou položkou
  • Odsazení následuje po buňkách – Pokud truese značka odsazení odsadí spolu s buňkami.
  • Automatické ukládání rozbalených položek – Pokud truese rozbalený nebo sbalený stav položek automaticky uloží a obnoví mezi spuštěními aplikace.
  • Režim obsahu – Umožňuje použít zobrazení (NSView) nebo buňky (NSCell) k zobrazení dat v řádcích a sloupcích. Počínaje macOS 10.7 byste měli používat zobrazení.
  • Plovoucí řady seskupí řádky – Pokud truebude zobrazení tabulky nakreslit seskupené buňky, jako by byly plovoucí.
  • Sloupce – definuje počet zobrazených sloupců.
  • Záhlaví – Pokud truebudou sloupce obsahovat záhlaví.
  • Změna pořadí – Pokud truebude uživatel moct přeuspořádat sloupce v tabulce.
  • Změna velikosti – Pokud truebude uživatel moct přetáhnout záhlaví sloupců, aby změnil velikost sloupců.
  • Nastavení velikosti sloupce – Určuje, jak bude tabulka automaticky měnit velikost sloupců.
  • Zvýraznění – určuje typ zvýraznění tabulky, která se používá při výběru buňky.
  • Alternativní řádky – Pokud true, někdy jiný řádek bude mít jinou barvu pozadí.
  • Vodorovná mřížka – vybere typ ohraničení nakresleného mezi buňkami vodorovně.
  • Svislá mřížka – vybere typ ohraničení nakresleného mezi buňkami svisle.
  • Barva mřížky – Nastaví barvu ohraničení buňky.
  • Pozadí – Nastaví barvu pozadí buňky.
  • Výběr – Umožňuje řídit, jak může uživatel vybrat buňky v tabulce jako:
    • Násobek – Pokud truemůže uživatel vybrat více řádků a sloupců.
    • Sloupec – Pokud trueuživatel může vybrat sloupce.
    • Zadejte Select - If true, uživatel může zadat znak pro výběr řádku.
    • Prázdné – Pokud trueuživatel nemusí vybrat řádek nebo sloupec, tabulka neumožňuje vůbec žádný výběr.
  • Automatické ukládání – název, pod kterým se automaticky uloží formát tabulek.
  • Informace o sloupci – Pokud truese pořadí a šířka sloupců automaticky uloží.
  • Konce řádků – Vyberte, jak buňka zpracovává konce řádků.
  • Zkrátí poslední viditelnou čáru – pokud truese buňka zkrátí v datech, nemůže se vejít do hranic.

Důležité

Pokud si nechováte starší verzi aplikace Xamarin.Mac, NSView měla by se v zobrazeních tabulek používat NSCell založená zobrazení osnovy. NSCell se považuje za starší verzi a v budoucnu se nemusí podporovat.

V hierarchii rozhraní vyberte sloupec tabulky a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available for the selected table column in the Attribute Inspector.

  • Název – Nastaví název sloupce.
  • Zarovnání – nastavte zarovnání textu v buňkách.
  • Písmo nadpisu – vybere písmo pro text záhlaví buňky.
  • Klíč řazení – je klíč použitý k řazení dat ve sloupci. Pokud uživatel nemůže tento sloupec seřadit, nechejte prázdné.
  • Selektor – používá se akce k řazení. Pokud uživatel nemůže tento sloupec seřadit, nechejte prázdné.
  • Pořadí – je pořadí řazení dat sloupců.
  • Změna velikosti – Vybere typ změny velikosti sloupce.
  • Upravitelné – Pokud truemůže uživatel upravovat buňky v tabulce založené na buňkách.
  • Skrytý – Pokud trueje sloupec skrytý.

Velikost sloupce můžete změnit také přetažením úchytu (svisle na střed na pravé straně sloupce) doleva nebo doprava.

Pojďme vybrat každý sloupec v zobrazení tabulky a dát prvnímu sloupci názevProduct a druhý sloupec Details.

V hierarchii rozhraní vyberte zobrazení buňky tabulky (NSTableViewCell) a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available for the selected table cell in the Attribute Inspector.

Toto jsou všechny vlastnosti standardního zobrazení. Tady máte také možnost upravit velikost řádků pro tento sloupec.

Vyberte buňku zobrazení tabulky (ve výchozím nastavení je NSTextFieldto ) v hierarchii rozhraní a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available for the selected table view cell in the Attribute Inspector.

Budete mít všechny vlastnosti standardního textového pole, které tady nastavíte. Ve výchozím nastavení se standardní textové pole používá k zobrazení dat pro buňku ve sloupci.

V hierarchii rozhraní vyberte zobrazení buňky tabulky (NSTableFieldCell) a v inspektoru atributů jsou k dispozici následující vlastnosti:

Screenshot shows the properties available for the selected table view cell.

Nejdůležitější nastavení jsou:

  • Rozložení – Vyberte způsob rozložení buněk v tomto sloupci.
  • Používá režim s jedním řádkem – Pokud trueje buňka omezena na jeden řádek.
  • První šířka rozložení modulu runtime – Pokud truebude buňka upřednostňovat šířku nastavenou (ručně nebo automaticky), když se zobrazí při prvním spuštění aplikace.
  • Akce – určuje, kdy se pro buňku odešle akce pro úpravy.
  • Chování – definuje, jestli je buňka vybratelná nebo upravitelná.
  • Formátovaný text – Pokud truemůže buňka zobrazit formátovaný a stylovaný text.
  • Zpět - Pokud truebuňka přebírá odpovědnost za chování vrácení zpět.

Vyberte zobrazení buňky tabulky (NSTableFieldCell) v dolní části sloupce tabulky v hierarchii rozhraní:

Selecting the table cell view

To vám umožní upravit zobrazení buněk tabulky použité jako základní vzor pro všechny buňky vytvořené pro daný sloupec.

Přidání akcí a výstupů

Stejně jako jakýkoli jiný ovládací prvek uživatelského rozhraní Cocoa potřebujeme zveřejnit zobrazení osnovy a jeho sloupce a buňky kódu jazyka C# pomocí akcí a výstupů (na základě požadovaných funkcí).

Tento proces je stejný pro všechny prvky zobrazení osnovy, které chceme zveřejnit:

  1. Přepněte do Editoru asistentů a ujistěte se, že ViewController.h je vybraný soubor:

    Selecting the correct .h file

  2. V hierarchii rozhraní vyberte zobrazení osnovy, klikněte a přetáhněte ho ViewController.h do souboru.

  3. Vytvořte výstup pro zobrazení osnovy s názvem ProductOutline:

    Screenshot shows an Outlet called ProductOutline in the Attribute Inspector.

  4. Vytvořit výstupy pro sloupce tabulek, které jsou také volány ProductColumn a DetailsColumn:

    Screenshot shows an Outlet named DetailsColumn in the Attribute Inspector.

  5. Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

V dalším kroku napíšeme kód, který při spuštění aplikace zobrazí nějaká data pro osnovu.

Naplnění zobrazení osnovy

S naším zobrazením osnovy navrženým v Tvůrci rozhraní a vystaveným prostřednictvím výstupu musíme vytvořit kód jazyka C#, který ho naplní.

Nejprve vytvoříme novou Product třídu, která bude obsahovat informace pro jednotlivé řádky a skupiny dílčích produktů. V Průzkumník řešení klikněte pravým tlačítkem na Projekt a vyberte Přidat>nový soubor... Vyberte položku Obecné>prázdné třídy, zadejte Product název a klikněte na tlačítko Nový:

Creating an empty class

Udělejte soubor Product.cs takto:

using System;
using Foundation;
using System.Collections.Generic;

namespace MacOutlines
{
    public class Product : NSObject
    {
        #region Public Variables
        public List<Product> Products = new List<Product>();
        #endregion

        #region Computed Properties
        public string Title { get; set;} = "";
        public string Description { get; set;} = "";
        public bool IsProductGroup {
            get { return (Products.Count > 0); }
        }
        #endregion

        #region Constructors
        public Product ()
        {
        }

        public Product (string title, string description)
        {
            this.Title = title;
            this.Description = description;
        }
        #endregion
    }
}

V dalším kroku musíme vytvořit podtřídu, která NSOutlineDataSource bude poskytovat data pro osnovu podle potřeby. V Průzkumník řešení klikněte pravým tlačítkem na Projekt a vyberte Přidat>nový soubor... Vyberte Obecné>prázdné třídy, zadejte ProductOutlineDataSource název a klikněte na tlačítko Nový.

ProductTableDataSource.cs Upravte soubor a udělejte ho takto:

using System;
using AppKit;
using CoreGraphics;
using Foundation;
using System.Collections;
using System.Collections.Generic;

namespace MacOutlines
{
    public class ProductOutlineDataSource : NSOutlineViewDataSource
    {
        #region Public Variables
        public List<Product> Products = new List<Product>();
        #endregion

        #region Constructors
        public ProductOutlineDataSource ()
        {
        }
        #endregion

        #region Override Methods
        public override nint GetChildrenCount (NSOutlineView outlineView, NSObject item)
        {
            if (item == null) {
                return Products.Count;
            } else {
                return ((Product)item).Products.Count;
            }

        }

        public override NSObject GetChild (NSOutlineView outlineView, nint childIndex, NSObject item)
        {
            if (item == null) {
                return Products [childIndex];
            } else {
                return ((Product)item).Products [childIndex];
            }

        }

        public override bool ItemExpandable (NSOutlineView outlineView, NSObject item)
        {
            if (item == null) {
                return Products [0].IsProductGroup;
            } else {
                return ((Product)item).IsProductGroup;
            }

        }
        #endregion
    }
}

Tato třída má úložiště pro položky zobrazení osnovy GetChildrenCount a přepíše, aby vrátila počet řádků v tabulce. Vrátí GetChild konkrétní nadřazenou nebo podřízenou položku (požadovanou zobrazením osnovy) a ItemExpandable definuje zadanou položku jako nadřazenou nebo podřízenou položku.

Nakonec musíme vytvořit podtřídu, která NSOutlineDelegate bude poskytovat chování osnovy. V Průzkumník řešení klikněte pravým tlačítkem na Projekt a vyberte Přidat>nový soubor... Vyberte Obecné>prázdné třídy, zadejte ProductOutlineDelegate název a klikněte na tlačítko Nový.

ProductOutlineDelegate.cs Upravte soubor a udělejte ho takto:

using System;
using AppKit;
using CoreGraphics;
using Foundation;
using System.Collections;
using System.Collections.Generic;

namespace MacOutlines
{
    public class ProductOutlineDelegate : NSOutlineViewDelegate
    {
        #region Constants
        private const string CellIdentifier = "ProdCell";
        #endregion

        #region Private Variables
        private ProductOutlineDataSource DataSource;
        #endregion

        #region Constructors
        public ProductOutlineDelegate (ProductOutlineDataSource datasource)
        {
            this.DataSource = datasource;
        }
        #endregion

        #region Override Methods

        public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) {
            // This pattern allows you reuse existing views when they are no-longer in use.
            // If the returned view is null, you instance up a new view
            // If a non-null view is returned, you modify it enough to reflect the new data
            NSTextField view = (NSTextField)outlineView.MakeView (CellIdentifier, this);
            if (view == null) {
                view = new NSTextField ();
                view.Identifier = CellIdentifier;
                view.BackgroundColor = NSColor.Clear;
                view.Bordered = false;
                view.Selectable = false;
                view.Editable = false;
            }

            // Cast item
            var product = item as Product;

            // Setup view based on the column selected
            switch (tableColumn.Title) {
            case "Product":
                view.StringValue = product.Title;
                break;
            case "Details":
                view.StringValue = product.Description;
                break;
            }

            return view;
        }
        #endregion
    }
}

Když vytvoříme instanci objektu ProductOutlineDelegate, předáme také instanci ProductOutlineDataSource , která poskytuje data pro osnovu. Metoda GetView zodpovídá za vrácení zobrazení (dat) pro zobrazení buňky pro sloupec a řádek. Pokud je to možné, existující zobrazení bude znovu použito k zobrazení buňky, pokud není nové zobrazení nutné vytvořit.

Pokud chcete osnovu naplnit, pojďme soubor upravit MainWindow.cs a nastavit, aby AwakeFromNib metoda vypadala takto:

public override void AwakeFromNib ()
{
    base.AwakeFromNib ();

    // Create data source and populate
    var DataSource = new ProductOutlineDataSource ();

    var Vegetables = new Product ("Vegetables", "Greens and Other Produce");
    Vegetables.Products.Add (new Product ("Cabbage", "Brassica oleracea - Leaves, axillary buds, stems, flowerheads"));
    Vegetables.Products.Add (new Product ("Turnip", "Brassica rapa - Tubers, leaves"));
    Vegetables.Products.Add (new Product ("Radish", "Raphanus sativus - Roots, leaves, seed pods, seed oil, sprouting"));
    Vegetables.Products.Add (new Product ("Carrot", "Daucus carota - Root tubers"));
    DataSource.Products.Add (Vegetables);

    var Fruits = new Product ("Fruits", "Fruit is a part of a flowering plant that derives from specific tissues of the flower");
    Fruits.Products.Add (new Product ("Grape", "True Berry"));
    Fruits.Products.Add (new Product ("Cucumber", "Pepo"));
    Fruits.Products.Add (new Product ("Orange", "Hesperidium"));
    Fruits.Products.Add (new Product ("Blackberry", "Aggregate fruit"));
    DataSource.Products.Add (Fruits);

    var Meats = new Product ("Meats", "Lean Cuts");
    Meats.Products.Add (new Product ("Beef", "Cow"));
    Meats.Products.Add (new Product ("Pork", "Pig"));
    Meats.Products.Add (new Product ("Veal", "Young Cow"));
    DataSource.Products.Add (Meats);

    // Populate the outline
    ProductOutline.DataSource = DataSource;
    ProductOutline.Delegate = new ProductOutlineDelegate (DataSource);

}

Pokud spustíme aplikaci, zobrazí se následující:

The collapsed view

Pokud uzel rozbalíme v zobrazení osnovy, bude vypadat takto:

The expanded view

Řazení podle sloupce

Umožníme uživateli seřadit data v osnově kliknutím na záhlaví sloupce. Nejprve poklikáním na Main.storyboard soubor otevřete soubor pro úpravy v Tvůrci rozhraní. Product Vyberte sloupec, zadejte Title klíč řazení, compare: pro selektor a vyberte Ascendingpořadí:

Setting the sort key order

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Teď soubor upravíme ProductOutlineDataSource.cs a přidáme následující metody:

public void Sort(string key, bool ascending) {

    // Take action based on key
    switch (key) {
    case "Title":
        if (ascending) {
            Products.Sort ((x, y) => x.Title.CompareTo (y.Title));
        } else {
            Products.Sort ((x, y) => -1 * x.Title.CompareTo (y.Title));
        }
        break;
    }
}

public override void SortDescriptorsChanged (NSOutlineView outlineView, NSSortDescriptor[] oldDescriptors)
{
    // Sort the data
    Sort (oldDescriptors [0].Key, oldDescriptors [0].Ascending);
    outlineView.ReloadData ();
}

Metoda Sort nám umožňuje seřadit data ve zdroji dat na základě daného Product pole třídy ve vzestupném nebo sestupném pořadí. Přepsaná SortDescriptorsChanged metoda bude volána při každém kliknutí na záhlaví sloupce. Předá se hodnota Klíče , kterou jsme nastavili v Tvůrci rozhraní, a pořadí řazení pro daný sloupec.

Pokud spustíme aplikaci a klikneme na záhlaví sloupců, řádky se seřadí podle daného sloupce:

Example of sorted output

Výběr řádku

Pokud chcete uživateli povolit výběr jednoho řádku, poklikejte na soubor a otevřete ho Main.storyboard pro úpravy v Tvůrci rozhraní. Vyberte zobrazení osnovy v hierarchii rozhraní a zrušte zaškrtnutí políčka Více v kontrole atributů:

Screenshot shows the Attribute Inspector where you can change the Multiple setting.

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Dále upravte ProductOutlineDelegate.cs soubor a přidejte následující metodu:

public override bool ShouldSelectItem (NSOutlineView outlineView, NSObject item)
{
    // Don't select product groups
    return !((Product)item).IsProductGroup;
}

To uživateli umožní vybrat libovolný jeden řádek v zobrazení osnovy. Vraťte false se pro ShouldSelectItem libovolnou položku, kterou nechcete, aby uživatel mohl vybrat nebo false pro každou položku, pokud nechcete, aby uživatel mohl vybrat žádné položky.

Výběr více řádků

Pokud chcete uživateli povolit výběr více řádků, poklikáním Main.storyboard otevřete soubor pro úpravy v Tvůrci rozhraní. Vyberte zobrazení osnovy v hierarchii rozhraní a zaškrtněte políčko Více v inspektoru atributů:

Screenshot shows the Attribute Inspector where you can select Multiple.

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Dále upravte ProductOutlineDelegate.cs soubor a přidejte následující metodu:

public override bool ShouldSelectItem (NSOutlineView outlineView, NSObject item)
{
    // Don't select product groups
    return !((Product)item).IsProductGroup;
}

To uživateli umožní vybrat libovolný jeden řádek v zobrazení osnovy. Vraťte false se pro ShouldSelectRow libovolnou položku, kterou nechcete, aby uživatel mohl vybrat nebo false pro každou položku, pokud nechcete, aby uživatel mohl vybrat žádné položky.

Typ pro výběr řádku

Pokud chcete uživateli povolit, aby zadal znak s vybraným zobrazením osnovy a vyberte první řádek s tímto znakem, poklikáním otevřete Main.storyboard soubor pro úpravy v Tvůrci rozhraní. Vyberte zobrazení osnovy v hierarchii rozhraní a zaškrtněte políčko Vybrat typ v inspektoru atributů:

Editing the row type

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Teď soubor upravíme ProductOutlineDelegate.cs a přidáme následující metodu:

public override NSObject GetNextTypeSelectMatch (NSOutlineView outlineView, NSObject startItem, NSObject endItem, string searchString)
{
    foreach(Product product in DataSource.Products) {
        if (product.Title.Contains (searchString)) {
            return product;
        }
    }

    // Not found
    return null;
}

Metoda GetNextTypeSelectMatch vezme danou searchString a vrátí položku prvního Product , který má tento řetězec v něm je Title.

Změna pořadí sloupců

Pokud chcete uživateli povolit přetahování sloupců v zobrazení osnovy, poklikejte na soubor a otevřete ho Main.storyboard pro úpravy v Tvůrci rozhraní. Vyberte zobrazení osnovy v hierarchii rozhraní a zaškrtněte políčko Změnit pořadí v inspektoru atributů:

Screenshot shows the Attribute Inspector where you can select Reordering.

Pokud zadáme hodnotu vlastnosti Automatické ukládání a zkontrolujeme pole Informace o sloupci, všechny změny provedené v rozložení tabulky se automaticky uloží za nás a obnoví se při příštím spuštění aplikace.

Uložte změny a vraťte se do Visual Studio pro Mac pro synchronizaci s Xcode.

Teď soubor upravíme ProductOutlineDelegate.cs a přidáme následující metodu:

public override bool ShouldReorder (NSOutlineView outlineView, nint columnIndex, nint newColumnIndex)
{
    return true;
}

Metoda ShouldReorder by měla vrátit true pro libovolný sloupec, který chcete povolit přetáhnout do newColumnIndex, jinak vrátit false;

Pokud spustíme aplikaci, můžeme záhlaví sloupců přetáhnout kolem a změnit pořadí sloupců:

Example of reordering columns

Úpravy buněk

Pokud chcete uživateli povolit úpravy hodnot pro danou buňku, upravte ProductOutlineDelegate.cs soubor a změňte metodu GetViewForItem následujícím způsobem:

public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) {
    // Cast item
    var product = item as Product;

    // This pattern allows you reuse existing views when they are no-longer in use.
    // If the returned view is null, you instance up a new view
    // If a non-null view is returned, you modify it enough to reflect the new data
    NSTextField view = (NSTextField)outlineView.MakeView (tableColumn.Title, this);
    if (view == null) {
        view = new NSTextField ();
        view.Identifier = tableColumn.Title;
        view.BackgroundColor = NSColor.Clear;
        view.Bordered = false;
        view.Selectable = false;
        view.Editable = !product.IsProductGroup;
    }

    // Tag view
    view.Tag = outlineView.RowForItem (item);

    // Allow for edit
    view.EditingEnded += (sender, e) => {

        // Grab product
        var prod = outlineView.ItemAtRow(view.Tag) as Product;

        // Take action based on type
        switch(view.Identifier) {
        case "Product":
            prod.Title = view.StringValue;
            break;
        case "Details":
            prod.Description = view.StringValue;
            break;
        }
    };

    // Setup view based on the column selected
    switch (tableColumn.Title) {
    case "Product":
        view.StringValue = product.Title;
        break;
    case "Details":
        view.StringValue = product.Description;
        break;
    }

    return view;
}

Když teď spustíme aplikaci, uživatel může upravit buňky v zobrazení tabulky:

An example of editing cells

Použití obrázků v zobrazení osnovy

Pokud chcete do buňky zahrnout obrázek jako NSOutlineViewsoučást buňky, budete muset změnit způsob vrácení dat metodou Zobrazení osnovy NSTableViewDelegate'sGetView tak, aby používala místo NSTableCellView typického NSTextField. Příklad:

public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item) {
    // Cast item
    var product = item as Product;

    // This pattern allows you reuse existing views when they are no-longer in use.
    // If the returned view is null, you instance up a new view
    // If a non-null view is returned, you modify it enough to reflect the new data
    NSTableCellView view = (NSTableCellView)outlineView.MakeView (tableColumn.Title, this);
    if (view == null) {
        view = new NSTableCellView ();
        if (tableColumn.Title == "Product") {
            view.ImageView = new NSImageView (new CGRect (0, 0, 16, 16));
            view.AddSubview (view.ImageView);
            view.TextField = new NSTextField (new CGRect (20, 0, 400, 16));
        } else {
            view.TextField = new NSTextField (new CGRect (0, 0, 400, 16));
        }
        view.TextField.AutoresizingMask = NSViewResizingMask.WidthSizable;
        view.AddSubview (view.TextField);
        view.Identifier = tableColumn.Title;
        view.TextField.BackgroundColor = NSColor.Clear;
        view.TextField.Bordered = false;
        view.TextField.Selectable = false;
        view.TextField.Editable = !product.IsProductGroup;
    }

    // Tag view
    view.TextField.Tag = outlineView.RowForItem (item);

    // Allow for edit
    view.TextField.EditingEnded += (sender, e) => {

        // Grab product
        var prod = outlineView.ItemAtRow(view.Tag) as Product;

        // Take action based on type
        switch(view.Identifier) {
        case "Product":
            prod.Title = view.TextField.StringValue;
            break;
        case "Details":
            prod.Description = view.TextField.StringValue;
            break;
        }
    };

    // Setup view based on the column selected
    switch (tableColumn.Title) {
    case "Product":
        view.ImageView.Image = NSImage.ImageNamed (product.IsProductGroup ? "tags.png" : "tag.png");
        view.TextField.StringValue = product.Title;
        break;
    case "Details":
        view.TextField.StringValue = product.Description;
        break;
    }

    return view;
}

Další informace najdete v části Použití obrázků se zobrazeními osnovy v naší dokumentaci Práce s obrázky .

Zobrazení osnovy datové vazby

Pomocí technik kódování klíč-hodnota a datové vazby v aplikaci Xamarin.Mac můžete výrazně snížit množství kódu, který musíte napsat a udržovat pro naplnění a práci s prvky uživatelského rozhraní. Výhodou je také další oddělení backingových dat (datový model) od front-endového uživatelského rozhraní (Model-View-Controller), což usnadňuje údržbu a flexibilnější návrh aplikace.

Kódování klíč-hodnota (KVC) je mechanismus pro přístup k vlastnostem objektu nepřímo pomocí klíčů (speciálně formátovaných řetězců) k identifikaci vlastností místo přístupu prostřednictvím proměnných instancí nebo metod přístupového objektu (get/set). Implementací přístupových objektů kompatibilních s kódováním klíč-hodnota v aplikaci Xamarin.Mac získáte přístup k dalším funkcím systému macOS, jako je KVO (Key-Value Observing), Datová vazba, Základní data, vazby Cocoa a skriptovatelnost.

Další informace najdete v části Vazby dat zobrazení osnovy v dokumentaci k datovým vazbě a kódování klíč-hodnota.

Shrnutí

Tento článek se podrobně podíval na práci se zobrazeními osnovy v aplikaci Xamarin.Mac. Viděli jsme různé typy a použití zobrazení osnovy, jak vytvářet a udržovat zobrazení osnovy v Tvůrci rozhraní Xcode a jak pracovat se zobrazeními osnovy v kódu jazyka C#.