我有一个已经设置好的视图,想要将它包装在UIView
。
class ElementView: UIView {
var selected = false
}
问题是我无法使用现有的ElementView
初始化view
。
Swift也不允许分配给自己。
init(view: UIView) {
//here I would have to call super.init(coder: NSCoder?) or super.init(frame: CGRect)
//none of which actually properly initializes the object
}
任何想法如何实现? 谢谢:))
澄清:
我会给你更大的背景,希望它更清楚:
我正在实现一个UIScrollView子类。滚动视图包含一个UIView对象数组,这些对象是从外部添加的(来自类的用户)。 在我的自定义UIScrollView类中,我想为每个对象实现一个轻击手势识别器。那已经完成了:
let singleTap = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
singleTap.cancelsTouchesInView = false
addGestureRecognizer(singleTap)
和处理程序:
func handleTap(recognizer: UITapGestureRecognizer) {
//some code to handle the tap
}
当我想要处理点击时出现问题,我想存储视图的先前状态(之前是否点击过),以便在点击发生时切换该状态。我想根据其状态对UIView做不同的事情。
recognizer.view返回识别器附加到的视图,这就是我需要的。但是,这样我就不可能为UIView实现一个状态。
这就是为什么我想为UIView实现一个自定义包装器,它应该包含状态信息(这也是一个问题)。这就是我提出这个问题的方式......
答案 0 :(得分:2)
为了为UIView子类创建自定义init,您必须为UIView超类调用所需的init。此外,在创建自定义init时,您必须将视图的Frame
发送到超类。满足这些要求后,您可以自由地将任何参数传递给新创建的init
,包括点击识别器信息。
请记住,如果要创建任何变量 - 在创建实例时它们必须不是nil
,因此在变量声明中,您必须创建一些初始参数(例如 - {{1}为0 },等)初始化程序工作。以下是示例代码:
Int
答案 1 :(得分:1)
听起来你正试图模仿一个复制构造函数,听起来你正试图在IB中构建它。简短的回答是你正在做的事情没有意义。它听起来更像是你希望上面的代码拥有或承担参数视图的身份(你无法分配给自己的引用)。如果这个假设是正确的,那么你的代码就更没意义了 - 你只需要分配一个变量。
只需创建视图类,使用您发布的代码,您就不需要实现构造函数,因为您已为所选变量提供了默认值。然后通过基于编码器的构造函数从IB填充您的意愿。
如果您尝试克隆或复制给定视图,请参阅"Can UIView be copied"