簡體   English   中英

為什么我不能在iOS9中設置GKAgent2D的速度?

[英]Why can't I set the speed of a GKAgent2D in iOS9?

如果我嘗試在iOS9中更改GKAgent2D(或其父類GKAgent)的speed參數值,我會收到此無法識別的選擇器錯誤:

***由於未捕獲的異常'NSInvalidArgumentException'終止應用程序,原因:' - [GKAgent2D setSpeed:]:發送到實例的無法識別的選擇器

但是在iOS10中,不會發生此錯誤,並且正確更改代理的速度。

我可以在一個非常簡單的示例中重現錯誤(單視圖iOS應用程序,將視圖控制器代碼更改為以下內容,請注意GKAgent2D或GKAgent發生錯誤):

import UIKit
import GameplayKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var agent = GKAgent()
        agent.speed = 10

        print(agent.speed)
    }

}

上面總是在線路上發生這種無法識別的選擇器錯誤而崩潰,該線路在運行iOS9.3的模擬器上設置代理的速度,而不是iOS10.3(所有這些都在Xcode 8.3.2下)。

GKAgent的速度屬性記錄為在iOS9下讀寫並受支持 - 請參閱Apple的GKAgent文檔,speed屬性

我在GKAgentDelegate遇到了類似的問題,只有使用無法識別的agentWillUpdate選擇器才能在iOS9上崩潰。 我通過在我的代碼中放入一個虛擬方法來解決這個問題:

func agentWillUpdate(_ agent: GKAgent) {
}

我嘗試了一個類似的新錯誤解決方案,通過覆蓋我的GKAgent2D子類中的speed屬性並提供顯式的setter和getter,甚至按照Kdawg建議的私有Float支持speed參數,但仍然會出現相同的錯誤當超級速度參數設置時:

class Agent:GKAgent2D {
    override var speed:Float {
        get {return localSpeed}
        set {localSpeed = newValue}
    }
    private var localSpeed:Float {
        get {return super.speed}
        set {super.speed = newValue}
    }
}

有什么想法嗎?

具體來說:iOS9中關於選擇器的GKAgent是否存在任何已知問題?

或者,對替代工作的任何想法?

如果可以,我想支持iOS9。 它看起來像是GameplayKit中的一個錯誤 - 但我希望Apple對報告的回應是它在iOS10中得到修復。

編輯

我的意思是讓您的子類的屬性setter / getter覆蓋基類,而不是嘗試訪問父類的setter,如下所示:

class Agent:GKAgent2D {
    private var _speed: Float = 0.0 
    override var speed:Float {
        get {return _speed}
        set {_speed = newValue}
    }
}

此時,假設GKAgentGKAgent2d通過其屬性getter訪問speed ,它將從子類中重寫的getter獲取_speed的值。 這就是為什么我在評論中建議在制作該子類之后嘗試這個:

var agent: GKAgent 
agent = GKAgent2dSubType()
agent.speed = 10

我希望如果你然后嘗試讀出你的GKAgent代理的屬性,它將是10.所以你的代理的預期行為可能會適應你的速度。


原創這只是一個完全的猜測(我對這里的技術並不熟悉),但是你試過改變你的

override var speed:Float {
    get {return super.speed}
    set {self.speed = newValue}
}

不引用super.speedself.speed (順便說一句,不應該從你的speed設置器中設置self.speed導致對該setter的無限遞歸調用?)而是引用私有后備浮點值? 那么也許你將能夠實例化一個GKAgent2dSubClass類型的對象(但是你已經命名了那個子類)並讓它工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM