如何将值从 XIB 传递到 UIView 初始化程序?

Posted

技术标签:

【中文标题】如何将值从 XIB 传递到 UIView 初始化程序?【英文标题】:How do I pass values into a UIView initializer from a XIB? 【发布时间】:2019-01-31 00:01:31 【问题描述】:

我制作了一个带有一些网点的自定义 UIView XIB 文件。我希望能够从我的代码中的其他地方以编程方式加载它。我在 xib 中使用自动布局。我的问题是我需要使用参数值对其进行初始化以满足委托方法。我不确定如何在初始化期间传递参数。我也不太了解整个 init(frame:) vs init(coder:) 以及便利的 init 在这里如何工作。有什么建议吗?

背景:目前整个视图在 Obj-C 中是编程的,我正在用 swift 将它移植到 XIB。

【问题讨论】:

【参考方案1】:

有很多不同的方式来处理视图的初始化。您可以创建一个为您完成所有工作的静态函数。这是避免重写 init 方法的一种方法。

class TestView: UIView 
    var delegate: Any!

    static func instantiate(with delegate: Any) -> TestView 
        let nib = UINib(nibName: "TestView", bundle: nil)
        guard let testView = nib.instantiate(withOwner: nil)[0] as? TestView else 
            fatalError("Attempted to create TestView, failed to find object")
        
        testView.delegate = delegate
        return testView
    

然后您执行以下操作来创建您的视图

let testView = TestView.instantiate(with:mydelegate)

【讨论】:

【参考方案2】:

我的解决方案。为我工作!

import Foundation
import UIKit


class NotFoundView: UIView 

    @IBOutlet var contentView: UIView!
    @IBOutlet var lblContentTitle: UILabel!

    override init(frame: CGRect) 
        super.init(frame: frame)
        customize()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        customize()
    

    private func customize() 
        print("customize")

        Bundle.main.loadNibNamed("NotFoundView", owner: self, options: nil)
               addSubview(contentView)
               contentView.frame = self.bounds
               contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    


let notFoundView = NotFoundView()
notFoundView.lblContentTitle.text = "Not found. Please try again..."

return notFoundView

【讨论】:

以上是关于如何将值从 XIB 传递到 UIView 初始化程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从 tableview 传递到 collectionview

如何将值从 javascript 函数传递到 django 视图

如何将值从片段/活动传递到 xml?

如何将值从基本适配器传递到 Android 中的 Activity

如何将值从一个活动传递到上一个活动

如何将值从动态列表视图传递到活动?