Einzelnen Beitrag anzeigen

uups

Registriert seit: 23. Aug 2004
68 Beiträge
 
#1

iOS: Implementierung des Codeblocks für ein completionHandler

  Alt 30. Dez 2017, 13:32
Hallo!

Ich versuche seit Stunden vergeblich eine Delphi-Methode zu imlementieren, die anstelle eines Objective-C Codeblocks eingesetzt werden soll. Ich habe bereits mehrere Codeblocks erfolgreich durch die Klassenmethoden ersetz, was aktuell auch die einzige Möglichkeit sein soll. Das Problem bei diesem Codeblock ist, dass der er einen weiteren Codeblock als Übergabeparameter hat. Schlimmer noch: wenn man sich den Beispielcode im Xcode anschaut, wird dieser Codeblock-Parameter niemals ausgeführt sondern getrosst eine Boolean-Variable sein könnte, mit der man der API den Erfolg oder Misserfolg der Codeblock-Aktion mitteilt.

Ganz konkret geht es bei der ganzen Angelegenheit um den Versuch, die UITableView durch s.g. Swipe-Actions zu ergänzen, die seit iOS 11 verfügbar sind. Die Swipe-Actions geben dem Entwickler die Möglichkeit, einer UITableViewCell neben "Löschen" andere Bearbeitungsaktionen hinzuzufügen. Diese werden dann angzeigt, wenn man eine UITableViewCell nach recht oder links "wischt". Wir alle kennen das von diversen Apps wie Mail- oder Messaging-Clients. Hier ein kurzen Video (zwar ein Swift-Beispiel, aber im Prinzip dasselbe) wie das ganze aussueht: https://www.youtube.com/watch?v=wUVfE8cY2Hw .

Hier die Apple-Dokumentation der neuen Methoden:
https://developer.apple.com/document...?language=objc
https://developer.apple.com/document...?language=objc

Und hier ist die Definitions des o.g. Codeblocks:
https://developer.apple.com/document...?language=objc


Ich muss sagen, es hat bei mir eigentlich ganz gut geklappt das Ganze umzusetzen - bis auf diesen Codeblock-Parameter. Ich weis einfach nicht wohin damin. Und dieser ist offenbar sehr wichtig, denn: die UITableViewCell wird visuell nicht in den ursprünglichen Zustand (vor dem Wischen) versetzt, wenn man den Codeblock-Parameter weglässt. Beispielsweise beim Löschen ist es sehr wichtig, dass die Löschen-Animation der UITableViewCell angezeigt wird, wodurch dem Benutzer signalisiert wird, dass der Eintrag gelöscht wurde. Kurz gesagt: erst mit Übergabe dieses Codeblock-Parameters wird die Aktion sauber ausgeführt und visuell korrekt dargetellt.

So habe ich es umgesetzt:

Delphi-Quellcode:
{UIContextualAction}
const
  UIContextualActionStyleNormal = 0;
  UIContextualActionStyleDestructive = 1;

type
  UIContextualActionStyle = integer;
  UIContextualAction = interface;

  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>);
Es fehlt mir nun die richtige Definition des UIContextualCompletionHandler, der als Codeblock-Parameter dienen soll.
Und ich habe keine Ahnung, wie ich diesen definiere.
Danke!
  Mit Zitat antworten Zitat