说我希望init
UIView
子类与String
和Int
。
如果我只是对UIView
进行子类化,我将如何在Swift中执行此操作?如果我只是创建一个自定义init()
函数,但参数是一个字符串和一个Int,它告诉我在从初始化程序"返回之前没有调用" super.init()。 / p>
如果我致电super.init()
,我告诉我必须使用指定的初始化程序。我应该在那里使用什么?框架版本?编码器版本?都?为什么呢?
答案 0 :(得分:171)
init(frame:)
版本是默认初始值设定项。您必须在初始化实例变量后调用它。如果正在从Nib重构此视图,则不会调用您的自定义初始值设定项,而是调用init?(coder:)
版本。由于Swift现在需要实现所需的init?(coder:)
,因此我更新了下面的示例并将let
变量声明更改为var
和可选。在这种情况下,您可以在awakeFromNib()
或稍后的某个时间初始化它们。
class TestView : UIView {
var s: String?
var i: Int?
init(s: String, i: Int) {
self.s = s
self.i = i
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
答案 1 :(得分:18)
我为指定和必需创建一个公共init。为方便起见,我将init(frame:)
委托给零帧。
拥有零帧不是问题,因为通常视图位于ViewController的视图中;当您的超级视图调用layoutSubviews()
或updateConstraints()
时,您的自定义视图将有一个安全的机会来布局其子视图。系统在整个视图层次结构中以递归方式调用这两个函数。您可以使用updateContstraints()
或layoutSubviews()
。首先调用updateContstraints()
,然后调用layoutSubviews()
。在updateConstraints()
中,请务必调用超级最后。在layoutSubviews()
中,首先调用超级 。
这就是我的所作所为:
@IBDesignable
class MyView: UIView {
convenience init(args: Whatever) {
self.init(frame: CGRect.zero)
//assign custom vars
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
commonInit()
}
private func commonInit() {
//custom initialization
}
override func updateConstraints() {
//set subview constraints here
super.updateConstraints()
}
override func layoutSubviews() {
super.layoutSubviews()
//manually set subview frames here
}
}
答案 2 :(得分:17)
以下是我在Swift的iOS 9上的表现 -
import UIKit
class CustomView : UIView {
init() {
super.init(frame: UIScreen.mainScreen().bounds);
//for debug validation
self.backgroundColor = UIColor.blueColor();
print("My Custom Init");
return;
}
required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented"); }
}
这是一个完整的项目,例如:
答案 3 :(得分:9)
以下是我在Swift中使用iOS进行Subview的方法 -
class CustomSubview : UIView {
init() {
super.init(frame: UIScreen.mainScreen().bounds);
let windowHeight : CGFloat = 150;
let windowWidth : CGFloat = 360;
self.backgroundColor = UIColor.whiteColor();
self.frame = CGRectMake(0, 0, windowWidth, windowHeight);
self.center = CGPoint(x: UIScreen.mainScreen().bounds.width/2, y: 375);
//for debug validation
self.backgroundColor = UIColor.grayColor();
print("My Custom Init");
return;
}
required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented"); }
}
答案 4 :(得分:4)
您可以尝试在XCode 11上运行Swift 5的这种实现方式
class CustomView: UIView {
var customParam: customType
var container = UIView()
required init(customParamArg: customType) {
self.customParam = customParamArg
super.init(frame: .zero)
// Setting up the view can be done here
setupView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupView() {
// Can do the setup of the view, including adding subviews
setupConstraints()
}
func setupConstraints() {
// setup custom constraints as you wish
}
}