实例化 class 并使用属性会使应用程序崩溃
Instantiating a class and using properties makes app crash
我正在构建键盘扩展。
在我的程序中,我有一个视图控制器(1)和一个视图(2)class,我将其用于 xib 文件。
1)
class KeyboardViewController: UIInputViewController {
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "view1", bundle: nil)
let objects = nib.instantiate(withOwner: self, options: nil)
view = objects[0] as? UIView
}
class View1: UIView {
@IBOutlet weak var someLabel: UILabel!
@IBOutlet weak var someButton: UIButton!
}
我想在我的视图控制器中实例化视图 class 所以,按照苹果的文档我这样做了:
class KeyboardViewController: UIInputViewController {
let v1 = View1()
let v2 = View2()
}
问题是,每当我尝试在我的视图内部调用时,都会加载如下内容:
v1.someLabel.text = "something"
我 运行 我的应用程序由于某些原因无法运行并最终崩溃。
重要事项:视图连接到两个不同的 .xib 文件,我正在处理自定义键盘扩展。
我确定我在实例化中遗漏了一些东西,但我找不到它是什么,我看到 git 集线器上的其他开发人员做的和我做的完全一样,但 运行宁他们的应用程序没有问题......那么我错过了什么?如果可以的话,请给我发送更多关于它的文档...
编辑:
在我看来 classes 我正在执行以下操作来初始化它们:
class View1: UIView {
@IBOutlet weak var someLabel: UILabel!
@IBOutlet weak var someButton: UIButton!
init(label: UILabel, button: UIButton) {
self.someLabel = label
self.someButton = button
super.init(frame: CGRect(x: 0, y: 0, width: 330, height: 200))
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
但是在我的主视图控制器中,当我调用 let v1 = View1()
时,它变成:
let v1 = View1(coder: NSCoder)
而且我很难弄清楚要在参数字段中输入什么
如果它崩溃了,我认为你的 View1
中的 UITextField
是空的。该字段在您的 class 中初始化,或者它指的是 UINib
或 UIStoryboard
?
要解决此问题,请尝试在自定义 UIView
中初始化子元素。
我自己找到了解决办法:
- 转到您的 xib 文件,在文件的所有者部分中,在 View1 上设置自定义 class;根据视图部分,将自定义 class 设置为 UIView;
- 在你的
class View1: UIView
中从你的 xib 文件添加一个 view outlet 即:
@IBOutlet var view: UIView!
- 将此粘贴到您的
class View1: UIView
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit(){
Bundle.main.loadNibNamed("view1", owner: self, options: nil)
addSubview(view)
view.frame = self.bounds
view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
//Add any other setup here
}
现在创建另一个 xib 文件,确保它的文件所有者是 KeyboardViewController
。向其添加一个 UIView 并确保其 class 类型为 View1.
现在转到 class KeyboardViewController: UIInputViewController
和 link 代码中类型为 View1 的视图。在它下面写 weak var v : View1!
在viewDidLoad()
中你最终可以写成view = View1()
大功告成!
我正在构建键盘扩展。
在我的程序中,我有一个视图控制器(1)和一个视图(2)class,我将其用于 xib 文件。
1)
class KeyboardViewController: UIInputViewController {
override func viewDidLoad() {
super.viewDidLoad()
let nib = UINib(nibName: "view1", bundle: nil)
let objects = nib.instantiate(withOwner: self, options: nil)
view = objects[0] as? UIView
}
class View1: UIView {
@IBOutlet weak var someLabel: UILabel!
@IBOutlet weak var someButton: UIButton!
}
我想在我的视图控制器中实例化视图 class 所以,按照苹果的文档我这样做了:
class KeyboardViewController: UIInputViewController {
let v1 = View1()
let v2 = View2()
}
问题是,每当我尝试在我的视图内部调用时,都会加载如下内容:
v1.someLabel.text = "something"
我 运行 我的应用程序由于某些原因无法运行并最终崩溃。
重要事项:视图连接到两个不同的 .xib 文件,我正在处理自定义键盘扩展。
我确定我在实例化中遗漏了一些东西,但我找不到它是什么,我看到 git 集线器上的其他开发人员做的和我做的完全一样,但 运行宁他们的应用程序没有问题......那么我错过了什么?如果可以的话,请给我发送更多关于它的文档...
编辑:
在我看来 classes 我正在执行以下操作来初始化它们:
class View1: UIView {
@IBOutlet weak var someLabel: UILabel!
@IBOutlet weak var someButton: UIButton!
init(label: UILabel, button: UIButton) {
self.someLabel = label
self.someButton = button
super.init(frame: CGRect(x: 0, y: 0, width: 330, height: 200))
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
但是在我的主视图控制器中,当我调用 let v1 = View1()
时,它变成:
let v1 = View1(coder: NSCoder)
而且我很难弄清楚要在参数字段中输入什么
如果它崩溃了,我认为你的 View1
中的 UITextField
是空的。该字段在您的 class 中初始化,或者它指的是 UINib
或 UIStoryboard
?
要解决此问题,请尝试在自定义 UIView
中初始化子元素。
我自己找到了解决办法:
- 转到您的 xib 文件,在文件的所有者部分中,在 View1 上设置自定义 class;根据视图部分,将自定义 class 设置为 UIView;
- 在你的
class View1: UIView
中从你的 xib 文件添加一个 view outlet 即:
@IBOutlet var view: UIView!
- 将此粘贴到您的
class View1: UIView
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit(){
Bundle.main.loadNibNamed("view1", owner: self, options: nil)
addSubview(view)
view.frame = self.bounds
view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
//Add any other setup here
}
现在创建另一个 xib 文件,确保它的文件所有者是
KeyboardViewController
。向其添加一个 UIView 并确保其 class 类型为 View1.现在转到 class
KeyboardViewController: UIInputViewController
和 link 代码中类型为 View1 的视图。在它下面写weak var v : View1!
在
viewDidLoad()
中你最终可以写成view = View1()
大功告成!