Arbeiten mit Zeilenaktionen in Xamarin.iOS
In diesem Handbuch wird veranschaulicht, wie Sie benutzerdefinierte Streifaktionen für Tabellenzeilen mit UISwipeActionsConfiguration oder UITableViewRowAction erstellen.
iOS bietet zwei Möglichkeiten zum Ausführen von Aktionen in einer Tabelle: UISwipeActionsConfiguration
und UITableViewRowAction
.
UISwipeActionsConfiguration
wurde in iOS 11 eingeführt und wird verwendet, um eine Reihe von Aktionen zu definieren, die ausgeführt werden sollen, wenn der Benutzer in einer Zeile in einer Tabellenansicht in beide Richtungen streift. Dieses Verhalten ähnelt dem der systemeigenen Mail.app
Die UITableViewRowAction
Klasse wird verwendet, um eine Aktion zu definieren, die ausgeführt wird, wenn der Benutzer horizontal in einer Zeile in einer Tabellenansicht nach links wischt.
Wenn Sie beispielsweise eine Tabelle bearbeiten, wird beim Wischen nach links in einer Zeile standardmäßig eine Schaltfläche "Löschen " angezeigt. Durch Das Anfügen mehrerer Instanzen der UITableViewRowAction
Klasse an eine UITableView
, mehrere benutzerdefinierte Aktionen können definiert werden, jeweils mit eigenem Text, Formatierung und Verhalten.
UISwipeActionsConfiguration
Zum Implementieren von Wischaktionen sind drei Schritte erforderlich:UISwipeActionsConfiguration
- Überschreiben
GetLeadingSwipeActionsConfiguration
und/oderGetTrailingSwipeActionsConfiguration
Methoden. Diese Methoden geben einUISwipeActionsConfiguration
. - Instanziieren Sie den
UISwipeActionsConfiguration
zurückzugebenden Wert. Diese Klasse akzeptiert ein Array vonUIContextualAction
. - Erstellen Sie eine
UIContextualAction
.
Diese werden in den folgenden Abschnitten ausführlicher erläutert.
1. Implementieren der SwipeActionsConfigurations-Methoden
UITableViewController
(und UITableViewSource
UITableViewDelegate
) enthalten zwei Methoden: GetLeadingSwipeActionsConfiguration
und GetTrailingSwipeActionsConfiguration
, die zum Implementieren einer Reihe von Wischaktionen in einer Tabellenansichtszeile verwendet werden. Die führende Wischaktion bezieht sich auf eine Wischbewegung von der linken Seite des Bildschirms in einer Von links nach rechts und von der rechten Seite des Bildschirms in einer Rechts-nach-links-Sprache.
Im folgenden Beispiel wird die Implementierung der führenden Wischkonfiguration veranschaulicht. Zwei Aktionen werden aus den kontextbezogenen Aktionen erstellt, die unten erläutert werden. Diese Aktionen werden dann an eine neu initialisierte UISwipeActionsConfiguration
Übergeben, die als Rückgabewert verwendet wird.
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. Instanziieren eines UISwipeActionsConfiguration
Instanziieren Sie ein UISwipeActionsConfiguration
Array mit der FromActions
Methode, um ein neues Array von UIContextualAction
s hinzuzufügen, wie im folgenden Codeausschnitt gezeigt:
var leadingSwipe = UISwipeActionsConfiguration.FromActions(new UIContextualAction[] { flagAction, definitionAction })
leadingSwipe.PerformsFirstActionWithFullSwipe = false;
Es ist wichtig zu beachten, dass die Reihenfolge, in der Ihre Aktionen angezeigt werden, davon abhängig ist, wie sie in Ihr Array übergeben werden. Beispielsweise zeigt der obige Code für führende Wischbewegungen die Aktionen wie folgt an:
Bei nachgestellten Wischen werden die Aktionen wie in der folgenden Abbildung dargestellt angezeigt:
Dieser Codeausschnitt verwendet auch die neue PerformsFirstActionWithFullSwipe
Eigenschaft. Diese Eigenschaft ist standardmäßig auf "true" festgelegt, d. h., die erste Aktion im Array erfolgt, wenn ein Benutzer vollständig in eine Zeile wischen. Wenn Sie eine Aktion haben, die nicht destruktiv ist (z. B. "Löschen", ist dies möglicherweise nicht das ideale Verhalten, und Sie sollten sie daher auf false
".
Erstellen der Datei UIContextualAction
Die Kontextaktion ist der Ort, an dem Sie tatsächlich die Aktion erstellen, die angezeigt wird, wenn der Benutzer eine Tabellenzeile streift.
Zum Initialisieren einer Aktion müssen Sie einen UIContextualActionStyle
, einen Titel und einen UIContextualActionHandler
. Dies UIContextualActionHandler
führt drei Parameter aus: eine Aktion, die Ansicht, in der die Aktion angezeigt wurde, und einen Abschlusshandler:
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;
}
Verschiedene visuelle Eigenschaften, z. B. die Hintergrundfarbe oder das Bild der Aktion, können bearbeitet werden. Der obige Codeausschnitt veranschaulicht das Hinzufügen eines Bilds zur Aktion und festlegen dessen Hintergrundfarbe auf Blau.
Nachdem die kontextbezogenen Aktionen erstellt wurden, können sie die in der GetLeadingSwipeActionsConfiguration
Methode initialisierenUISwipeActionsConfiguration
.
UITableViewRowAction
Um eine oder mehrere benutzerdefinierte Zeilenaktionen für ein UITableView
Objekt zu definieren, müssen Sie eine Instanz der UITableViewDelegate
Klasse erstellen und die EditActionsForRow
Methode außer Kraft setzen. Zum Beispiel:
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
}
}
Die statische UITableViewRowAction.Create
Methode wird verwendet, um eine neue UITableViewRowAction
Zu erstellen, die eine Hi-Schaltfläche anzeigt, wenn der Benutzer horizontal in einer Zeile in der Tabelle nach links wischt. Später wird eine neue Instanz der TableDelegate
wird erstellt und an die UITableView
angefügt. Zum Beispiel:
TableDelegate tableDelegate;
...
// Replace the standard delete button with a "Hi" button
tableDelegate = new TableDelegate ();
table.Delegate = tableDelegate;
Wenn der obige Code ausgeführt wird und der Benutzer in einer Tabellenzeile nach links wischen, wird die Schaltfläche "Hallo " anstelle der Schaltfläche "Löschen " angezeigt, die standardmäßig angezeigt wird:
Wenn der Benutzer auf die Schaltfläche "Hi" tippt, wird er in Visual Studio für Mac oder Visual Studio in die Konsole geschrieben, Hello World!
wenn die Anwendung im Debugmodus ausgeführt wird.