Práce s akcemi řádků v Xamarin.iOS

Tato příručka ukazuje, jak vytvořit vlastní akce potáhnutí prstem pro řádky tabulky pomocí UISwipeActionsConfiguration nebo UITableViewRowAction.

Demonstrating swipe actions on rows

iOS nabízí dva způsoby provádění akcí v tabulce: UISwipeActionsConfiguration a UITableViewRowAction.

UISwipeActionsConfiguration byl zaveden v iOSu 11 a slouží k definování sady akcí, které by se měly provést, když uživatel potáhne v libovolném směru na řádku v zobrazení tabulky. Toto chování je podobné jako u nativních Mail.app

Třída UITableViewRowAction se používá k definování akce, která se provede, když uživatel potáhne vodorovně na řádku v zobrazení tabulky. Když například upravujete tabulku, potahujte prstem doleva na řádku, ve výchozím nastavení se zobrazí tlačítko Odstranit . Připojením více instancí UITableViewRowAction třídy k UITableView, více vlastních akcí lze definovat, každý s vlastním textem, formátováním a chováním.

UISwipeActionsConfiguration

K implementaci akcí potáhnutí prstem se vyžaduje tři kroky:UISwipeActionsConfiguration

  1. Přepsání GetLeadingSwipeActionsConfiguration a/nebo GetTrailingSwipeActionsConfiguration metody Tyto metody vrací hodnotu UISwipeActionsConfiguration.
  2. Vytvořte instanci, která UISwipeActionsConfiguration má být vrácena. Tato třída přebírá pole UIContextualAction.
  3. Vytvořit .UIContextualAction

Tyto informace jsou podrobněji vysvětleny v následujících částech.

1. Implementace metod SwipeActionsConfigurations

UITableViewController (a také UITableViewSourceUITableViewDelegate) obsahují dvě metody: GetLeadingSwipeActionsConfiguration a GetTrailingSwipeActionsConfiguration, které slouží k implementaci sady akcí potáhnutí prstem na řádku zobrazení tabulky. Úvodní akce potáhnutí odkazuje na potáhnutí prstem z levé strany obrazovky v jazyce zleva doprava a z pravé strany obrazovky v jazyce zprava doleva.

Následující příklad (z ukázky TableSwipeActions ) ukazuje implementaci úvodní konfigurace potáhnutí prstem. Z kontextových akcí se vytvoří dvě akce, které jsou vysvětleny níže. Tyto akce se pak předají nově inicializovanému UISwipeActionsConfiguration, který se použije jako návratová hodnota.

public override UISwipeActionsConfiguration GetLeadingSwipeActionsConfiguration(UITableView tableView, NSIndexPath indexPath)
{
    //UIContextualActions
    var definitionAction = ContextualDefinitionAction(indexPath.Row);
    var flagAction = ContextualFlagAction(indexPath.Row);

    //UISwipeActionsConfiguration
    var leadingSwipe = UISwipeActionsConfiguration.FromActions(new UIContextualAction[] { flagAction, definitionAction });

    leadingSwipe.PerformsFirstActionWithFullSwipe = false;

    return leadingSwipe;
}

2. Vytvořte instanci UISwipeActionsConfiguration

UISwipeActionsConfiguration Vytvořte instanci pomocí FromActions metody pro přidání nového pole UIContextualActions, jak je znázorněno v následujícím fragmentu kódu:

var leadingSwipe = UISwipeActionsConfiguration.FromActions(new UIContextualAction[] { flagAction, definitionAction })

leadingSwipe.PerformsFirstActionWithFullSwipe = false;

Je důležité si uvědomit, že pořadí, ve kterém se zobrazují vaše akce, závisí na tom, jak se předávají do pole. Například výše uvedený kód pro úvodní potáhnutí zobrazí akce takto:

leading swipe Actions displayed on a table row

Pro koncové potáhnutí prsty se akce zobrazí, jak je znázorněno na následujícím obrázku:

trailing swipe Actions displayed on a table row

Tento fragment kódu také využívá novou PerformsFirstActionWithFullSwipe vlastnost. Ve výchozím nastavení je tato vlastnost nastavena na hodnotu true, což znamená, že první akce v poli se stane, když uživatel potáhne prstem úplně na řádku. Pokud máte akci, která není destruktivní (například "Odstranit", nemusí to být ideální chování a proto byste ho měli nastavit na false.

Vytvořte soubor UIContextualAction

Kontextová akce je místo, kde ve skutečnosti vytvoříte akci, která se zobrazí, když uživatel potáhne řádek tabulky.

Chcete-li inicializovat akci, musíte zadat UIContextualActionStylenázev a UIContextualActionHandler. Má UIContextualActionHandler tři parametry: akci, zobrazení, ve kterém se akce zobrazila, a obslužná rutina dokončení:

public UIContextualAction ContextualFlagAction(int row)
{
    var action = UIContextualAction.FromContextualActionStyle
                    (UIContextualActionStyle.Normal,
                        "Flag",
                        (FlagAction, view, success) => {
                            var alertController = UIAlertController.Create($"Report {words[row]}?", "", UIAlertControllerStyle.Alert);
                            alertController.AddAction(UIAlertAction.Create("Cancel", UIAlertActionStyle.Cancel, null));
                            alertController.AddAction(UIAlertAction.Create("Yes", UIAlertActionStyle.Destructive, null));
                            PresentViewController(alertController, true, null);

                            success(true);
                        });

    action.Image = UIImage.FromFile("feedback.png");
    action.BackgroundColor = UIColor.Blue;

    return action;
}

Můžete upravit různé vizuální vlastnosti, například barvu pozadí nebo obrázek akce. Výše uvedený fragment kódu ukazuje přidání obrázku do akce a nastavení jeho barvy pozadí na modrou.

Po vytvoření kontextových akcí je možné je použít k inicializaci UISwipeActionsConfiguration metody GetLeadingSwipeActionsConfiguration .

UITableViewRowAction

Chcete-li definovat jednu nebo více vlastních akcí řádku pro určitý UITableView, budete muset vytvořit instanci UITableViewDelegate třídy a přepsat metodu EditActionsForRow . Příklad:

using System;
using System.Collections.Generic;
using System.IO;
using Foundation;
using UIKit;

namespace BasicTable
{
    public class TableDelegate : UITableViewDelegate
    {
        #region Constructors
        public TableDelegate ()
        {
        }

        public TableDelegate (IntPtr handle) : base (handle)
        {
        }

        public TableDelegate (NSObjectFlag t) : base (t)
        {
        }

        #endregion

        #region Override Methods
        public override UITableViewRowAction[] EditActionsForRow (UITableView tableView, NSIndexPath indexPath)
        {
            UITableViewRowAction hiButton = UITableViewRowAction.Create (
                UITableViewRowActionStyle.Default,
                "Hi",
                delegate {
                    Console.WriteLine ("Hello World!");
                });
            return new UITableViewRowAction[] { hiButton };
        }
        #endregion
    }
}

Statická UITableViewRowAction.Create metoda slouží k vytvoření nové UITableViewRowAction , která zobrazí tlačítko Hi , když uživatel potáhne prstem doleva vodorovně na řádku v tabulce. Později se vytvoří nová instance TableDelegate a připojí se k .UITableView Příklad:

TableDelegate tableDelegate;
...

// Replace the standard delete button with a "Hi" button
tableDelegate = new TableDelegate ();
table.Delegate = tableDelegate;

Když se spustí výše uvedený kód a uživatel potáhne prstem doleva na řádku tabulky, zobrazí se místo tlačítkaOdstranit , které se ve výchozím nastavení zobrazí:

The Hi button being displayed instead of the Delete button

Pokud uživatel klepne na tlačítko Hi, Hello World! zapíše se do konzoly v Visual Studio pro Mac nebo Visual Studio při spuštění aplikace v režimu ladění.