Тип 'GameScene' не имеет члена 'handleTap (tapGesture :)' - PullRequest
0 голосов
/ 26 мая 2018

Я работал над приложением с XCode (в версии 9.3.1) и использовал Coding iPhone Apps для детей (https://nostarch.com/iphoneappsforkids/)) в качестве руководства, чтобы научиться создавать игры, такие как игра скейтбордиста, котораяначинается в главе 14.

Я следовал коду, однако столкнулся с ошибкой при использовании handleTap (tapGesture :).

      override func didMove(to view: SKView) {
    physicsWorld.gravity = CGVector(dx: 0.0, dy: -6.0)
    physicsWorld.contactDelegate = self

    anchorPoint = CGPoint.zero

    let background = SKSpriteNode(imageNamed: "background")
    let xMid = frame.midX
    let yMid = frame.midY
    background.position = CGPoint(x: xMid, y: yMid)
    addChild(background)

    setupLabels()

    // Set up the player and add her to the scene
    player.setupPhysicsBody()
    addChild(player)

    // Add a tap gesture recognizer to know when the user tapped the screen
    let tapMethod = #selector(GameScene.handleTap(tapGesture:))
    let tapGesture = UITapGestureRecognizer(target: self, action: tapMethod)
    view.addGestureRecognizer(tapGesture)

    // Add a menu overlay with "Tap to play" text
    let menuBackgroundColor = UIColor.black.withAlphaComponent(0.4)
    let menuLayer = MenuLayer(color: menuBackgroundColor, size: frame.size)
    menuLayer.anchorPoint = CGPoint(x: 0.0, y: 0.0)
    menuLayer.position = CGPoint(x: 0.0, y: 0.0)
    menuLayer.zPosition = 30
    menuLayer.name = "menuLayer"
    menuLayer.display(message: "Tap to play", score: nil)
    addChild(menuLayer)
}

Выдает ошибку в

    let tapMethod = #selector(GameScene.handleTap(tapGesture:))

Однако, дальше, у меня есть этот код.

     func handleTap(tapGesture: UITapGestureRecognizer) {

        if gameState == .running {

            // Make the player jump if player taps while she is on the ground
            if player.isOnGround {

                player.physicsBody?.applyImpulse(CGVector(dx: 0.0, dy: 260.0))

                run(SKAction.playSoundFileNamed("jump.wav", waitForCompletion: false))
            }
        }
        else {

            // If the game is not running, tapping starts a new game
            if let menuLayer: SKSpriteNode = childNode(withName: "menuLayer") as? SKSpriteNode {

                menuLayer.removeFromParent()
            }

            startGame()
        }
    }

Несмотря на то, что у меня есть handleTap в методе обновления, ошибка не будет удалена сама.

Если у вас естьрешение кода ошибки в заголовке, пожалуйста, дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Согласно документам ,

В Objective-C селектор - это тип, который ссылается на имя метода Objective-C.В Swift селекторы Objective-C представлены структурой Selector и могут быть построены с использованием выражения #selector.Чтобы создать селектор для метода, который можно вызывать из Objective-C, передайте имя метода

Таким образом, мы должны предоставить элемент obj-c, пометив его как @objc

@objc func handleTap(_ tapGesture: UITapGestureRecognizer) {}

За дополнительной информацией обращайтесь: Как мне справиться с устареванием @objc с #selector () в Swift 4?

0 голосов
/ 26 мая 2018

Изменить селектор и подпись на это

let tapMethod = #selector(GameScene.handleTap(_:))

//

@objc func handleTap(_ tapGesture: UITapGestureRecognizer) {}
...