Ios Swift-初始化UIView的子类

Ios Swift-初始化UIView的子类,ios,uiview,swift,Ios,Uiview,Swift,我有一个已经设置好的视图,希望将其包装在UIView的子类中 class ElementView: UIView { var selected = false } 问题是,我无法使用现有的视图初始化元素视图。 Swift也不允许分配给self init(view: UIView) { //here I would have to call super.init(coder: NSCoder?) or super.init(frame: CGRect) //none of

我有一个已经设置好的视图,希望将其包装在
UIView
的子类中

class ElementView: UIView {
    var selected = false
}
问题是,我无法使用现有的
视图
初始化
元素视图
。 Swift也不允许分配给self

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实现一个自定义包装器,它应该包含状态信息(这也是一个问题)。这就是我问这个问题的原因…

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

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


如果您试图克隆或复制给定视图,请参阅

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

请记住,如果您要创建任何变量,那么在创建实例时,它们必须不是
nil
,因此在变量声明中,您必须创建一些初始参数(例如-0表示
Int
,等等),以便初始值设定项工作。下面是示例代码:

var variableOne: Int = 0
var variableTwo: Int = 0

init(variableOne: Int, variableTwo: Int) {
    self.variableOne = variableOne
    self.variableTwo = variableTwo
    super.init(frame: CGRectZero)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

为什么不
super.init(frame:view.frame.bounds)
?(可能是
view.bounds
,我记不起来了。我仍然不清楚您要做什么。为什么不能使用super.init(frame:)?您是否试图将self(ElementView)指定为等于view(参数)?super.init(frame:)仅初始化框架,但不初始化其他一些重要的UIView属性,例如子视图。我不尝试分配给self,因为在Swift中这是不可能的,我想从UIView超类调用一些指定的初始化器,该初始化器将完全初始化ElementView,然后只初始化所选的属性,该属性不会被删除en需要明确地完成。我同意。甚至不要尝试克隆/深度复制视图层次结构,这不是一种方法。从视图中提取需要更改的参数,并单独对这些参数编写一些版本控制代码。