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需要明确地完成。我同意。甚至不要尝试克隆/深度复制视图层次结构,这不是一种方法。从视图中提取需要更改的参数,并单独对这些参数编写一些版本控制代码。