Поделиться через


Работа с действиями строк в Xamarin.iOS

В этом руководстве показано, как создать настраиваемые действия прокрутки для строк таблицы с помощью UISwipeActionsConfiguration или UITableViewRowAction

Демонстрация действий пальцем по строкам

iOS предоставляет два способа выполнения действий в таблице: UISwipeActionsConfiguration и UITableViewRowAction.

UISwipeActionsConfiguration представлен в iOS 11 и используется для определения набора действий, которые должны выполняться, когда пользователь проводит пальцем в любом направлении по строке в представлении таблицы. Это поведение аналогично собственному Mail.app

Класс UITableViewRowAction используется для определения действия, которое будет происходить, когда пользователь проводит пальцем влево по горизонтали в строке в представлении таблицы. Например, при редактировании таблицы прокрутка влево в строке отображает кнопку "Удалить " по умолчанию. При присоединении нескольких экземпляров класса к классу UITableViewможно определить несколько пользовательских UITableViewRowAction действий, каждый из которых имеет собственный текст, форматирование и поведение.

UISwipeActionsConfiguration

Существует три шага, необходимых для реализации действий прокрутки с помощью UISwipeActionsConfigurationследующих действий:

  1. Переопределение GetLeadingSwipeActionsConfiguration и/или GetTrailingSwipeActionsConfiguration методы. Эти методы возвращают UISwipeActionsConfigurationзначение .
  2. Создайте экземпляр возвращаемого UISwipeActionsConfiguration экземпляра. Этот класс принимает массив UIContextualAction.
  3. Создайте UIContextualAction.

Они подробно описаны в следующих разделах.

1. Реализация методов SwipeActionsConfigurations

UITableViewController (а также UITableViewSourceUITableViewDelegateи) содержат два метода: GetLeadingSwipeActionsConfiguration и GetTrailingSwipeActionsConfiguration, которые используются для реализации набора действий пальцем в строке представления таблицы. Действие прокрутки в начале относится к пальцем с левой стороны экрана в левой и правой части экрана, а также с правой стороны экрана в левой части языка.

В следующем примере демонстрируется реализация конфигурации начального пальцем. Два действия создаются из контекстных действий, описанных ниже. Затем эти действия передаются в только что инициализированную UISwipeActionsConfiguration, которая используется в качестве возвращаемого значения.

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. Создание экземпляра UISwipeActionsConfiguration

Создайте UISwipeActionsConfiguration экземпляр с FromActions помощью метода для добавления нового массива UIContextualActions, как показано в следующем фрагменте кода:

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

leadingSwipe.PerformsFirstActionWithFullSwipe = false;

Важно отметить, что порядок отображения действий зависит от того, как они передаются в массив. Например, приведенный выше код для ведущих пальцем отображает действия следующим образом:

операции прокрутки, отображаемые в строке таблицы

Для конечных прокрутки действия будут отображаться, как показано на следующем рисунке:

Операции прокрутки, отображаемые в строке таблицы

Этот фрагмент кода также использует новое PerformsFirstActionWithFullSwipe свойство. По умолчанию это свойство имеет значение true, что означает, что первое действие в массиве произойдет, когда пользователь проводит пальцем полностью по строке. Если у вас есть действие, которое не является разрушительным (например, "Удалить", это может не быть идеальным поведением, поэтому его следует задать.false

Создание класса UIContextualAction

Контекстное действие — это место, в котором вы фактически создаете действие, которое будет отображаться, когда пользователь проводит по строке таблицы.

Чтобы инициализировать действие, необходимо указать UIContextualActionStyleназвание и а UIContextualActionHandler. Принимает UIContextualActionHandler три параметра: действие, представление, в котором отображалось действие, и обработчик завершения:

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

Можно изменить различные визуальные свойства, такие как цвет фона или изображение действия. Приведенный выше фрагмент кода демонстрирует добавление изображения в действие и задание его цвета фона синим цветом.

После создания контекстных действий они могут использовать для инициализации UISwipeActionsConfiguration в методе GetLeadingSwipeActionsConfiguration .

UITableViewRowAction

Чтобы определить одно или несколько пользовательских UITableViewDelegate действий строки для объектаUITableView, необходимо создать экземпляр класса и переопределить EditActionsForRow метод. Например:

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

Статический UITableViewRowAction.Create метод используется для создания нового UITableViewRowAction , отображающего кнопку Привет , когда пользователь проводит пальцем влево по горизонтали в строку в таблице. Позже создается и присоединяется к нему UITableViewновый экземплярTableDelegate. Например:

TableDelegate tableDelegate;
...

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

При выполнении приведенного выше кода пользователь проводит пальцем влево в строку таблицы, кнопка "Привет" будет отображаться вместо кнопки "Удалить", отображаемой по умолчанию:

Кнопка

Если пользователь нажимает кнопку "Привет", Hello World! он будет записан в консоль в Visual Studio для Mac или Visual Studio при запуске приложения в режиме отладки.