Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS iOS: Implementierung des Codeblocks für ein completionHandler (https://www.delphipraxis.net/194738-ios-implementierung-des-codeblocks-fuer-ein-completionhandler.html)

uups 30. Dez 2017 12:32

iOS: Implementierung des Codeblocks für ein completionHandler
 
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!

mensch72 30. Dez 2017 13:08

AW: iOS: Implementierung des Codeblocks für ein completionHandler
 
https://github.com/gmurt/KernowSoftw...tion%20Buttons

Indirekte Antwort:
ich glaube das was du erreichen willst gibt es bereits, unabhängig von IOS11 :)

uups 30. Dez 2017 14:28

AW: iOS: Implementierung des Codeblocks für ein completionHandler
 
Zitat:

Zitat von mensch72 (Beitrag 1389878)
https://github.com/gmurt/KernowSoftw...tion%20Buttons

Indirekte Antwort:
ich glaube das was du erreichen willst gibt es bereits, unabhängig von IOS11 :)

Ja, nur leider nicht für die native UITabkeView. Trotzdem vielen Dank!

mensch72 30. Dez 2017 20:37

AW: iOS: Implementierung des Codeblocks für ein completionHandler
 
wäre schön, wenn du bei Erfolg mal ein "MiniProjekt" für deine native Variante hier zeigst...

Viele nutzen wie ich zunächst universelle "nachgezeichnete Softwarevarianten", welche unter IOS&Android funktionieren.
Nur wenn es richtig "fluffig" laufen soll, ist "native" schon besser. Bei IOS gib es ja das Zeug von DPF und TMS, für Android macht TMS nix nativ.

Wenn dich also Beispielcode für Delphi-Adapter auf natives IOS Zeug interessiert, dann schau doch mal in den DPF und TMS Sourcen nach!

uups 30. Dez 2017 21:49

AW: iOS: Implementierung des Codeblocks für ein completionHandler
 
Zitat:

Zitat von mensch72 (Beitrag 1389920)
wäre schön, wenn du bei Erfolg mal ein "MiniProjekt" für deine native Variante hier zeigst...

Sicher mache ich das. Ich muss aber sagen, dass meine Implementierung auf D.P.F basiert. Ich erweitere nur die Komponenten und versuche immer durch neusten Features zu ergänzen.

Bei iCL von TMS keine Chance. Die ist auf dem Stand von iOS 7 stehen geblieben und TMS teile auf Anfrage mit, dass die in absehbarer Zukunft keine Zeit und Ressourcen haben werden, due Suite suf den neusten Stand zu bringen.

romber 31. Dez 2017 12:46

AW: iOS: Implementierung des Codeblocks für ein completionHandler
 
Ich kenne mich nicht sehr gut mit Objective-C aus, deswegen liege ich eventuell falsch. Aber für mich scheint nur der UIContextualActionHandler ein Codeblock zu sein, in dem du deine Aktion definieren kannst. Der Parameter-Codeblock scheint ein Pointer auf eine fertige Procedure zu sein, der du nur mitteilen solltest, on deine Aktion korrekt ausgeführt wurde.

uups 3. Jan 2018 13:32

AW: iOS: Implementierung des Codeblocks für ein completionHandler
 
Hat keiner eine Idee?

mensch72 3. Jan 2018 19:26

AW: iOS: Implementierung des Codeblocks für ein completionHandler
 
..."Ja, nur leider nicht für die native UITabkeView."...
..."Hat keiner eine Idee?"...

-> scheinbar ist mit Delphi/FMX etwas als "IOS11+ only" aktuell für niemanden besonders wichtig

=> wir entwickeln alles für IOS10+, und decken damit weiter alle IPhone5 und IPad4 ab, da freuen sich aktuell bei uns noch mehr Leute, das wir per Software "simuliert" auch dort eine GUI realisieren, welche auch optisch einer IOS11 Funktionalität entspricht. Alle Geräte mit IOS11 haben genug CPU/GPU-Power um bei so einfachen GUI Kram die Nutzer gar nicht merken zu lassen, das nicht alles "native" dargestellt wird. (Und das nötige 1% mehr AkkuPower ist nix, gegen den IOS11 SlowDown für IPhones 6&7;) )

-> wenn ich wirklich was spezielles Native machen will nehme ich Xcode, mit Delphi/FMX geht es mir und allen die ich kenne um schnelle und ERGEBNISORIENTIERTE App-Entwicklungen
-> rein aus Interesse schaue ich mir gerne eine "IF IOS11 THEN native ELSE anders;" Lösung an, würde sowas aber nicht selbst real ausliefern & pflegen wollen

uups 16. Jan 2018 19:25

AW: iOS: Implementierung des Codeblocks für ein completionHandler
 
@mensch72

Das hilft mit leider nicht weiter. Habe immer noch keine Lösung. Das einzige, was mir eingefallen ist, den CompletionHandler ebenfalls als procedure of object zu deklarieren, was aber leider nichts gebracht hat.

Zitat:

Zitat von romber (Beitrag 1389958)
Ich kenne mich nicht sehr gut mit Objective-C aus, deswegen liege ich eventuell falsch. Aber für mich scheint nur der UIContextualActionHandler ein Codeblock zu sein, in dem du deine Aktion definieren kannst. Der Parameter-Codeblock scheint ein Pointer auf eine fertige Procedure zu sein, der du nur mitteilen solltest, on deine Aktion korrekt ausgeführt wurde.

Ich denke, da hat romber Recht. Denn in diversen Tutorials, die zu den Swipe-Actions im Netzt zu finden sind, scheint der completionHandler nicht überschreibbar zu sein. Man übergibt lediglich True oder False und der Rest, nämlich die visuellen Abschluß der Aktion, geschieht dann "von selbst".


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz