Ios 从UITextField继承的自定义类在Swift中不起作用(与自定义初始化一起)
所以标题说明了一切。我试图创建一个显式继承UITextField的类。这是因为我想对UITextFields进行一些自定义。不过,我的主要目标是为类创建自定义初始值设定项,但是,这样做会遇到麻烦 这是我的密码:Ios 从UITextField继承的自定义类在Swift中不起作用(与自定义初始化一起),ios,swift,inheritance,initialization,uitextfield,Ios,Swift,Inheritance,Initialization,Uitextfield,所以标题说明了一切。我试图创建一个显式继承UITextField的类。这是因为我想对UITextFields进行一些自定义。不过,我的主要目标是为类创建自定义初始值设定项,但是,这样做会遇到麻烦 这是我的密码: import UIKit class CustomTextField: UITextField { //Class variables required init(coder decoder: NSCoder, other:String) { sup
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)
}
}
但是编译器抱怨:“必需的”初始值设定项“init(coder:)”必须由“UITextField”的子类提供。
。然后,我继续应用建议的问题修复程序,它在我所需的init代码的正下方添加了以下代码:
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
我上面的代码从不打印“实例化”
你能帮我一下吗?我的理想类将在初始值设定项中接收至少另外2个参数(除了编码器NSCoder one)。我不明白为什么我不能让它工作(也许我太习惯Java了,在Java中这样做更容易)
非常感谢您事先的帮助
干杯 如果您只是使用故事板,则不需要自定义或方便的初始值设定项,只需重写超级初始值设定项并在调用super之前启动变量,如下代码所示
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中将该字段的类别更改为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")
}
}
您是在使用故事板还是以编程方式实例化它?我正在使用故事板。我还想编写一些方法。我知道我可以使用扩展,但它最适合我的需要,只是创建一个单独的类。编译器不再抱怨了,但每当我启动应用程序时,它就会崩溃。它标记fatalError(“init(coder:)”尚未实现)行。我正在将CustomTextField类分配给我的故事板中的UITextField。顺便说一句,谢谢您也需要传递框架,我更新代码以修复它。因为我正在使用故事板,我希望保持我的UITextField的大小。这可以实现吗?如果您使用的是storyboard,您不需要自定义初始值设定项,您只需要重写超级初始化项来启动变量,我会为您更新代码如果您使用的是storyboard,您必须重写
init(coder:)
,由于这是故事板使用的初始化器,如果我想保留故事板中的框架,使其“大小”不变,该怎么办?我只想添加一些自定义项,例如边框颜色和字体类型,也可以添加一个图像,但我希望其他所有内容都默认从超类的init继承。这能实现吗?谢谢如果您正在使用故事板,请编辑答案。它会显示println消息,但不会更改cornerRadius或颜色。。。你知道为什么吗?将borderWidth更改为1.0,它应该会改变。我正在这样做(我在某个地方读到,在更改拐角半径之前,你必须设置边界宽度),这不是问题所在。在我的viewDidLoad方法中,我重置了颜色和所有内容(我删除了那里的功能,它工作了)。这就引出了我的最后一个问题。这意味着awakeFromNib()在viewDidLoad之前执行,对吗?它是启动屏幕退出视图堆栈后加载的第一个方法吗?非常感谢你的帮助!