最近自定义一个textview,实例化的时候报错,自定义实例化怎么改都是错,因为使用super.init(),这个方法在父类UITextView中是不存在的,应该调用系统原有的super.init(frame: frame , textContainer: textContainer),可是这个textcontainer无从传来,需要再实例化一个设置,然后研究了下swift的实例化,用便利构造方法实现,便不需要实例这个参数,现在总结如下:
swift的构造方法与oc不同,多了一个便利构造方法,相同的是自定义构造方法和系统原有的构造方法,都要super调用父类原有的构造方法。
1.便利的构造方法
上图是自定义textview的便利的构造方法示例,需要实现self.init()或self.init(frame:frame),如果是self.init()无参数,则实例化出来的是没有大小的,需要调用完实例化方法后另设frame,一般会使用self.init(frame:frame)
使用self.init()外部调用
let textV = FDSEmoticonTextView(placeHolde: "输入新鲜事",frame:CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height*0.5))
textV.delegate = self
textV.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height*0.5)
使用self.init(frame:frame)外部调用
let textV = FDSEmoticonTextView(placeHolde: "输入新鲜事",frame:CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height*0.5))
textV.delegate = self
总结:便利构造函数可以自定义参数,实现中需要用self调用构造方法带有参数frame或者无参数(),并需要复写系统已有的override构造方法,在self调用后进行设置或属性赋值,使用场景:构造时做特别设置,多用于自定义UI控件,可以写多个,定制多个样式的实例
2.系统原有的构造方法
总结:使用系统自带的构造方法,参数不可变,需要用super调用系统已有的构造方法,在外部调用的时候可以只传frame,或者什么也不传直接FDSEmoticonTextView(),使用场景:构造时不需要特别设置,多在自定义cell、view中使用,只有一种样式。
3.自定义构造方法,以UIView为例,参数是一个闭包,在调用super前给属性赋值
总结:自定义构造方法可以自定义参数,需要用super调用系统已有的构造方法,外部调用有什么参数传什么参数。在super调用前给属性赋值。使用:需要做特别设置,多在NSobject(模型)或自定义view中使用,可以写多个,定制多种样式的实例。