AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung iOS iOS: Implementierung des Codeblocks für ein completionHandler
Thema durchsuchen
Ansicht
Themen-Optionen

iOS: Implementierung des Codeblocks für ein completionHandler

Ein Thema von uups · begonnen am 30. Dez 2017 · letzter Beitrag vom 16. Jan 2018
Antwort Antwort
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
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#2

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

  Alt 30. Dez 2017, 14:08
https://github.com/gmurt/KernowSoftw...tion%20Buttons

Indirekte Antwort:
ich glaube das was du erreichen willst gibt es bereits, unabhängig von IOS11
  Mit Zitat antworten Zitat
uups

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

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

  Alt 30. Dez 2017, 15:28
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!
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#4

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

  Alt 30. Dez 2017, 21:37
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!
  Mit Zitat antworten Zitat
uups

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

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

  Alt 30. Dez 2017, 22:49
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.
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.166 Beiträge
 
Delphi 10 Seattle Professional
 
#6

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

  Alt 31. Dez 2017, 13:46
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.
  Mit Zitat antworten Zitat
uups

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

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

  Alt 3. Jan 2018, 14:32
Hat keiner eine Idee?
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#8

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

  Alt 3. Jan 2018, 20:26
..."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
  Mit Zitat antworten Zitat
uups

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

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

  Alt 16. Jan 2018, 20:25
@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.

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".

Geändert von uups (16. Jan 2018 um 20:28 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:08 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