如何使用 swift 正确处理笔尖?

How to properly work with nibs using swift?

我有几个关于笔尖的问题。

  1. 如何动态或以编程方式将笔尖加载到视图控制器中的 UIView 上? 我知道您可以通过在此处输入笔尖的 swift class 来添加笔尖的自定义 class:

Custom Class

我正在寻找的是如何更改该属性,例如在按下按钮时我想删除它或添加它。我尝试实例化 swift 文件,但我无法将其关闭。我还尝试更改 .xib 文件的所有者,但它只需要一个 UIView,所以我不能让我的视图控制器成为它的所有者。我尝试使用

view.addSubiew(view: UIView)

但我不知道如何将我的 Nib 文件正确实例化为 UIView。它一直要求一个 NSCoder,我也不知道如何实例化一个。如果有人能告诉我如何添加和删除会有帮助的自定义 class,那将会有所帮助。

  1. 如何将数据从我的视图控制器传递到笔尖?

  2. 笔尖完全加载后,我如何 运行 发挥作用?这是 .xib 文件的代码 swift class.

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)    
        if (self.subviews.count == 0) {
            guard let view = loadViewFromNib() else {return}
            view.frame = self.bounds
            self.addSubview(view)
            mainView = view
            -> btn.layer.cornerRadius = 5
        }
    }
    
    private func loadViewFromNib() -> UIView? {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: "NibFile", bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
    }
    

这可以很好地加载视图,但是每当我尝试 运行 代码块中的任何其他内容时,例如标记的位置(我想在加载视图后更改按钮的角半径),我一直得到一个零 IBOutlet。它只是一直说按钮是零。在哪里添加这个功能?

我也试过这样做:

override func awakeFromNib() {
    btnLogin.layer.cornerRadius = 5
}

仍然是零,我在这里感到困惑,研究走到了死胡同,或者只是我不需要的东西。任何帮助将不胜感激。谢谢!

所以我做了很多测试并想出了这些:

  1. 如何动态或以编程方式将笔尖加载到视图控制器中的 UIView 上?

我删除了所需的初始化?从 nib 函数并在视图控制器中初始化它。基本上我移动了从所需的 init 加载 nib 文件的代码?功能到我想加载它的任何地方,比如某个视图控制器上的按钮按下事件。我只是添加这个:

func loadView(nibName: String, uiview: UIView) {
    let view: UIView = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)?[0] as! UIView
    view.frame = uiview.bounds
    view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    uiview.addSubview(view)
}

uiview 是我要添加笔尖的视图。

  1. 如何将数据从我的视图控制器传递到笔尖?

我在 nib 中调用一个函数并将数据作为 parameter/s 传递。

  1. 笔尖完全加载后,我如何 运行 发挥作用?

如果我按照我在第一个问题中所做的那样做,那么我就可以 运行

中的任何函数
override func awakeFromNib() {
}

一旦加载笔尖,它就会 运行。