从 UITextField 继承的自定义 class 在 Swift 中不起作用(使用自定义 init)
Custom class that inherits from UITextField does not work (with custom init) in Swift
所以标题说明了一切。我正在尝试创建一个明确继承自 UITextField 的 class。这是因为我想对我的 UITextFields 进行一些自定义。不过,我的主要目标是为 class 创建一个自定义初始化程序,但是,我 运行 这样做会遇到麻烦。
这是我的代码:
import UIKit
class CustomTextField: UITextField {
//Class variables
required init(coder decoder: NSCoder, other:String) {
super.init(coder: decoder)
self.layer.cornerRadius = 15
println("Instantiated")
println(other)
}
}
但是编译器抱怨:'required' initializer 'init(coder:)' must be provided by subclass of 'UITextField'
。然后我继续应用针对该问题的建议修复,它在我所需的初始化代码下方添加了以下代码:
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
我上面的代码从不打印 "Instantiated"
你能帮帮我吗?我的理想 class 会在初始化程序中至少接收另外 2 个参数(除了 coder-NSCoder 一个)。我不明白为什么我不能让它工作(也许我太习惯了 Java,这样做更容易)。
非常感谢您的提前帮助!
干杯!
如果您只是使用故事板,则不需要自定义或方便的初始值设定项,只需重写超级初始值设定项并在调用 supper 之前启动您的变量,如下面的代码所示。
import UIKit
class MyTextView: UITextView {
var myValue:Int
var myText:String
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override init(frame: CGRect, textContainer: NSTextContainer?) {
myText = String()
myValue = Int()
super.init(frame: frame, textContainer: textContainer)
}
}
如果您想以编程方式进行:
class CustomTextField: UITextField {
init(frame: CGRect, arg1: CGFloat, arg2: String) {
super.init(frame: frame)
self.layer.cornerRadius = arg1
print(arg2)
print("Instantiated")
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
required init(coder)
是强制性的,即使你不使用它。
如果您的文本字段已添加到故事板中,请不要忘记在 Identity Inspector 中将该字段的 class 更改为 CustomTextField
,您可以使用以下代码自定义一些内容:
class CustomTextField: UITextField {
override func awakeFromNib() {
super.awakeFromNib()
layer.cornerRadius = 5
layer.borderColor = UIColor.greenColor().CGColor
layer.borderWidth = 1.0
// Set other stuff like font color etc.
print("Instantiated")
}
}
所以标题说明了一切。我正在尝试创建一个明确继承自 UITextField 的 class。这是因为我想对我的 UITextFields 进行一些自定义。不过,我的主要目标是为 class 创建一个自定义初始化程序,但是,我 运行 这样做会遇到麻烦。
这是我的代码:
import UIKit
class CustomTextField: UITextField {
//Class variables
required init(coder decoder: NSCoder, other:String) {
super.init(coder: decoder)
self.layer.cornerRadius = 15
println("Instantiated")
println(other)
}
}
但是编译器抱怨:'required' initializer 'init(coder:)' must be provided by subclass of 'UITextField'
。然后我继续应用针对该问题的建议修复,它在我所需的初始化代码下方添加了以下代码:
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
我上面的代码从不打印 "Instantiated"
你能帮帮我吗?我的理想 class 会在初始化程序中至少接收另外 2 个参数(除了 coder-NSCoder 一个)。我不明白为什么我不能让它工作(也许我太习惯了 Java,这样做更容易)。
非常感谢您的提前帮助!
干杯!
如果您只是使用故事板,则不需要自定义或方便的初始值设定项,只需重写超级初始值设定项并在调用 supper 之前启动您的变量,如下面的代码所示。
import UIKit
class MyTextView: UITextView {
var myValue:Int
var myText:String
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override init(frame: CGRect, textContainer: NSTextContainer?) {
myText = String()
myValue = Int()
super.init(frame: frame, textContainer: textContainer)
}
}
如果您想以编程方式进行:
class CustomTextField: UITextField {
init(frame: CGRect, arg1: CGFloat, arg2: String) {
super.init(frame: frame)
self.layer.cornerRadius = arg1
print(arg2)
print("Instantiated")
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
required init(coder)
是强制性的,即使你不使用它。
如果您的文本字段已添加到故事板中,请不要忘记在 Identity Inspector 中将该字段的 class 更改为 CustomTextField
,您可以使用以下代码自定义一些内容:
class CustomTextField: UITextField {
override func awakeFromNib() {
super.awakeFromNib()
layer.cornerRadius = 5
layer.borderColor = UIColor.greenColor().CGColor
layer.borderWidth = 1.0
// Set other stuff like font color etc.
print("Instantiated")
}
}