Warum kann ich die Geschwindigkeit eines GKAgent2D in iOS9 nicht einstellen?

9

Wenn ich versuche, den Wert des Geschwindigkeitsparameters eines GKAgent2D (oder seiner Elternklasse GKAgent) in iOS9 zu ändern, bekomme ich diesen unerkannten Selektorfehler:

  

*** Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: '- [GKAgent2D setSpeed:]: nicht erkannter Selektor an Instanz gesendet

In iOS10 tritt dieser Fehler jedoch nicht auf und die Geschwindigkeit des Agenten wird korrekt geändert.

Ich kann den Fehler in einem sehr einfachen Beispiel reproduzieren (Einzelansicht iOS-Anwendung, ändern Sie die Ansicht Controller-Code in den folgenden, beachten Sie, dass der Fehler auftritt entweder mit GKAgent2D oder GKAgent):

%Vor%

Das obige stürzt immer mit diesem nicht erkannten Selektorfehler in der Zeile ab, die die Geschwindigkeit des Agenten auf dem Simulator mit iOS9.3, aber nicht iOS10.3 (alles unter Xcode 8.3.2) festlegt.

Die Geschwindigkeitseigenschaft von GKAgent ist als Lesen und Schreiben dokumentiert und wird unter iOS9 unterstützt - siehe Apple's Documentation für GKAgent, Geschwindigkeit Eigentum .

Ich hatte ein ähnliches Problem mit GKAgentDelegate, das auf iOS9 nur mit einem unerkannten Selektor auf agentWillUpdate abstürzen würde. Ich habe daran gearbeitet, indem ich eine Dummy-Methode in meinen Code eingefügt habe:

%Vor%

Ich habe eine ähnliche Lösung für den neuen Fehler versucht, indem ich die Eigenschaft speed in meiner Unterklasse GKAgent2D überschrieben und einen expliziten Setter und Getter bereitgestellt habe, und sogar den Geschwindigkeitsparameter durch einen privaten Float unterstützt, wie von Kdawg vorgeschlagen, aber derselbe Fehler tritt immer noch auf, wenn der Geschwindigkeitsparameter des Super eingestellt ist:

%Vor%

Irgendwelche Gedanken?

Konkret: Gibt es bekannte Probleme mit GKAgent in iOS9 bezüglich Selektoren?

Alternativ, irgendwelche Gedanken über eine Alternative funktionieren?

Ich würde gerne iOS9 unterstützen, wenn ich kann. Es sieht für mich wie ein Fehler in GameplayKit aus - aber ich erwarte, dass Apples Antwort auf einen Bericht wäre, dass es in iOS10 behoben ist.

    
Ali Beadle 08.07.2017, 20:22
quelle

1 Antwort

2

Bearbeitet

Was ich damit meinte, war, dass die Eigenschaft setter / getter der Unterklasse die Basisklassen überschreibt und nicht versucht, überhaupt auf den Setter der Elternklasse zuzugreifen:

%Vor%

Wenn an dieser Stelle angenommen wird, dass GKAgent und GKAgent2d auf speed über ihren Eigenschaften-Getter zugreifen, erhält sie den Wert von _speed vom überschriebenen Getter in Ihrer Unterklasse. Deshalb habe ich in den Kommentaren vorgeschlagen, dies zu versuchen, nachdem ich diese Unterklasse gemacht habe:

%Vor%

Ich würde dann erwarten, dass, wenn Sie dann versuchen würden, die Eigenschaft Ihres Agenten GKAgent auszulesen, es 10 wäre. Und so könnte das erwartete Verhalten Ihres Agenten mit Ihrer Geschwindigkeit dort richtig funktionieren.

Original Dies ist nur eine Gesamtschätzung (ich bin nicht wirklich mit den Technologien hier vertraut), aber hast du versucht, dein

zu ändern %Vor%

um nicht super.speed oder self.speed zu referenzieren (sollte self.speed nicht aus Ihrem speed setter-Ergebnis in einem unendlichen rekursiven Aufruf an diesen Setter gesetzt werden?), sondern um einen privaten Gleitkommawert zu referenzieren ? Dann können Sie vielleicht ein Objekt vom Typ GKAgent2dSubClass instanziieren (wie auch immer Sie diese Unterklasse benannt haben) und es funktionieren lassen.

    
Kdawg 22.07.2017, 01:41
quelle

Tags und Links