"unrecognized selector sent to instance" swift 中的错误
"unrecognized selector sent to instance" error in swift
我正在创建一个秒表,所以我创建了一个按钮并添加了一个启动秒表的动作,但是一旦它被调用,我就收到了这个错误:
2020-05-13 19:46:02.543555+1000 Timer Pro[27206:2613795] -[Timer_Pro.Stopwatch2ViewController updateStopwatch]: unrecognized selector sent to instance 0x7fb4d7425390
(lldb)
我正在做的是在我的秒表中包含分钟、秒和分数,它从 0 开始。分数每 0.01 秒上升一次,在 99 时它在秒上加一并重置分数,并且当秒数达到 59 时,它会重置并在分钟数上加一。我有一个圈数 table,当按下圈数按钮时,它会将时间放在圈数 table 上。在我的 UI 上,我有一个开始按钮,当按下它时会变成停止按钮,在 stop/start 按钮旁边我有一个膝上按钮,当按下它时会变成重置按钮。我在名为 stop.png、start.png、reset.png 和 lap.png 的文件中有 4 个按钮。这是我的代码:
import UIKit
class Stopwatch2ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var timer = Timer()
var minutes: Int = 0
var seconds: Int = 0
var fractions: Int = 0
var stopWatchString: String = ""
var startStopWatch: Bool = true
var addLap: Bool = false
@IBOutlet weak var stopwatchLabel: UILabel!
@IBOutlet weak var lapsTableView: UITableView!
@IBOutlet weak var startstopButton: UIButton!
@IBOutlet weak var lapresetButton: UIButton!
@IBAction func startStop(_ sender: Any) {
if startStopWatch == true {
timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: Selector(("updateStopwatch")), userInfo: nil, repeats: true)
startStopWatch = false
startstopButton.setImage(UIImage(named: "stop.pnng"), for: UIControl.State.normal)
lapresetButton.setImage(UIImage(named: "lap.png"), for: UIControl.State.normal)
addLap = true
}else {
timer.invalidate()
startStopWatch = true
startstopButton.setImage(UIImage(named: "start.png"), for: .normal)
lapresetButton.setImage(UIImage(named: "reset.png"), for: .normal)
addLap = false
}
}
@IBAction func lapReset(_ sender: Any) {
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
stopwatchLabel.text = "00:00.00"
}
func updateStopWatch() {
fractions += 1
if fractions == 100 {
seconds += 1
fractions = 0
}
if seconds == 60 {
minutes += 1
seconds = 0
}
let fractionsString = fractions > 9 ? "\(fractions)" : "0\(fractions)"
let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)"
let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)"
stopWatchString = "\(minutesString):\(secondsString).\(fractionsString)"
stopwatchLabel.text = stopWatchString
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCell.CellStyle.value1, reuseIdentifier: "Cell")
cell.backgroundColor = self.view.backgroundColor
cell.textLabel?.text = "Lap"
cell.detailTextLabel?.text = "00:00:00"
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
}
如果有人能帮助我,我将不胜感激,因为我是初学者,这个错误让我几个月来一直熬夜。
您正在创建 Selector("updateStopwatch")
,但您的方法名为 func updateStopWatch()
。
改用#selector(self.updateStopWatch)
,这只允许您在实际存在的方法上创建选择器。
还要确保选择器引用的方法必须对 Objective-C 运行时可见,因此您需要将它们标记为 @objc
。
我正在创建一个秒表,所以我创建了一个按钮并添加了一个启动秒表的动作,但是一旦它被调用,我就收到了这个错误:
2020-05-13 19:46:02.543555+1000 Timer Pro[27206:2613795] -[Timer_Pro.Stopwatch2ViewController updateStopwatch]: unrecognized selector sent to instance 0x7fb4d7425390
(lldb)
我正在做的是在我的秒表中包含分钟、秒和分数,它从 0 开始。分数每 0.01 秒上升一次,在 99 时它在秒上加一并重置分数,并且当秒数达到 59 时,它会重置并在分钟数上加一。我有一个圈数 table,当按下圈数按钮时,它会将时间放在圈数 table 上。在我的 UI 上,我有一个开始按钮,当按下它时会变成停止按钮,在 stop/start 按钮旁边我有一个膝上按钮,当按下它时会变成重置按钮。我在名为 stop.png、start.png、reset.png 和 lap.png 的文件中有 4 个按钮。这是我的代码:
import UIKit
class Stopwatch2ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var timer = Timer()
var minutes: Int = 0
var seconds: Int = 0
var fractions: Int = 0
var stopWatchString: String = ""
var startStopWatch: Bool = true
var addLap: Bool = false
@IBOutlet weak var stopwatchLabel: UILabel!
@IBOutlet weak var lapsTableView: UITableView!
@IBOutlet weak var startstopButton: UIButton!
@IBOutlet weak var lapresetButton: UIButton!
@IBAction func startStop(_ sender: Any) {
if startStopWatch == true {
timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: Selector(("updateStopwatch")), userInfo: nil, repeats: true)
startStopWatch = false
startstopButton.setImage(UIImage(named: "stop.pnng"), for: UIControl.State.normal)
lapresetButton.setImage(UIImage(named: "lap.png"), for: UIControl.State.normal)
addLap = true
}else {
timer.invalidate()
startStopWatch = true
startstopButton.setImage(UIImage(named: "start.png"), for: .normal)
lapresetButton.setImage(UIImage(named: "reset.png"), for: .normal)
addLap = false
}
}
@IBAction func lapReset(_ sender: Any) {
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
stopwatchLabel.text = "00:00.00"
}
func updateStopWatch() {
fractions += 1
if fractions == 100 {
seconds += 1
fractions = 0
}
if seconds == 60 {
minutes += 1
seconds = 0
}
let fractionsString = fractions > 9 ? "\(fractions)" : "0\(fractions)"
let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)"
let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)"
stopWatchString = "\(minutesString):\(secondsString).\(fractionsString)"
stopwatchLabel.text = stopWatchString
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCell.CellStyle.value1, reuseIdentifier: "Cell")
cell.backgroundColor = self.view.backgroundColor
cell.textLabel?.text = "Lap"
cell.detailTextLabel?.text = "00:00:00"
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
}
如果有人能帮助我,我将不胜感激,因为我是初学者,这个错误让我几个月来一直熬夜。
您正在创建 Selector("updateStopwatch")
,但您的方法名为 func updateStopWatch()
。
改用#selector(self.updateStopWatch)
,这只允许您在实际存在的方法上创建选择器。
还要确保选择器引用的方法必须对 Objective-C 运行时可见,因此您需要将它们标记为 @objc
。