【发布时间】:2014-06-29 14:38:36
【问题描述】:
子类化 UITextView(和 UICollectionView)的问题是指定的构造函数是“initWithFrame”。但在现实生活中,当它从 storyboard 加载时,会调用 initWithCoder。
class BorderedTextView: UITextView {
//will be called
init(coder: NSCoder?){
//constant values here is not an option
super.init(frame: CGRectMake(0,0,100,100), textContainer: nil)
}
//will not be called
init(frame: CGRect, textContainer: NSTextContainer!) {
super.init(frame: frame, textContainer: textContainer)
}
}
因此,我无法在 init 上调用任何 UI 自定义代码并为 Swift 变量提供任何初始化值,但默认值除外。
我想这个问题可以通过从“coder”中提取帧大小来临时解决,但是我没有找到它的关键。
有什么比硬编码帧值更好的想法吗?
【问题讨论】:
-
我希望
super.init(coder: coder)可以工作——并且对于 UIView 或 UILabel 的子类它可以(至少编译器不会抱怨)。但是对于UITextView的子类,它会失败并显示错误消息“必须调用指定的初始化程序...”。一个 Swift 错误? -
一种可能的解决方法是在
awakeFromNib中进行初始化。 -
没错,看起来它适用于 UIView(我更新了问题)。但是我对 UICollectionView 也有同样的问题,所以问题不仅在于 UITextView。
-
不同之处似乎在于 UITextView 和 UICollectionView 都有自己的“自己的”指定初始化程序(与例如 UILabel 相比)。我仍然认为这是一个 Swift 错误(应该向 Apple 报告),因为相同的模式在 Objective-C 中也适用。
-
提交给苹果。感谢
awakeFromNib的解决方法,它完全符合我目前的要求。
标签: ios uiview uitextview swift