【问题标题】:Swift custom control is not showing when being used in view controller (code attached)在视图控制器中使用时未显示 Swift 自定义控件(附加代码)
【发布时间】:2026-02-17 20:05:02
【问题描述】:

当我尝试在主视图控制器中使用此自定义控件时,通过将 UIView 拖到 IB 中的屏幕并将其设置为“CustomerControlView”,它实际上并没有显示它。

问题 - 我这里的代码有什么问题?

背景 - 所以想要基本上: a) 在 IB 中设计一个客户控制 b) 所以我假设我创建了 NIB 文件,然后创建了一个 UIView 文件,所以这就是我所做的

NIB 和 swift 文件的屏幕截图

代码

import UIKit

class CustomControlView: UIView {

//    @IBOutlet var icon: UIImageView!
//    @IBOutlet weak var view: UIView!

    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var text1: UITextField!
    @IBOutlet weak var text2: UITextField!

    override init(frame: CGRect) {
        print("override init(frame: CGRect) ")
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        print("required init?(coder aDecoder: NSCoder)")
        super.init(coder: aDecoder)

//        let arr = NSBundle.mainBundle().loadNibNamed("CustomControlView", owner: nil, options: nil)
//        let v = arr[0] as! UIView
//        self.view.addSubview(v)
    }


}

显示我如何将自定义视图包含到我的主 viewController 视图中的快照:

【问题讨论】:

    标签: ios swift interface-builder custom-controls loadnibnamed


    【解决方案1】:

    只需在 class 行上方添加 @IBDesignable 以告诉 Xcode 在将其显示在故事板中之前对其进行编译。这里有关于这个主题的精彩讨论:http://nshipster.com/ibinspectable-ibdesignable/

    此外,您需要确保正在加载 NIB:

    override init(frame: CGRect) {
        print("override init(frame: CGRect) ")
        super.init(frame: frame)
        xibSetup()
    }
    
    required init?(coder aDecoder: NSCoder) {
        print("required init?(coder aDecoder: NSCoder)")
        super.init(coder: aDecoder)
    
        xibSetup()
    
    }
    
    
    func xibSetup() {
        view = loadViewFromNib()
        view.frame = bounds
        view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        addSubview(view)
    }
    
    func loadViewFromNib() -> UIView {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: "CustomNumberPad", bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
        return view
    }
    

    【讨论】:

    • 谢谢 - 目前无法对此进行测试,但我想指出,当我运行项目本身时它不会显示控件(即不仅仅是“在 IB 中显示”问题)。这有意义吗?
    • @Milka - 这给出了一个错误 EXC_BAD_ACCESS 错误,代码重复调用“必需的 init?(coder aDecoder: NSCoder)”方法,因为我在控制台中看到了打印输出。知道如何纠正这个问题吗?
    • 我在这里找到“blog.boxuanzhang.me/custom-reusable-uiview-with-xib”,可以通过在 xibSetup 中添加“if self.subview.count == 0 {”来解决问题。想知道有没有更好的方法?
    • 实际上刚刚发布了一个单独的问题,这里有没有更好的方法:*.com/questions/32877816/…
    • 抱歉昨晚睡着了...我有许多项目和控件的完全相同的代码,从未遇到过这个循环问题...让我们尝试解决它:(1)你添加了@ 987654326@? (2) 你是如何使用控件的?