使用输入参数初始化 xib

Posted

技术标签:

【中文标题】使用输入参数初始化 xib【英文标题】:Initializing a xib with input parameters 【发布时间】:2018-08-01 11:49:40 【问题描述】:

我正在尝试做一个简单的控件来模拟我可以在 xcode 界面设计器中使用的“android 选项卡”。

所以我做了一个简单的 XIB,它有几个界面对象(滚动、堆栈、uiview...),并给了他一个名为“TabsCustomControl”的类

我现在的问题是知道我应该如何设置/初始化这个 xib/UIView 类。

在我看来,在 xib/自定义 UIView 初始化时将参数传递给它是有道理的,这样它就可以根据选项卡的数量知道选项卡应该具有哪些尺寸/颜色/图像。

但我一跑

let tabsCustomControl = Bundle.main.loadNibNamed("TabsCustomControl", owner: self, options: nil)!.first as! TabsCustomControl

我没有机会配置它

tabsCustomControl.tabs = ["first tab"]

它运行初始化...但我仍然没有使用选项卡列表 [String] 定义属性,所以现在发生的情况是代码在没有任何关于选项卡的信息的情况下运行。

@IBInspectable var tabs : [String] = []

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


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


private func setup()
       
     // THIS IS Empty, so loop is not running
    for _ in tabs 

        let newTab = UIButton()
        newTab.backgroundColor = UIColor.green
        newTab.setTitle("Test", for: .normal)

        horizontalStackView.addArrangedSubview(newTab)
    

我可以通过在类初始化和参数设置后运行 setup() 函数来解决这个问题,但这似乎很糟糕,因为我会在很多地方使用它......我每次都会调用 .setup()在我创建 xib 之后

我应该使用什么方法?

【问题讨论】:

是的,除了创建 nib/view 控制器然后在其上设置属性之外,您无能为力。如果它达到了您需要在 init 方法中设置属性的地步,那么您总是可以远离 nib 并在代码中创建它。还是什么? “我可以在 xcode 界面设计器中使用” ...您的意思是要使用 @IBDesignable 以便在情节提要布局期间看到“标签”吗? @DonMag 是的,就是这样 @JoãoSerra - 好的,看看这个答案......应该是你想要的:***.com/a/43078869/6257435 【参考方案1】:

也许在 didSet 中运行设置

@IBInspectable var tabs : [String] = [] 
    didSet 
        setup()
    

这意味着您必须确保在启动 VC 后设置选项卡

【讨论】:

以上是关于使用输入参数初始化 xib的主要内容,如果未能解决你的问题,请参考以下文章

swift3 xib自定义view

尽管已正确初始化,XIB 视图仍不显示任何内容

没有 xib 文件的 alloc/init 初始化视图控制器不调用 viewDidUnload

根据应用程序运行的设备,从不同的 xib 初始化 rootViewController

从xib初始化的UIView如何继承?

在带有 XIB 的视图控制器上以编程方式初始化 UISegmentedControl