由于初始化程序,无法在另一个 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