共用方式為


在 Xamarin.iOS 中使用數據列動作

本指南示範如何使用UISwipeActionsConfiguration或UITableViewRowAction 建立數據表數據列的自定義撥動動作

示範數據列的撥動動作

iOS 提供兩種方式,在資料表上執行動作: UISwipeActionsConfigurationUITableViewRowAction

UISwipeActionsConfiguration是在 iOS 11 中引進的,用來定義當使用者在數據表檢視中數據列上向任一方向撥動時應該執行的一組動作。 此行為類似於原生 Mail.app

類別 UITableViewRowAction 是用來定義當用戶水平撥動數據表檢視中數據列時所要執行的動作。 例如,編輯數據表時,在數據列上向左撥動,預設會顯示 [ 刪除] 按鈕。 藉由將 類別的 UITableViewRowAction 多個實例附加至 UITableView,即可定義多個自定義動作,每個動作都有自己的文字、格式和行為。

UISwipeActionsConfiguration

使用 實作撥動動作 UISwipeActionsConfiguration需要三個步驟:

  1. 覆寫 GetLeadingSwipeActionsConfiguration 和/或 GetTrailingSwipeActionsConfiguration 方法。 這些方法會傳 UISwipeActionsConfiguration回 。
  2. 具現化 UISwipeActionsConfiguration 要傳回的 。 這個類別接受的 UIContextualAction陣列。
  3. 建立 UIContextualAction

下列各節會更詳細地說明這些內容。

1.實作 SwipeActionsConfigurations 方法

UITableViewController(和 和 UITableViewSource ) 包含兩種方法:GetLeadingSwipeActionsConfigurationUITableViewDelegateGetTrailingSwipeActionsConfiguration,用來在數據表檢視列上實作一組撥動動作。 前置撥動動作是指從由左至右語言的螢幕左側和從右至左語言的屏幕右側撥動。

下列範例示範如何實作前置撥動設定。 從內容相關動作建立兩個動作,如下所述。 然後,這些動作會傳遞至新初始化 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

使用 FromActions 方法來具現化 UISwipeActionsConfiguration ,以新增 s 陣列UIContextualAction,如下列代碼段所示:

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

您可以編輯各種視覺屬性,例如動作的背景色彩或影像。 上述代碼段示範如何將影像新增至動作,並將其背景色彩設定為藍色。

建立內容相關動作之後,就可以使用 在 方法中GetLeadingSwipeActionsConfiguration初始化 UISwipeActionsConfiguration

UITableViewRowAction

若要定義 的 UITableView一或多個自定義數據列動作,您必須建立 類別的 UITableViewDelegate 實例並覆寫 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 ,當用戶水平撥動數據表中數據列時, 會顯示 [Hi ] 按鈕。 稍後會建立 的新 實體 TableDelegate ,並附加至 UITableView。 例如:

TableDelegate tableDelegate;
...

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

執行上述程式代碼且使用者向左撥動數據表數據列時, 會顯示 [Hi ] 按鈕,而不是 預設顯示的 [刪除] 按鈕:

顯示的 [Hi] 按鈕,而不是 [刪除] 按鈕

如果用戶點選 [Hi ] 按鈕,當應用程式以偵錯模式執行時, Hello World! 將會寫出至 Visual Studio for Mac 或 Visual Studio 中的控制台。