在最近更新到Xcode 8.3之前,我的代码正在按预期方式运行和运行。现在,我的代码无法运行,并出现以下错误:“类型GameScene没有成员:updateCounting”。我已经阅读了类似的问题和解决方案,但没有一个能够帮助解决该问题。我仍在学习迅速,因此将不胜感激。
这是我的代码:
let highScoreDefault = UserDefaults.standard
highScore = highScoreDefault.integer(forKey: "Highscore")
highScoreLabel.text = "\(highScore)"
func scoreUpdate(_ currentTime: CFTimeInterval){
if (score > highScore) {
highScore = score
highScoreLabel.text = NSString(format: "Highscore : %i", highScore) as String
let highscoreDefault = UserDefaults.standard
highscoreDefault.setValue(highScore, forKey: "Highscore")
highscoreDefault.synchronize()
}
}
func updateCounting() {
scoreLabel.text = String(self.score)
finalScore.text = String(self.score)
let highScoreDefault = UserDefaults.standard
highScore = highScoreDefault.integer(forKey: " ")
highScoreLabel.text = "\(highScore)"
if (score > highScore) {
highScore = score
highScoreLabel.text = NSString(format: " %i", highScore) as String
let highscoreDefault = UserDefaults.standard
highscoreDefault.setValue(highScore, forKey: " ")
highscoreDefault.synchronize()
}
self.score += 1
print(score, terminator: " ")
}
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(GameScene.updateCounting), userInfo: nil, repeats: true)
// The above line of code is what's giving the error
totalCoins = UserDefaults.standard.integer(forKey: "Total Coins")
totalCoinLabel.text = "\(totalCoins)"
最佳答案
建议的解决方案
尝试在函数名称之前添加@objc,如下所示:
@objc func updateCounting() {
// function code here
}
然后使用
#selector(self.updateCounting)
工作实例
我接受了您的代码,并对其进行了大幅简化。我从一个新的Single View项目开始。我添加了GameScene.swift文件并修改了ViewController类。请参见下面的代码。运行项目,您将看到日志显示:
Updating count: 0
Updating count: 1
Updating count: 2
Updating count: 3
GameScene.swift
import Foundation
class GameScene {
var timer: Timer = Timer()
var counter: Int = 0
@objc func updateCounting(){
print("Updating count: \(counter)")
counter += 1
}
func updateTimer() {
timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(updateCounting), userInfo: nil, repeats: true)
}
}
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let game = GameScene()
game.updateTimer()
}
}
Github链接:https://github.com/starkindustries/TimerTestProject
有效的语法选项
以下选项在此示例项目中成功测试:
selector: #selector(updateCounting)
selector: #selector(self.updateCounting)
selector: #selector(GameScene.updateCounting)
假设您要向updateCounting函数添加参数。将您的updateCounting方法名称更改为
@objc func updateCounting(_ timer: Timer)
,并将选择器更改为selector: #selector(updateCounting(_:)
语法讨论
一旦删除
@objc
,编译器就会显示此错误:“ #selector”的参数引用实例方法“ updateCounting”
没有暴露于Objective-C
另一个答案中的评论之一也暗示了这一点:
我需要添加编写目标函数,如下所示:@objc func
更新时间() {}
Timer.scheduledTimer swift 3 pre iOS 10 compatibility
苹果文档指出:
选择器应具有以下签名:timer.fire方法:
(包括表示该方法采用参数的冒号)。的
计时器将自身作为参数传递,因此该方法将采用
以下模式:
-(void)timerFireMethod:(NSTimer *)timer https://developer.apple.com/reference/foundation/timer/1412416-scheduledtimer
即使我在文档的Swift版本中,它也显示了TimerFireMethod的Objective C版本。因此,也许Timer类期望使用Objective C选择器,就像抱怨的编译器错误一样。但是,文档指出该方法应该具有一个参数(计时器),但是我只是使用没有参数的函数成功地对其进行了测试。
关于ios - 刚升级到Xcode 8.3,现在出现错误:“Type GameScene没有成员:updateCounting”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43151262/