由于初始化程序,无法在另一个 class 中调用函数
Can't Call function in another class due to initialiser
我正在尝试从我的 MainClass class 调用 TheTimer class 的函数。但是,在 TheTimer class 中有一个必需的 init,当我尝试从 TheTimer class 调用 Start 函数时(我从 MainClass class 调用它) 它抛出错误:调用
中参数 'coder' 缺少参数
TheTimer class 负责我故事板中的 UIView。
定时器:
class TheTimer: UIView {
var timeLabel: UILabel
required init?(coder aDecoder: NSCoder) {
timeLabel = UILabel()
super.init(coder: aDecoder)
let viewWidth = self.frame.size.width
let viewHeight = self.frame.size.height
timeLabel.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
timeLabel.text = "0"
timeLabel.font = UIFont(name: "Arial", size: 45)
timeLabel.textAlignment = NSTextAlignment.center
self.addSubview(timeLabel)
}
//MARK: Properties
var time: Double = 0.000
var timer = Timer()
func Start() {
timer = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: #selector(countUp), userInfo: nil, repeats: true)
}
@objc func countUp() {
time += 0.001
}
主要ClassClass
import UIKit
class MainClass: UIViewController {
//MARK: Properties
@IBOutlet weak var answerLabel: UILabel!
//MARK: Go
@IBAction func startAll(_ sender: UIButton) {
TheTimer().Start() //Throws error 'Missing argument for parameter 'coder' in call'
}
}
您正在调用一个您未编写的空 init() 函数。您唯一的 init 是必需的 init 并且您不匹配其参数。我建议编写第二个 init 函数,其中包含所有初始化内容。
init() {
timeLabel = UILabel()
super.init()
let viewWidth = self.frame.size.width
let viewHeight = self.frame.size.height
timeLabel.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
timeLabel.text = "0"
timeLabel.font = UIFont(name: "Arial", size: 45)
timeLabel.textAlignment = NSTextAlignment.center
self.addSubview(timeLabel)
}
然后
TheTimer().Start()
Yasin 是正确的,您必须创建另一个 init。另外,您可以将代码分离到一个单独的方法中。我不明白为什么你需要它是一个 UIView 并且有一个标签,如果你不使用这些。
init() {
timeLabel = UILabel()
super.init(frame: .zero)
setupView()
}
required init?(coder aDecoder: NSCoder) {
timeLabel = UILabel()
super.init(coder: aDecoder)
setupView()
}
func setupView() {
let viewWidth = self.frame.size.width
let viewHeight = self.frame.size.height
timeLabel.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
timeLabel.text = "0"
timeLabel.font = UIFont(name: "Arial", size: 45)
timeLabel.textAlignment = NSTextAlignment.center
self.addSubview(timeLabel)
}
在您的 MainClass
class 中,为您的 TheTimer
视图创建一个 属性,然后将故事板中的 TheTimer
与此 IBOutlet
。最后,调用 theTimer.Start()
而不是 TheTimer().Start()
import UIKit
class MainClass: UIViewController {
//MARK: Properties
@IBOutlet weak var answerLabel: UILabel!
@IBOutlet weak var theTimer: TheTimer!
//MARK: Go
@IBAction func startAll(_ sender: UIButton) {
theTimer.Start() // It will work fine
}
因为您提供了所需的初始值设定项 init?(coder aDecoder: NSCoder)
,所以默认值 convenience initializer
已经消失。所以 TheTimer() class 没有 init()
。您的错误发生在 TheTimer() 而不是 Start()。
有两种方法:
1. 调用 awakeFromNib()
中的初始化代码而不是 init?(coder aDecoder: NSCoder)
.
awakeFromNib()
将在从 Interface Builder 存档或 nib 加载视图后立即调用。
然后你应该将 var timeLabel: UILabel
更改为 var timeLabel: UILabel! or ?
因为你没有在初始化程序中初始化它。
2.自己写一个初始化器
init() {
super.init(frame: CGRect.zero) // you need to give it a frame, right?
// Your initialization code
timeLabel = UILabel()
let viewWidth = self.frame.size.width
let viewHeight = self.frame.size.height
timeLabel.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
timeLabel.text = "0"
timeLabel.font = UIFont(name: "Arial", size: 45)
timeLabel.textAlignment = NSTextAlignment.center
self.addSubview(timeLabel)
}
顺便说一句,你应该用小写命名一个函数。
Swift编程语言(Swift4):初始化
developer.apple.com
我正在尝试从我的 MainClass class 调用 TheTimer class 的函数。但是,在 TheTimer class 中有一个必需的 init,当我尝试从 TheTimer class 调用 Start 函数时(我从 MainClass class 调用它) 它抛出错误:调用
中参数 'coder' 缺少参数TheTimer class 负责我故事板中的 UIView。
定时器:
class TheTimer: UIView {
var timeLabel: UILabel
required init?(coder aDecoder: NSCoder) {
timeLabel = UILabel()
super.init(coder: aDecoder)
let viewWidth = self.frame.size.width
let viewHeight = self.frame.size.height
timeLabel.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
timeLabel.text = "0"
timeLabel.font = UIFont(name: "Arial", size: 45)
timeLabel.textAlignment = NSTextAlignment.center
self.addSubview(timeLabel)
}
//MARK: Properties
var time: Double = 0.000
var timer = Timer()
func Start() {
timer = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: #selector(countUp), userInfo: nil, repeats: true)
}
@objc func countUp() {
time += 0.001
}
主要ClassClass
import UIKit
class MainClass: UIViewController {
//MARK: Properties
@IBOutlet weak var answerLabel: UILabel!
//MARK: Go
@IBAction func startAll(_ sender: UIButton) {
TheTimer().Start() //Throws error 'Missing argument for parameter 'coder' in call'
}
}
您正在调用一个您未编写的空 init() 函数。您唯一的 init 是必需的 init 并且您不匹配其参数。我建议编写第二个 init 函数,其中包含所有初始化内容。
init() {
timeLabel = UILabel()
super.init()
let viewWidth = self.frame.size.width
let viewHeight = self.frame.size.height
timeLabel.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
timeLabel.text = "0"
timeLabel.font = UIFont(name: "Arial", size: 45)
timeLabel.textAlignment = NSTextAlignment.center
self.addSubview(timeLabel)
}
然后
TheTimer().Start()
Yasin 是正确的,您必须创建另一个 init。另外,您可以将代码分离到一个单独的方法中。我不明白为什么你需要它是一个 UIView 并且有一个标签,如果你不使用这些。
init() {
timeLabel = UILabel()
super.init(frame: .zero)
setupView()
}
required init?(coder aDecoder: NSCoder) {
timeLabel = UILabel()
super.init(coder: aDecoder)
setupView()
}
func setupView() {
let viewWidth = self.frame.size.width
let viewHeight = self.frame.size.height
timeLabel.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
timeLabel.text = "0"
timeLabel.font = UIFont(name: "Arial", size: 45)
timeLabel.textAlignment = NSTextAlignment.center
self.addSubview(timeLabel)
}
在您的 MainClass
class 中,为您的 TheTimer
视图创建一个 属性,然后将故事板中的 TheTimer
与此 IBOutlet
。最后,调用 theTimer.Start()
而不是 TheTimer().Start()
import UIKit
class MainClass: UIViewController {
//MARK: Properties
@IBOutlet weak var answerLabel: UILabel!
@IBOutlet weak var theTimer: TheTimer!
//MARK: Go
@IBAction func startAll(_ sender: UIButton) {
theTimer.Start() // It will work fine
}
因为您提供了所需的初始值设定项 init?(coder aDecoder: NSCoder)
,所以默认值 convenience initializer
已经消失。所以 TheTimer() class 没有 init()
。您的错误发生在 TheTimer() 而不是 Start()。
有两种方法:
1. 调用 awakeFromNib()
中的初始化代码而不是 init?(coder aDecoder: NSCoder)
.
awakeFromNib()
将在从 Interface Builder 存档或 nib 加载视图后立即调用。
然后你应该将 var timeLabel: UILabel
更改为 var timeLabel: UILabel! or ?
因为你没有在初始化程序中初始化它。
2.自己写一个初始化器
init() {
super.init(frame: CGRect.zero) // you need to give it a frame, right?
// Your initialization code
timeLabel = UILabel()
let viewWidth = self.frame.size.width
let viewHeight = self.frame.size.height
timeLabel.frame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
timeLabel.text = "0"
timeLabel.font = UIFont(name: "Arial", size: 45)
timeLabel.textAlignment = NSTextAlignment.center
self.addSubview(timeLabel)
}
顺便说一句,你应该用小写命名一个函数。
Swift编程语言(Swift4):初始化
developer.apple.com