The iOS 11 SDK introduces two new UITableView methods for handling swipe actions:
- leadingSwipeActionsConfigurationForRowAtIndexPath
- trailingSwipeActionsConfigurationForRowAtIndexPath
Objective-C:
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
The swipe actions are based on the new class UIContextualAction:
@class UIContextualAction;
// call the completionHandler to reset the context to its normal state (e.g. when swiping, resets to unswiped state)
// pass YES to the completionHandler if the action was actually performed, to show a visual indication of the successful completion
typedef void (^UIContextualActionHandler)(UIContextualAction *action, __kindof UIView *sourceView, void(^completionHandler)(BOOL actionPerformed));
typedef NS_ENUM(NSInteger, UIContextualActionStyle) {
UIContextualActionStyleNormal,
UIContextualActionStyleDestructive
} NS_SWIFT_NAME(UIContextualAction.Style) API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
UIKIT_EXTERN API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos)
@interface UIContextualAction : NSObject
+ (instancetype)contextualActionWithStyle:(UIContextualActionStyle)style title:(nullable NSString *)title handler:(UIContextualActionHandler)handler;
@property (nonatomic, readonly) UIContextualActionStyle style;
@property (nonatomic, copy, readonly) UIContextualActionHandler handler;
@property (nonatomic, copy, nullable) NSString *title;
@property (nonatomic, copy, nullable) UIColor *backgroundColor; // a default background color is set from the action style
@property (nonatomic, copy, nullable) UIImage *image;
@end
I'v tried to "translate" it to Delphi like this:
{UIContextualAction}
const
UIContextualActionStyleNormal = 0;
UIContextualActionStyleDestructive = 1;
type
UIContextualAction = interface;
UIContextualActionStyle = integer;
UIContextualCompletionHandler = ???? // <------------------------
UIContextualActionHandler = procedure(action: UIContextualAction; sourceView: UIView; completionHandler: UIContextualCompletionHandler) of object;
UIContextualActionClass = interface(NSObjectClass)
['{F341A178-2950-4D0A-9EF2-DCDEAB76FF81}']
function contextualActionWithStyle(style: UIContextualActionStyle; title: NSString; handler: UIContextualActionHandler): Pointer; cdecl;
end;
UIContextualAction = interface(NSObject)
['{C5B4CB53-0655-41FA-B48E-D4FB0E9A54FB}']
function title: NSString; cdecl;
function backgroundColor: UIColor; cdecl;
function image: UIImage; cdecl;
procedure setTitle(title: NSString); cdecl;
procedure setBackgroundColor(backgroundColor: UIColor); cdecl;
procedure setImage(image: UIImage); cdecl;
end;
TUIContextualAction = class(TOCGenericImport<UIContextualActionClass, UIContextualAction>);
Each UIContextualAction gets assigned a pointer to code block (UIContextualActionHandler). This code block gets another code block (completionHandler), passed as parameter. This parameter code block is very important because it ensures the correct visual completion of the action. And exactly hier is my problem: how to define a completion code block with another code block as parameter?