实例化 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 中初始化,或者它指的是 UINibUIStoryboard ?

要解决此问题,请尝试在自定义 UIView 中初始化子元素。

我自己找到了解决办法:

  1. 转到您的 xib 文件,在文件的所有者部分中,在 View1 上设置自定义 class;根据视图部分,将自定义 class 设置为 UIView;
  2. 在你的 class View1: UIView 中从你的 xib 文件添加一个 view outlet 即:
@IBOutlet var view: UIView!
  1. 将此粘贴到您的 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
    }

  1. 现在创建另一个 xib 文件,确保它的文件所有者是 KeyboardViewController。向其添加一个 UIView 并确保其 class 类型为 View1.

  2. 现在转到 class KeyboardViewController: UIInputViewController 和 link 代码中类型为 View1 的视图。在它下面写 weak var v : View1!

  3. viewDidLoad()中你最终可以写成view = View1()

大功告成!