Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS ObjectiveC -> XE4 Nachhilfe gesucht... (https://www.delphipraxis.net/176240-objectivec-xe4-nachhilfe-gesucht.html)

Mavarik 21. Aug 2013 13:30

ObjectiveC -> XE4 Nachhilfe gesucht...
 
Hallo Zusammen!

Ich beschäftige mich gerade mit dem MapKit...

Hier ist die Definition:

Delphi-Quellcode:
function TMyDelegate.mapView(mapView: MKMapView;viewForAnnotation: MKAnnotation): MKAnnotationView;

Dieser Delegate function wird von iOS aber mit zwei verschiedene Typen übergeben...

einmal

Delphi-Quellcode:
MKUserLocation = interface(NSObject)
und

Delphi-Quellcode:
MKAnnotation = interface(IObjectiveC)

Innerhalb der o.g. Function muss nun abgetestet werden, nach welchem der beiden Interfaceobjecten gefragt ist...

Leider läßt sich

Delphi-Quellcode:
  if viewForAnnotation is MKUserLocation then // <- Compilerfehler
    begin
      result := NIL;
      exit;
    end;
nicht kompilieren...

Wie muss man das schreiben?

Grüsse Mavarik

TiGü 21. Aug 2013 14:45

AW: ObjectiveC -> XE4 Nachhilfe gesucht...
 
Was kommt denn für ein Compilerfehler?

Geht folgendes?
Delphi-Quellcode:
  if Supports(viewForAnnotation, MKUserLocation) then
    begin
      result := NIL;
      exit;
    end;

Mavarik 21. Aug 2013 15:01

AW: ObjectiveC -> XE4 Nachhilfe gesucht...
 
Zitat:

Zitat von TiGü (Beitrag 1225694)
Was kommt denn für ein Compilerfehler?

Geht folgendes?
Delphi-Quellcode:
  if Supports(viewForAnnotation, MKUserLocation) then
    begin
      result := NIL;
      exit;
    end;

Supports kennt "er" nicht...

Daniel 21. Aug 2013 15:08

AW: ObjectiveC -> XE4 Nachhilfe gesucht...
 
Dann bring es ihm doch bei. ;-)

http://docwiki.embarcadero.com/Libra...Utils.Supports

mkinzler 21. Aug 2013 15:13

AW: ObjectiveC -> XE4 Nachhilfe gesucht...
 
Supports überprüft, ob ein Objekt ein Interface implementiert, man müsste also die Instanz noch mit angeben.

Delphi-Quellcode:
if Supports( <Instanz>, viewForAnnotation, MKUserLocation) then

jensw_2000 21. Aug 2013 15:24

AW: ObjectiveC -> XE4 Nachhilfe gesucht...
 
Ich bin gerade noch unterwegs und kann nicht nachschauen.

Ins Blaue getippt würde ich sagen, dass es eine Instanzmethode Names "performsToSelector" geben müsste.

Diese Methode gibt True (YES) zurück, wenn das Objekt eine bestimmte Methode unterstützt.

Sorry, geht gerade nicht genauer.
Ich schaue nochmal nach, wenn ich zurück bin.

TiGü 21. Aug 2013 15:28

AW: ObjectiveC -> XE4 Nachhilfe gesucht...
 
Zitat:

Zitat von mkinzler (Beitrag 1225699)
Supports überprüft, ob ein Objekt ein Interface implementiert, man müsste also die Instanz noch mit angeben.

Delphi-Quellcode:
if Supports( <Instanz>, viewForAnnotation, MKUserLocation) then

Nö, gibt es auch so:
Delphi-Quellcode:
function Supports(const Instance: IInterface; const IID: TGUID): Boolean;
function Supports(const Instance: TObject; const IID: TGUID): Boolean;
function Supports(const AClass: TClass; const IID: TGUID): Boolean;
Siehe emba wiki link von Daniel!
viewForAnnotation scheint ja schon die Instanzvariable zu sein?!

mkinzler 21. Aug 2013 15:30

AW: ObjectiveC -> XE4 Nachhilfe gesucht...
 
Ich kannte nur die Versionen mit Klasse oder Instanz.
Daniels Antwort wurde bei mir unterschlagen, sonst hätte ich es (vielleicht) selber gesehen ;)

Mavarik 21. Aug 2013 15:38

AW: ObjectiveC -> XE4 Nachhilfe gesucht...
 
Danke... Drecks Hilfe, hat Supports nicht gefunden...

Compilieren läßt es sich, funktioniert aber nicht...

Noch ne Idee?

Mavarik

jensw_2000 21. Aug 2013 20:29

AW: ObjectiveC -> XE4 Nachhilfe gesucht...
 
Die Klasse "MKAnnotation" hat eine Methode namens "setCoordinate".

Die Klasse "MKUserLocation" ist eine Subclass von "MKAnnotation".
Sie kann die Methode "setCoordinate" der Basisklasse nutzen, hat aber selbst keine Methode "setCoordinate" deklariert.

Die NSObject Klassenmethode "respondsToSelector" prüft, ob eine Klasse eine bestimmte Methode unterstützt (ohne dabei durch die Vererbung zu wandern).

Dein "viewForAnnotation" ist von NSObject abgeleitet, kennt also die Methode "respondsToSelector".

Du brauchst also einfach nur zu prüfen, ob
Code:
viewForAnnotation.respondsToSelector(selector(setCoordinate:))
True oder False zurückgibt.

Die Funktion Selector() liegt im Cocoa Foundation Framework.

Wenn True, dann "MKAnnotation" sonst "MKUserLocation".


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr.
Seite 1 von 2  1 2      

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