Swift - 初始化UIView的子类

时间:2014-07-24 00:31:02

标签: ios uiview swift

我有一个已经设置好的视图,想要将它包装在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实现一个自定义包装器,它应该包含状态信息(这也是一个问题)。这就是我提出这个问题的方式......

2 个答案:

答案 0 :(得分:2)

为了为UIView子类创建自定义init,您必须为UIView超类调用所需的init。此外,在创建自定义init时,您必须将视图的Frame发送到超类。满足这些要求后,您可以自由地将任何参数传递给新创建的init,包括点击识别器信息。

请记住,如果要创建任何变量 - 在创建实例时它们必须不是nil,因此在变量声明中,您必须创建一些初始参数(例如 - {{1}为0 },等)初始化程序工作。以下是示例代码:

Int

答案 1 :(得分:1)

听起来你正试图模仿一个复制构造函数,听起来你正试图在IB中构建它。简短的回答是你正在做的事情没有意义。它听起来更像是你希望上面的代码拥有或承担参数视图的身份(你无法分配给自己的引用)。如果这个假设是正确的,那么你的代码就更没意义了 - 你只需要分配一个变量。

只需创建视图类,使用您发布的代码,您就不需要实现构造函数,因为您已为所选变量提供了默认值。然后通过基于编码器的构造函数从IB填充您的意愿。

如果您尝试克隆或复制给定视图,请参阅"Can UIView be copied"

相关问题